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.