[Bug target/40815] New: redundant neg instruction caused by loop-invariant

carrot at google dot com gcc-bugzilla@gcc.gnu.org
Tue Jul 21 07:15:00 GMT 2009


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

void bar(char*, char*, int);
void foo(char* left, char* rite, int element)
{
  while (left <= rite)
  {
    rite -= element;
    bar(left, rite, element);
    left += element;
  }
}

Gcc generates:

        push    {r3, r4, r5, r6, r7, lr}
        mov     r5, r0
        mov     r6, r1
        mov     r7, r2
        neg     r4, r2        // A
        b       .L2
.L3:
        add     r6, r6, r4    // B
        mov     r0, r5
        mov     r1, r6
        mov     r2, r7
        bl      bar
        add     r5, r5, r7
.L2:
        cmp     r5, r6
        bls     .L3
        @ sp needed for prologue
        pop     {r3, r4, r5, r6, r7, pc}

Note that instruction A computes (r4 = -r2), and r4 is only used by instruction
B (r6 = r6 + r4), this can be simplified to (r6 = r6 - r7,  r7 contains the
original r2). Thus we can reduce one instruction.

Expression rite -= element was transformed to the following by the gimplify
pass

    element.0 = (unsigned int) element;
    D.2003 = -element.0;
    rite = rite + D.2003;

This form was kept until pass neg.c.156r.loop2_invariant. Then the expression
-element was identified as loop invariant and hoisted out of the loop. So
caused the current result.

Is the transform of gimplify intended? Do we have any chance to merge the
previous expressions back to (rite = rite - element) before loop invariant
pass?


-- 
           Summary: redundant neg instruction caused by loop-invariant
           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=40815



More information about the Gcc-bugs mailing list