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