[llvm] 302cc8a - [DAGCombiner] clean-up FMA+FMUL folds; NFC

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Sat Jun 6 07:33:49 PDT 2020


Author: Sanjay Patel
Date: 2020-06-06T10:32:54-04:00
New Revision: 302cc8a121b5750e2b98081b228063742a1f83e9

URL: https://github.com/llvm/llvm-project/commit/302cc8a121b5750e2b98081b228063742a1f83e9
DIFF: https://github.com/llvm/llvm-project/commit/302cc8a121b5750e2b98081b228063742a1f83e9.diff

LOG: [DAGCombiner] clean-up FMA+FMUL folds; NFC

D80801 suggests some readability improvements before mocing this block.

Added: 
    

Modified: 
    llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index f603a7c12feb..e3275caed112 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -11952,33 +11952,29 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
 
   // More folding opportunities when target permits.
   if (Aggressive) {
-    // fold (fadd (fma x, y, (fmul u, v)), z) -> (fma x, y (fma u, v, z))
-    if (CanFuse &&
-        N0.getOpcode() == PreferredFusedOpcode &&
-        N0.getOperand(2).getOpcode() == ISD::FMUL &&
-        N0->hasOneUse() && N0.getOperand(2)->hasOneUse()) {
-      return DAG.getNode(PreferredFusedOpcode, SL, VT,
-                         N0.getOperand(0), N0.getOperand(1),
-                         DAG.getNode(PreferredFusedOpcode, SL, VT,
-                                     N0.getOperand(2).getOperand(0),
-                                     N0.getOperand(2).getOperand(1),
-                                     N1, Flags), Flags);
-    }
-
-    // fold (fadd x, (fma y, z, (fmul u, v)) -> (fma y, z (fma u, v, x))
-    if (CanFuse &&
-        N1->getOpcode() == PreferredFusedOpcode &&
-        N1.getOperand(2).getOpcode() == ISD::FMUL &&
-        N1->hasOneUse() && N1.getOperand(2)->hasOneUse()) {
-      return DAG.getNode(PreferredFusedOpcode, SL, VT,
-                         N1.getOperand(0), N1.getOperand(1),
-                         DAG.getNode(PreferredFusedOpcode, SL, VT,
-                                     N1.getOperand(2).getOperand(0),
-                                     N1.getOperand(2).getOperand(1),
-                                     N0, Flags), Flags);
+    // fadd (fma A, B, (fmul C, D)), E --> fma A, B, (fma C, D, E)
+    // fadd E, (fma A, B, (fmul C, D)) --> fma A, B, (fma C, D, E)
+    SDValue FMA, E;
+    if (CanFuse && N0.getOpcode() == PreferredFusedOpcode &&
+        N0.getOperand(2).getOpcode() == ISD::FMUL && N0.hasOneUse() &&
+        N0.getOperand(2).hasOneUse()) {
+      FMA = N0;
+      E = N1;
+    } else if (CanFuse && N1.getOpcode() == PreferredFusedOpcode &&
+               N1.getOperand(2).getOpcode() == ISD::FMUL && N1.hasOneUse() &&
+               N1.getOperand(2).hasOneUse()) {
+      FMA = N1;
+      E = N0;
+    }
+    if (FMA && E) {
+      SDValue A = FMA.getOperand(0);
+      SDValue B = FMA.getOperand(1);
+      SDValue C = FMA.getOperand(2).getOperand(0);
+      SDValue D = FMA.getOperand(2).getOperand(1);
+      SDValue CDE = DAG.getNode(PreferredFusedOpcode, SL, VT, C, D, E, Flags);
+      return DAG.getNode(PreferredFusedOpcode, SL, VT, A, B, CDE, Flags);
     }
 
-
     // fold (fadd (fma x, y, (fpext (fmul u, v))), z)
     //   -> (fma x, y, (fma (fpext u), (fpext v), z))
     auto FoldFAddFMAFPExtFMul = [&] (


        


More information about the llvm-commits mailing list