https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126534
Bug ID: 126534
Summary: [14/15/16/17 Regression] Wrong code with ranger and
sqrt
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: ktkachov at gcc dot gnu.org
Target Milestone: ---
/* cfn_sqrt::op1_range squares the bound of the result without allowing for
the half ulp that correct rounding of sqrt absorbs.
__builtin_sqrt (25.000000000000004) == 5.0 and
__builtin_sqrt (24.999999999999996) == 5.0, so both neighbours of 25.0
reach the edge that the reverse range restricts to 25.0. */
__attribute__((noipa)) int
f (double x)
{
double y = __builtin_sqrt (x);
if (y <= 5.0)
{
if (x > 25.0)
return 1;
return 2;
}
return 3;
}
__attribute__((noipa)) int
g (double x)
{
double y = __builtin_sqrt (x);
if (y >= 5.0)
{
if (x < 25.0)
return 1;
return 2;
}
return 3;
}
int
main (void)
{
if (f (0x1.9000000000001p+4) != 1) /* 25.000000000000004 */
__builtin_abort ();
if (g (0x1.8ffffffffffffp+4) != 1) /* 24.999999999999996 */
__builtin_abort ();
return 0;
}
Aborts at -O2 -lm and passes at -O0 (on aarch64)