diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 6ab8f8ee55c08..b774e279342e9 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -15233,10 +15233,10 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) { SDValue TmpFMA = FMA; while (E && isFusedOp(TmpFMA) && TmpFMA.hasOneUse()) { SDValue FMul = TmpFMA->getOperand(2); - if (FMul.getOpcode() == ISD::FMUL && FMul.hasOneUse()) { + if (matcher.match(FMul, ISD::FMUL) && FMul.hasOneUse()) { SDValue C = FMul.getOperand(0); SDValue D = FMul.getOperand(1); - SDValue CDE = DAG.getNode(PreferredFusedOpcode, SL, VT, C, D, E); + SDValue CDE = matcher.getNode(PreferredFusedOpcode, SL, VT, C, D, E); DAG.ReplaceAllUsesOfValueWith(FMul, CDE); // Replacing the inner FMul could cause the outer FMA to be simplified // away. diff --git a/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll b/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll index 1d30328e97815..ad8965cb624cc 100644 --- a/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll @@ -57,3 +57,18 @@ define @fma_nonvp( %x, @llvm.vp.fadd.nxv1f64( %1, %z, %m, i32 %vl) ret %2 } + +define @fma_reassociate( %a, %b, %c, %d, %e, %m, i32 zeroext %vl) { +; CHECK-LABEL: fma_reassociate: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, mu +; CHECK-NEXT: vfmadd.vv v11, v10, v12, v0.t +; CHECK-NEXT: vfmadd.vv v9, v8, v11, v0.t +; CHECK-NEXT: vmv.v.v v8, v9 +; CHECK-NEXT: ret + %1 = call fast @llvm.vp.fmul.nxv1f64( %a, %b, %m, i32 %vl) + %2 = call fast @llvm.vp.fmul.nxv1f64( %c, %d, %m, i32 %vl) + %3 = call fast @llvm.vp.fadd.nxv1f64( %1, %2, %m, i32 %vl) + %4 = call fast @llvm.vp.fadd.nxv1f64( %3, %e, %m, i32 %vl) + ret %4 +}