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

--- Comment #17 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-03-15 
11:24:13 UTC ---
(In reply to comment #16)
> 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

It now does this (for 4.7).

Reply via email to