[Bug middle-end/47990] Missed promotion of double precision constants to single precision for -funsafe-math-optimizations

joseph at codesourcery dot com gcc-bugzilla@gcc.gnu.org
Fri Mar 4 15:43:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47990

--- Comment #1 from joseph at codesourcery dot com <joseph at codesourcery dot com> 2011-03-04 15:42:39 UTC ---
On Fri, 4 Mar 2011, rguenth at gcc dot gnu.org wrote:

> In 482.sphinx3 we have code like
> 
> float foo (float x, float y)
> {
>   return ((int)(x/y + 0.5)) * y;
> }
> 
> where the addition of 0.5 is performed in double precision.  With
> -funsafe-math-optimizations we can demote 0.5 to single precision
> (its exactly representable) also because the result of the addition
> does not take part of further floating point computation but is
> immediately converted to int.
> 
> The unsafe part of this optimization occurs when x/y is FLT_MAX
> and we'd truncate to a 64bit integer type.  For 32bit integers
> it would probably be safe to do this optimization unconditionally.

No, that's not safe unconditionally; consider x/y == 0x800001p0f, for 
example (so adding 0.5f and converting to float results in rounding up to 
the next integer in the default round-to-nearest mode, whereas conversion 
from floating point to integer in C always rounds towards zero).



More information about the Gcc-bugs mailing list