[Bug tree-optimization/126696] New: Fold a fused multiply-add by one into an addition

"ktkachov at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126696

            Bug ID: 126696
           Summary: Fold a fused multiply-add by one into an  addition
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: easyhack, missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ktkachov at gcc dot gnu.org
  Target Milestone: ---

Multiplying by one is exact, so the single rounding of the fused
operation is the rounding of the sum, and the same holds for minus one
and a subtraction.  Dropping the fma also drops the materialisation of
the constant.

When both operands are NaN the result is a NaN either way, but which one
is returned can change.  IEEE 754 leaves that unspecified, and GCC
already folds x * 1.0 into x on the same basis.

  double f (double x, double y) { return __builtin_fma (x, 1.0, y); }

Can generate just:
f:
        fadd    d0, d0, d1
        ret

which Clang already does. GCC does:
f:
        fmov    d31, 1.0e+0
        fmadd   d0, d0, d31, d1
        ret
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.