This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/65217] __builtin_unreachable in if statement causes bad assembly generation
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 27 Apr 2015 11:08:52 +0000
- Subject: [Bug tree-optimization/65217] __builtin_unreachable in if statement causes bad assembly generation
- Auto-submitted: auto-generated
- References: <bug-65217-4 at http dot gcc dot gnu dot org/bugzilla/>
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).