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