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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-09-04
             Blocks|                            |85316
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  We have no value-range analysis for floating-point, plus
call-DCE emits an unordered >= while your test is using an ordered compare.

  <bb 2> [local count: 1073741824]:
  y_4 = x_3(D) * x_3(D);
  if (y_4 >= 0.0)
    goto <bb 3>; [26.75%]
  else
    goto <bb 6>; [73.25%]

  <bb 3> [local count: 287225938]:
  if (y_4 u>= 0.0)
    goto <bb 4>; [99.95%]
  else
    goto <bb 5>; [0.05%]

  <bb 4> [local count: 287082327]:
  _7 = .SQRT (y_4);
  goto <bb 6>; [100.00%]

  <bb 5> [local count: 143611]:
  _10 = __builtin_sqrtf (y_4);

and jump threading doesn't know that if y >= 0.0 is true then
isgreaterequal (y, 0.0) is as well.  OTOH I'm not sure that's
actually true since IIRC isgreaterequal (y, 0.0) will return
true if isunordered (y, 0.0) while for y >= 0.0 the result
is unspecified?

So maybe you simply have to adjust your precondition appropriately
like

  y = x * x;
  if (isless (y, 0.0))
    __builtin_unreachable ();
  return std::sqrt (y);

that way it works for me?


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85316
[Bug 85316] [meta-bug] VRP range propagation missed cases

Reply via email to