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