https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102219

            Bug ID: 102219
           Summary: fast-math inhibits fp contraction for a + b * a
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mkretz at gcc dot gnu.org
  Target Milestone: ---

Test case (compiled with -O2 -mfma):

[[gnu::optimize("fast-math")]]
float f(float a, float b)
{
    return a + b * a;
}

float g(float a, float b)
{
    return a + b * a;
}

f is not contracted to an fma, while g is.

Wild guess: GCC considers a transformation to (1 + b) * a and determines too
late that (1 + b) * a is better transformed to a + b * a (note that `return (1
+ b) * a` also emits vmulss, vaddss like f above and also doesn't contract to
an FMA even though it could/should). Maybe (1 + b) * a should be contracted to
fma(a, b, a) with fast-math, in general?

Reply via email to