diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -13374,12 +13374,6 @@ } } - // fold ((fma (fneg X), Y, (fneg Z)) -> fneg (fma X, Y, Z)) - // fold ((fma X, (fneg Y), (fneg Z)) -> fneg (fma X, Y, Z)) - if (!TLI.isFNegFree(VT)) - if (SDValue Neg = TLI.getCheaperNegatedExpression( - SDValue(N, 0), DAG, LegalOperations, ForCodeSize)) - return DAG.getNode(ISD::FNEG, DL, VT, Neg); return SDValue(); } diff --git a/llvm/test/CodeGen/PowerPC/fma-combine.ll b/llvm/test/CodeGen/PowerPC/fma-combine.ll --- a/llvm/test/CodeGen/PowerPC/fma-combine.ll +++ b/llvm/test/CodeGen/PowerPC/fma-combine.ll @@ -171,16 +171,18 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: addis 3, 2, .LCPI4_0@toc@ha ; CHECK-NEXT: addis 4, 2, .LCPI4_1@toc@ha -; CHECK-NEXT: lfs 0, .LCPI4_0@toc@l(3) +; CHECK-NEXT: addi 3, 3, .LCPI4_0@toc@l +; CHECK-NEXT: lfsx 0, 0, 3 ; CHECK-NEXT: lfsx 2, 0, 3 ; CHECK-NEXT: addis 3, 2, .LCPI4_2@toc@ha ; CHECK-NEXT: lfs 3, .LCPI4_1@toc@l(4) -; CHECK-NEXT: lfs 1, .LCPI4_2@toc@l(3) -; CHECK-NEXT: fmr 4, 3 -; CHECK-NEXT: xsmaddasp 3, 2, 0 -; CHECK-NEXT: xsnmaddasp 4, 2, 0 -; CHECK-NEXT: xsmaddasp 1, 2, 3 -; CHECK-NEXT: xsmaddasp 1, 4, 2 +; CHECK-NEXT: addis 4, 2, .LCPI4_3@toc@ha +; CHECK-NEXT: lfs 4, .LCPI4_2@toc@l(3) +; CHECK-NEXT: lfs 1, .LCPI4_3@toc@l(4) +; CHECK-NEXT: xsmaddasp 3, 0, 2 +; CHECK-NEXT: xsnmsubasp 4, 0, 2 +; CHECK-NEXT: xsmaddasp 1, 0, 3 +; CHECK-NEXT: xsmaddasp 1, 4, 0 ; CHECK-NEXT: blr %tmp = load float, float* undef, align 4 %tmp2 = load float, float* undef, align 4 @@ -205,9 +207,9 @@ ; CHECK-FAST-NEXT: addis 4, 2, .LCPI5_0@toc@ha ; CHECK-FAST-NEXT: lfs 3, .LCPI5_1@toc@l(3) ; CHECK-FAST-NEXT: lfs 4, .LCPI5_0@toc@l(4) -; CHECK-FAST-NEXT: xssubdp 0, 1, 3 +; CHECK-FAST-NEXT: xsadddp 0, 1, 3 ; CHECK-FAST-NEXT: xsmaddadp 3, 1, 4 -; CHECK-FAST-NEXT: xsmaddadp 0, 3, 2 +; CHECK-FAST-NEXT: xsnmsubadp 0, 3, 2 ; CHECK-FAST-NEXT: fmr 1, 0 ; CHECK-FAST-NEXT: blr ; @@ -218,8 +220,8 @@ ; CHECK-FAST-NOVSX-NEXT: lfs 0, .LCPI5_0@toc@l(3) ; CHECK-FAST-NOVSX-NEXT: lfs 3, .LCPI5_1@toc@l(4) ; CHECK-FAST-NOVSX-NEXT: fmadd 3, 1, 3, 0 -; CHECK-FAST-NOVSX-NEXT: fsub 0, 1, 0 -; CHECK-FAST-NOVSX-NEXT: fmadd 1, 3, 2, 0 +; CHECK-FAST-NOVSX-NEXT: fadd 0, 1, 0 +; CHECK-FAST-NOVSX-NEXT: fnmsub 1, 3, 2, 0 ; CHECK-FAST-NOVSX-NEXT: blr ; ; CHECK-LABEL: getNegatedExpression_crash: @@ -228,9 +230,9 @@ ; CHECK-NEXT: addis 4, 2, .LCPI5_0@toc@ha ; CHECK-NEXT: lfs 3, .LCPI5_1@toc@l(3) ; CHECK-NEXT: lfs 4, .LCPI5_0@toc@l(4) -; CHECK-NEXT: xssubdp 0, 1, 3 +; CHECK-NEXT: xsadddp 0, 1, 3 ; CHECK-NEXT: xsmaddadp 3, 1, 4 -; CHECK-NEXT: xsmaddadp 0, 3, 2 +; CHECK-NEXT: xsnmsubadp 0, 3, 2 ; CHECK-NEXT: fmr 1, 0 ; CHECK-NEXT: blr %neg = fneg reassoc double %x