http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47990
Summary: Missed promotion of double precision constants to
single precision for -funsafe-math-optimizations
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: middle-end
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: rgue...@gcc.gnu.org
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.