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.

Reply via email to