The following code:

struct A
{
  int version;
  const char *name;
  void* group;
};
struct B
{
  const char *name;
  int ok;
};
void func(struct A*, int);

void test(struct B *p)
{
  struct A a;
  a.name = p->name;
  func(&a, p->ok);
}
options: --march=armv5te -mthumb -mthumb-interwork -fpic -Os

is compiled to 18 bytes by GCC 4.2.1 and to 20 bytes by GCC 4.3 (and later,
including 4.4).

Bisection shows that it is changed by
http://gcc.gnu.org/viewcvs?view=rev&revision=118475:

GCC rev118474:
        push    {lr}
        sub     sp, sp, #20
        ldr     r3, [r0]
        ldr     r1, [r0, #4]
        add     r0, sp, #4
        str     r3, [sp, #8]
        bl      func
        add     sp, sp, #20
        @ sp needed for prologue
        pop     {pc}

GCC rev118475:

test:
        push    {lr}
        sub     sp, sp, #20
        add     r2, sp, #4 // this could be stored directly in r0
        ldr     r3, [r0]
        ldr     r1, [r0, #4]
        str     r3, [r2, #4]
        mov     r0, r2  // this mov can be eliminated
        bl      func
        add     sp, sp, #20
        @ sp needed for prologue
        pop     {pc}

A lot of CSE pass code was removed in this change, so there is no surprise that
CSE started to work worse after it.


-- 
           Summary: [4.3/4.4/4.5 regression] CSE doesn't work
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: alexvod at google dot com
 GCC build triplet: x86_64-unknown-linux-gnu
  GCC host triplet: x86_64-unknown-linux-gnu
GCC target triplet: arm-eabi


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

Reply via email to