https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78812

Jeffrey A. Law <law at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |law at redhat dot com

--- Comment #10 from Jeffrey A. Law <law at redhat dot com> ---
So EDGE_EH implies EDGE_ABNORMAL, so the patch in c#8 isn't going to have any
impact.  The real bug is more subtle.

prune_expressions walks the expression table looking for expressions that occur
in blocks with abnormal edges.  We then remove those expressions from
antic/transp.

The bug is it uses MEM_P.  Which is (of course) false if the given RTX has an
embedded MEM.  A good example would be:

(zero_extend:DI (mem/c:QI (plus:DI (reg/f:DI 34 %fp)
            (const_int -1 [0xffffffffffffffff])) [2 T.a+0 S1 A8]))

Since that's not a MEM_P, the expression isn't removed from antic/transp which
makes it subject to hoisting across the abnormal edge.

This could be easily fixed by walking into the ZERO/SIGN_EXTEND rtx, but there
may be other places where an embedded MEM might appear (hell, on a cisc machine
it would be just about anywhere).  So I want to do a bit of auditing of gcse.c.

Reply via email to