[Bug tree-optimization/107569] [13 Regression] Failure to optimize std::isfinite since r13-3596
amacleod at redhat dot com
gcc-bugzilla@gcc.gnu.org
Tue Nov 8 14:46:27 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107569
--- Comment #3 from Andrew Macleod <amacleod at redhat dot com> ---
(In reply to Jakub Jelinek from comment #2)
> Perhaps we should in vrp1 defer removal of __builtin_unreachable (), at least
> the cases where we don't turn that into some useful range?
> That of course doesn't improve the assume attribute case.
well we do improve it tho. in vrp1:
Global Exported: _5 = [frange] double [0.0 (0x0.0p+0), +Inf] +NAN
Global Exported (via unreachable): _9 = [frange] double [-0.0 (-0x0.0p+0),
+Inf] +-NAN
Removing basic block 3
Merging blocks 2 and 4
double mag (const struct TVec & u)
{
double _3;
double _5;
double _6;
double _7;
double _8;
double _9;
<bb 2> [local count: 1073741824]:
_3 = u_2(D)->x;
_6 = _3 * _3;
_7 = u_2(D)->y;
_8 = _7 * _7;
_9 = _6 + _8;
_5 = sqrt (_9);
return _5;
The problem appears to be that the cdce pass runs afterwards, and introduces:
_3 = u_2(D)->x;
_6 = _3 * _3;
_7 = u_2(D)->y;
_8 = _7 * _7;
_9 = _6 + _8;
DCE_COND_LB.7_10 = _9;
DCE_COND_LB_TEST.8_11 = DCE_COND_LB.7_10 u>= 0.0;
if (DCE_COND_LB_TEST.8_11 != 0)
goto <bb 5>; [99.95%]
else
goto <bb 4>; [0.05%]
<bb 5> [local count: 1073204960]:
_5 = .SQRT (_9);
goto <bb 3>; [100.00%]
<bb 4> [local count: 536864]:
_12 = sqrt (_9);
without checking the there is a global range for _9 which is [frange] double
[-0.0 (-0x0.0p+0), +Inf] +-NAN
now, does that Nan cause u>= 0 not to be true? I notice we don't fold that in
vrp2. I will let aldy pitch in on the rest of this.
More information about the Gcc-bugs
mailing list