------- Comment #10 from steven at gcc dot gnu dot org  2006-02-11 13:14 -------
This is, in fact, a rare case where RTL store motion does something useful. 
With "-O2 -fomit-frame-pointer -march=pentium4" we produce:

        movl    a, %eax
        addl    $1, %eax
        movl    %eax, a
        testl   %eax, %eax
        je      .L4
        addl    $1, %eax
        movl    %eax, a
.L4:
        ret

but with "-O2 -fomit-frame-pointer -march=pentium4 -fgcse-sm" we get:

foo:
        movl    a, %eax
        addl    $1, %eax
        je      .L5
        addl    $1, %eax
        movl    %eax, a
        ret
.L5:
        movl    $0, a
        ret

which is much closer to what we want to get to eventually.

Looking at the first snippet, we shouldn't really need GCSE store-motion for
this, because the store to a is not partially redundant.  It is fully redundant
and could be sunk if we had a generic hoisting pass that can lift and sink
code. The current implementation of code hoisting in GCSE can only lift code,
not sink it.


-- 


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

Reply via email to