------- Comment #16 from rguenth at gcc dot gnu dot org 2010-02-13 10:23
-------
To optimize
void foo() {
extern int a;
if(++a) ++a;
}
we need to have partial dead store elimination, basically sink the store
to after the condition:
void bar() {
extern int a;
int tmp = a;
if (++tmp)
++tmp;
a = tmp;
}
bar:
movl a, %eax
pushl %ebp
movl %esp, %ebp
movl %eax, %edx
addl $1, %edx
je .L5
leal 2(%eax), %edx
.L5:
movl %edx, a
popl %ebp
ret
we'd then assemble this to similar code as the testcase from comment #2.
See also PR41490, though a working tree-ssa-sink would at most generate
void foobar() {
extern int a;
int tmp = a;
if (++tmp)
{
++tmp;
a = tmp;
}
else
a = tmp;
}
Still an improvement as we'd propagate zero to the second store:
foobar:
movl a, %eax
pushl %ebp
movl %esp, %ebp
cmpl $-1, %eax
jne .L9
movl $0, a
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L9:
addl $2, %eax
movl %eax, a
popl %ebp
ret
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |rguenth at gcc dot gnu dot
| |org
BugsThisDependsOn| |41490
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12395