On Thu, 10 Dec 2020, Xionghu Luo via Gcc wrote:

I have a maybe silly question about whether there is any *standard*
or *options* (like -ffast-math) for GCC that allow double to float
demotion optimization?  For example,

1) from PR22326:

#include <math.h>

float foo(float f, float x, float y) {
return (fabs(f)*x+y);
}

The fabs will return double result but it could be demoted to float
actually since the function returns float finally.

With fp-contract, this is (float)fma((double)f,(double)x,(double)y). This could almost be transformed into fmaf(f,x,y), except that the double rounding may not be strictly equivalent. Still, that seems like it would be no problem with -funsafe-math-optimizations, just like turning (float)((double)x*(double)y) into x*y, as long as it is a single operation with casts on all inputs and output. Whether there are cases that can be optimized without -funsafe-math-optimizations is harder to tell.

--
Marc Glisse

Reply via email to