[llvm-commits] [llvm] r96368 - in /llvm/trunk: include/llvm/CodeGen/DAGISelHeader.h utils/TableGen/DAGISelMatcher.cpp utils/TableGen/DAGISelMatcher.h utils/TableGen/DAGISelMatcherEmitter.cpp utils/TableGen/DAGISelMatcherGen.cpp

Chris Lattner sabre at nondot.org
Tue Feb 16 11:16:28 PST 2010


Author: lattner
Date: Tue Feb 16 13:15:55 2010
New Revision: 96368

URL: http://llvm.org/viewvc/llvm-project?rev=96368&view=rev
Log:
convert the new matcher to check intermediate nodes for a single
use and only call IsProfitableToFold/IsLegalToFold on the load
being folded, like the old dagiselemitter does.  This 
substantially simplifies the code and improves opportunities for
sharing.

Modified:
    llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h
    llvm/trunk/utils/TableGen/DAGISelMatcher.cpp
    llvm/trunk/utils/TableGen/DAGISelMatcher.h
    llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp
    llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp

Modified: llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h?rev=96368&r1=96367&r2=96368&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h (original)
+++ llvm/trunk/include/llvm/CodeGen/DAGISelHeader.h Tue Feb 16 13:15:55 2010
@@ -209,8 +209,7 @@
   OPC_CheckComplexPat,
   OPC_CheckAndImm1, OPC_CheckAndImm2, OPC_CheckAndImm4, OPC_CheckAndImm8,
   OPC_CheckOrImm1, OPC_CheckOrImm2, OPC_CheckOrImm4, OPC_CheckOrImm8,
-  OPC_IsProfitableToFold,
-  OPC_IsLegalToFold
+  OPC_CheckFoldableChainNode
 };
 
 struct MatchScope {
@@ -382,19 +381,29 @@
       if (CheckOrImmediate(N, GetInt8(MatcherTable, MatcherIndex))) break;
       continue;
         
-    case OPC_IsProfitableToFold:
+    case OPC_CheckFoldableChainNode: {
       assert(!NodeStack.size() == 1 && "No parent node");
+      // Verify that all intermediate nodes between the root and this one have
+      // a single use.
+      bool HasMultipleUses = false;
+      for (unsigned i = 1, e = NodeStack.size()-1; i != e; ++i)
+        if (!NodeStack[i].hasOneUse()) {
+          HasMultipleUses = true;
+          break;
+        }
+      if (HasMultipleUses) break;
+
+      // Check to see that the target thinks this is profitable to fold and that
+      // we can fold it without inducing cycles in the graph.
       if (!IsProfitableToFold(N, NodeStack[NodeStack.size()-2].getNode(),
-                              NodeToMatch))
-        break;
-      continue;
-    case OPC_IsLegalToFold:
-      assert(!NodeStack.size() == 1 && "No parent node");
-      if (!IsLegalToFold(N, NodeStack[NodeStack.size()-2].getNode(),
+                              NodeToMatch) ||
+          !IsLegalToFold(N, NodeStack[NodeStack.size()-2].getNode(),
                          NodeToMatch))
         break;
+      
       continue;
     }
+    }
     
     // If the code reached this point, then the match failed pop out to the next
     // match scope.

Modified: llvm/trunk/utils/TableGen/DAGISelMatcher.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcher.cpp?rev=96368&r1=96367&r2=96368&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.cpp Tue Feb 16 13:15:55 2010
@@ -106,13 +106,8 @@
   printChild(OS, indent);
 }
 
-void CheckProfitableToFoldMatcherNode::print(raw_ostream &OS,
-                                             unsigned indent) const {
-  OS.indent(indent) << "CheckProfitableToFold\n";
-  printChild(OS, indent);
-}
-
-void CheckLegalToFoldMatcherNode::print(raw_ostream &OS, unsigned indent) const{
-  OS.indent(indent) << "CheckLegalToFold\n";
+void CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
+                                              unsigned indent) const {
+  OS.indent(indent) << "CheckFoldableChainNode\n";
   printChild(OS, indent);
 }

Modified: llvm/trunk/utils/TableGen/DAGISelMatcher.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcher.h?rev=96368&r1=96367&r2=96368&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcher.h (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcher.h Tue Feb 16 13:15:55 2010
@@ -50,8 +50,7 @@
     CheckComplexPat,
     CheckAndImm,
     CheckOrImm,
-    CheckProfitableToFold,
-    CheckLegalToFold
+    CheckFoldableChainNode
   };
   const KindTy Kind;
   
@@ -359,33 +358,20 @@
   virtual void print(raw_ostream &OS, unsigned indent = 0) const;
 };
 
-/// CheckProfitableToFoldMatcherNode - This checks to see if the current node is
-/// worthwhile to try to fold into a large pattern.
-class CheckProfitableToFoldMatcherNode : public MatcherNodeWithChild {
+/// CheckFoldableChainNodeMatcherNode - This checks to see if the current node
+/// (which defines a chain operand) is safe to fold into a larger pattern.
+class CheckFoldableChainNodeMatcherNode : public MatcherNodeWithChild {
 public:
-  CheckProfitableToFoldMatcherNode()
-  : MatcherNodeWithChild(CheckProfitableToFold) {}
+  CheckFoldableChainNodeMatcherNode()
+    : MatcherNodeWithChild(CheckFoldableChainNode) {}
   
   static inline bool classof(const MatcherNode *N) {
-    return N->getKind() == CheckProfitableToFold;
+    return N->getKind() == CheckFoldableChainNode;
   }
   
   virtual void print(raw_ostream &OS, unsigned indent = 0) const;
 };
 
-/// CheckLegalToFoldMatcherNode - This checks to see if the current node is
-/// legal to try to fold into a large pattern.
-class CheckLegalToFoldMatcherNode : public MatcherNodeWithChild {
-public:
-  CheckLegalToFoldMatcherNode()
-  : MatcherNodeWithChild(CheckLegalToFold) {}
-  
-  static inline bool classof(const MatcherNode *N) {
-    return N->getKind() == CheckLegalToFold;
-  }
-  
-  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
-};
 } // end namespace llvm
 
 #endif

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp?rev=96368&r1=96367&r2=96368&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherEmitter.cpp Tue Feb 16 13:15:55 2010
@@ -183,11 +183,8 @@
     OS << "OPC_CheckOrImm" << ClassifyInt(Val) << ", ";
     return EmitInt(Val, OS)+1;
   }
-  case MatcherNode::CheckProfitableToFold:
-    OS << "OPC_IsProfitableToFold,\n";
-    return 1;
-  case MatcherNode::CheckLegalToFold:
-    OS << "OPC_IsLegalToFold,\n";
+  case MatcherNode::CheckFoldableChainNode:
+    OS << "OPC_CheckFoldableChainNode,\n";
     return 1;
   }
   assert(0 && "Unreachable");

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp?rev=96368&r1=96367&r2=96368&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp Tue Feb 16 13:15:55 2010
@@ -212,9 +212,7 @@
   const TreePatternNode *Root = Pattern.getSrcPattern();
   if (N != Root &&                             // Not the root of the pattern.
       N->TreeHasProperty(SDNPHasChain, CGP)) { // Has a chain somewhere in tree.
-    
-    AddMatcherNode(new CheckProfitableToFoldMatcherNode());
-    
+
     // If this non-root node produces a chain, we may need to emit a validity
     // check.
     if (OpNo != 0) {
@@ -239,7 +237,7 @@
       }
       
       if (NeedCheck)
-        AddMatcherNode(new CheckLegalToFoldMatcherNode());
+        AddMatcherNode(new CheckFoldableChainNodeMatcherNode());
     }
   }
       





More information about the llvm-commits mailing list