[PATCH] D104247: [DAGCombine] reassoc flag shouldn't enable contract

Jinsong Ji via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 22 09:56:30 PDT 2021


jsji added inline comments.


================
Comment at: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:13258
+    bool CanFuse = Options.UnsafeFPMath || N->getFlags().hasAllowContract();
     // fold (fsub (fma x, y, (fmul u, v)), z)
     //   -> (fma x, y (fma u, v, (fneg z)))
----------------
jsji wrote:
> jsji wrote:
> > spatel wrote:
> > > jsji wrote:
> > > > mcberg2017 wrote:
> > > > > Some of these patterns below have operands/operations which change order, they should be audited and checked reassoc FMF to enable.  Perhaps a follow on change?
> > > > Good point, sure, will follow up.
> > > Sorry, I missed this difference. The patch as-is is allowing miscompiles IIUC. For example, this test of the pattern:
> > > 
> > > ```
> > > ; x*y + u*v - z
> > > define float @f(float %x, float %y, float %z, float %u, float %v) {
> > >   %xy = fmul contract float %x, %y
> > >   %uv = fmul contract float %u, %v
> > >   %xyuv = fadd contract float %xy, %uv
> > >   %xyuvz = fsub contract float %xyuv, %z
> > >   ret float %xyuvz
> > > }
> > > 
> > > ```
> > > 
> > > We are not allowed to fuse the trailing fsub into fma based on what we decided in D89527, but that's what happens now with:
> > > 
> > > ```
> > > $ llc -o - fma.ll -mtriple=powerpc64le -ppc-asm-full-reg-names
> > > 	xsmsubasp f3, f4, f5 ; u*v - z
> > > 	xsmaddasp f3, f1, f2 ; x*y + (u*v - z)
> > > 	fmr f1, f3
> > > 	blr
> > > 
> > > ```
> > Yes, working on it.
> The specific case `; x*y + u*v - z` , the behavior is not changed by D104247. It has been like this for a long time. But yeah, I am looking into these patterns now.
https://reviews.llvm.org/D104723 posted for this.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D104247/new/

https://reviews.llvm.org/D104247



More information about the llvm-commits mailing list