Speed up cycle checking significantly by caching results.
authorDavid Greene <greened@obbligato.org>
Tue, 23 Feb 2010 17:37:50 +0000 (17:37 +0000)
committerDavid Greene <greened@obbligato.org>
Tue, 23 Feb 2010 17:37:50 +0000 (17:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96956 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 33899a411bed10884616ca4759e02fbdd392bdac..ef21a1592bbe6351ff98fe9df20b5ce94d3743fa 100644 (file)
@@ -6315,7 +6315,11 @@ bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) {
 }
 
 static void checkForCyclesHelper(const SDNode *N,
-                                 std::set<const SDNode *> &visited) {
+                                 std::set<const SDNode *> &visited,
+                                 std::set<const SDNode *> &checked) {
+  if (checked.find(N) != checked.end())
+    return;
+
   if (visited.find(N) != visited.end()) {
     dbgs() << "Offending node:\n";
     N->dumprFull();
@@ -6329,16 +6333,18 @@ static void checkForCyclesHelper(const SDNode *N,
   assert(inserted && "Missed cycle");
 
   for(unsigned i = 0; i < N->getNumOperands(); ++i) {
-    checkForCyclesHelper(N->getOperand(i).getNode(), visited);
+    checkForCyclesHelper(N->getOperand(i).getNode(), visited, checked);
   }
   visited.erase(i);
+  checked.insert(N);
 }
 
 void llvm::checkForCycles(const llvm::SDNode *N) {
 #ifdef XDEBUG
   assert(N && "Checking nonexistant SDNode");
   std::set<const SDNode *> visited;
-  checkForCyclesHelper(N, visited);
+  std::set<const SDNode *> checked;
+  checkForCyclesHelper(N, visited, checked);
 #endif
 }