http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55026



             Bug #: 55026

           Summary: [Multiple targets] Inefficient code with structs

                    passed by value

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: target

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: m...@mansr.com





Multiple targets (including ARM, HPPA, and MIPS) generate inefficient code in

functions taking struct arguments by value.  Consider this code:



struct foo {

    int a;

    int b;

};



int f(struct foo x)

{

    return x.a + x.b;

}



On ARM, this compiles to the following at -O3 optimisation:



f:

        @ args = 0, pretend = 0, frame = 8

        @ frame_needed = 0, uses_anonymous_args = 0

        @ link register save eliminated.

        sub     sp, sp, #8

        add     r3, sp, #8

        stmdb   r3, {r0, r1}

        ldmia   sp, {r0, r3}

        add     r0, r0, r3

        add     sp, sp, #8

        @ sp needed

        bx      lr



Note the entirely unnecessary (and inefficiently done to boot) storing and

loading of the argument registers to/from the stack.



The x86_64 and SH4 targets do not show this behaviour.

Reply via email to