https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65217
Richard Biener rguenth at gcc dot gnu.org changed:
What|Removed |Added
Keywords||missed-optimization, xfail
Status|RESOLVED|REOPENED
Last reconfirmed||2015-04-27
CC||law at gcc dot gnu.org,
||rguenth at gcc dot gnu.org
Component|c |tree-optimization
Resolution|FIXED |---
Ever confirmed|0 |1
--- Comment #3 from Richard Biener rguenth at gcc dot gnu.org ---
It was only fixed by luck due to us folding all stmts in forwprop which turns
if (_3 != n_1(D))
into the canonical
if (n_1(D) != _3)
and then DOM recording the proper equality via record_equality by _always_
swapping operands due to
else if (is_gimple_min_invariant (x)
/* ??? When threading over backedges the following is important
for correctness. See PR61757. */
|| (loop_depth_of_name (x) = loop_depth_of_name (y)))
and its '==' part.
For non-canonical order (in GCC 4.9 and earlier) that swapping turned it into
the unfortunate direction.
That equality decides whether we propagate _3 into the return value on the
else branch (where n_1(D) == _3) or leave it as n_1(D) (good for this case).
I am about to commit a patch that does not perform this kind of random swapping
(and will XFAIL the testcase).