https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126521
Bug ID: 126521
Summary: Wrong RTL ifcvt with abs
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: ktkachov at gcc dot gnu.org
Target Milestone: ---
Target: aarch64
__attribute__((noipa)) double
g (double a)
{
double x;
if (a < 0.0)
x = a;
else
x = -a;
return x;
}
static unsigned long long
bits (double d)
{
unsigned long long u;
__builtin_memcpy (&u, &d, 8);
return u;
}
static double
from_bits (unsigned long long u)
{
double d;
__builtin_memcpy (&d, &u, 8);
return d;
}
int
main (void)
{
double mnan = from_bits (0xfff8000000000000ULL); /* -NaN */
double pnan = from_bits (0x7ff8000000000000ULL); /* +NaN */
/* a < 0.0 is false for either NaN, so both take the else arm and the
result is the operand with its sign bit flipped. */
if (bits (g (mnan)) != 0x7ff8000000000000ULL)
__builtin_abort ();
if (bits (g (pnan)) != 0xfff8000000000000ULL)
__builtin_abort ();
/* Ordinary values must still work. */
if (g (-2.0) != -2.0 || g (3.0) != -3.0)
__builtin_abort ();
return 0;
}
aborts on aarch64 with -O2 -fno-signed-zeros -fno-ssa-phiopt but passes at -O0