https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102129
--- Comment #1 from Vincent Lefèvre <vincent-gcc at vinc17 dot net> ---
Additional surprising behavior...
On the following C code:
void g (void);
double f (void)
{
double x = 0.0, y = 0.0;
double r = x / y;
g ();
return r;
}
one can see with -ftrapping-math (the default) that a 0.0 / 0.0 is done before
the call to g, which is the expected behavior (this time, the order of the
operations has been preserved):
pxor %xmm0, %xmm0
divsd %xmm0, %xmm0
movsd %xmm0, 8(%rsp)
call g@PLT
movsd 8(%rsp), %xmm0
(note that with -fno-trapping-math, a NaN is just generated at compile time).
But on the following C code:
void g (void);
double f (void)
{
double x = 1.0, y = 3.0;
double r = x / y;
g ();
return r;
}
GCC behaves as with -fno-trapping-math, i.e. g is called, then the rounded
value of 1/3 is returned, while there should have been an inexact exception
(the GCC manual explicitly mentions inexact as one of the possible traps).