Compile following function with options -Os -mthumb -march=armv5te:

int returnbool(int a, int b)
{
    if (a < b)
        return 1;
    return 0;
}

Gcc 4.5 generates:

        lsr     r3, r1, #31
        asr     r2, r0, #31
        cmp     r0, r1
        adc     r2, r2, r3
        mov     r0, r2
        mov     r3, #1
        eor     r0, r0, r3
        @ sp needed for prologue
        bx      lr

while gcc 4.3.1 generates:

        push    {lr}
        mov     r3, #1
        cmp     r0, r1
        blt     .L2
        mov     r3, #0
.L2:
        mov     r0, r3
        @ sp needed for prologue
        pop     {pc}

If we count instructions to do comparison only, they are 7 vs 4. I don't know
if it is faster to replace one branch instruction with 4 alu instructions. It
is definitely a regression for code size.

The long code sequence is generated by expand pass.


-- 
           Summary: code size explosion for integer comparison
           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=40741

Reply via email to