Compile the attached source code with options -Os -mthumb -march=armv5te, gcc
generates:

        push    {r3, r4, r5, lr}
.LCFI0:
        mov     r4, r0
        ldr     r0, [r0]
        bl      _Z3foof
        ldr     r1, [r4, #4]
        @ sp needed for prologue
        add     r5, r0, #0
        bl      _Z3barfi
        mov     r0, r5           // *
        bl      _Z3fffi          // *
        mov     r4, r5           // *
        mov     r5, r0           // *
        mov     r0, r4           // *
        bl      _Z3fffi          // *
        mov     r1, r0           // *
        mov     r0, r5           // *
        bl      _Z3setii
        pop     {r3, r4, r5, pc}

There is an obvious extra register move (mov r4, r5) in the marked section, a
better code sequence of the marked section could be:

        mov     r0, r5
        bl      _Z3fffi
        mov     r4, r0
        mov     r0, r5
        bl      _Z3fffi
        mov     r1, r0
        mov     r0, r4

The marked code sequence before scheduler is:

        mov     r4, r5
        mov     r0, r5
        bl      _Z3fffi
        mov     r5, r0
        mov     r0, r4
        bl      _Z3fffi
        mov     r1, r0
        mov     r0, r5

The instruction (mov r4, r5 ) is generated by register allocator. I don't know
why RA generates this instruction.


-- 
           Summary: extra register move
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: carrot at google dot com
 GCC build triplet: i686-linux
  GCC host triplet: i686-linux
GCC target triplet: arm-eabi


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

Reply via email to