/* { dg-do run } */ /* { dg-options "-O2 -ffast-math -msse -mfpmath=sse -mrecip" } */ /* { dg-require-effective-target sse } */ #include "sse-check.h" extern float sqrtf (float); float __attribute__((noinline)) broken (float a, float b) { return sqrtf (a / b); } extern void abort (void); extern void *memcpy (void *, const void *, __SIZE_TYPE__); static void sse_test (void) { int i; float x; char buf[sizeof (float)]; x = broken (0.0f, 10000.0f); /* A convoluted way to check for the correct result (zero) for all floating point formats. We can't use ==, !=, or range checks, or isinf/isnan/isunordered, because all of these will not do the right thing under -ffast-math, as they can assume that neither nan nor inf are returned. */ memcpy (&buf, &x, sizeof (float)); for (i = 0; i < sizeof (float); i++) if (buf[i] != 0) abort (); }