http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49847
--- Comment #25 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jeffrey A. Law from comment #24)
> This is a mess.
>
> As noted in the other comments, we're considering a cc0-setter as a
> potentially trapping insn. As a result the cc0-setter and cc0-consumer end
> up in different blocks.
>
> That's bad on so many levels and "fixing" it by hacking up fold_rtx like
> this just papers over the fundamental problem (though I must admit from a
> pragmatic standpoint, it's pretty effective).
>
> One could argue that the CFG building code could be tweaked so that a
> cc0-setter is never considered the end of a block. The downside of that is
> we're lying to the compiler about the true nature of the CFG. But that
> little white lie may be acceptable. I haven't looked into how ugly that
> would be to implement.
Well, it re-exposes the original problem of not properly handling EH
with -fnon-call-exception and trapping FP comparisons? I don't recall
all the issues with the original case I installed the change (at least
we do consider GIMPLE_CONDs as possibly trapping, just we don't allow
a possibly throwing condition in a GIMPLE_COND).
One fix for backends where cc0 setter and consumer
may not be separated is to duplicate the comparison like
<bb>
...
g >= 0.0; // stmt ending BB with EH edges
<bb>
if (g >= 0.0) // redundant compare, but with NOTHROW set
...
Or to revert the original change and think of a better fix.
But certainly you can't rely on the IL being
if (g >= 0.0)
instead of (what gimplification forces now)
bool tem = g >= 0.0;
<bb>
if (tem != 0)
because with -fnon-call-exceptions writing that literally in C++ and
compiling with -O0 will yield exactly the same issue as you hit it
now (separated cc0 setter / consumer).
So reverting wouldn't be a "real" fix. Testcase:
int foo (double x)
{
try {
bool cond = x >= 0.0;
if (cond)
return 1;
return 0;
}
catch (...)
{
return -1;
}
}
Where we shouldn't ICE when reverting the original fix and which at -O0
produces exactly the same "issue" you face now.
Best it into a runtime testcase that properly catches a trapping compare.
Richard.