[llvm-commits] CVS: llvm/lib/VMCore/Dominators.cpp

Chris Lattner sabre at nondot.org
Sun Apr 8 23:44:59 PDT 2007



Changes in directory llvm/lib/VMCore:

Dominators.cpp updated: 1.91 -> 1.92
---
Log message:

Convert ImmediateDominators::DFSPass from being recursive to being iterative.


---
Diffs of the changes:  (+43 -1)

 Dominators.cpp |   44 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 43 insertions(+), 1 deletion(-)


Index: llvm/lib/VMCore/Dominators.cpp
diff -u llvm/lib/VMCore/Dominators.cpp:1.91 llvm/lib/VMCore/Dominators.cpp:1.92
--- llvm/lib/VMCore/Dominators.cpp:1.91	Mon Apr  9 01:10:06 2007
+++ llvm/lib/VMCore/Dominators.cpp	Mon Apr  9 01:44:42 2007
@@ -50,12 +50,16 @@
 
 unsigned ImmediateDominators::DFSPass(BasicBlock *V, InfoRec &VInfo,
                                       unsigned N) {
+  // This is more understandable as a recursive algorithm, but we can't use the
+  // recursive algorithm due to stack depth issues.  Keep it here for
+  // documentation purposes.
+#if 0
   VInfo.Semi = ++N;
   VInfo.Label = V;
 
   Vertex.push_back(V);        // Vertex[n] = V;
   //Info[V].Ancestor = 0;     // Ancestor[n] = 0
-  //Child[V] = 0;             // Child[v] = 0
+  //Info[V].Child = 0;        // Child[v] = 0
   VInfo.Size = 1;             // Size[v] = 1
 
   for (succ_iterator SI = succ_begin(V), E = succ_end(V); SI != E; ++SI) {
@@ -65,6 +69,44 @@
       N = DFSPass(*SI, SuccVInfo, N);
     }
   }
+#else
+  std::vector<std::pair<BasicBlock*, unsigned> > Worklist;
+  Worklist.push_back(std::make_pair(V, 0U));
+  while (!Worklist.empty()) {
+    BasicBlock *BB = Worklist.back().first;
+    unsigned NextSucc = Worklist.back().second;
+    
+    // First time we visited this BB?
+    if (NextSucc == 0) {
+      InfoRec &BBInfo = Info[BB];
+      BBInfo.Semi = ++N;
+      BBInfo.Label = BB;
+      
+      Vertex.push_back(BB);       // Vertex[n] = V;
+      //BBInfo[V].Ancestor = 0;   // Ancestor[n] = 0
+      //BBInfo[V].Child = 0;      // Child[v] = 0
+      BBInfo.Size = 1;            // Size[v] = 1
+    }
+    
+    // If we are done with this block, remove it from the worklist.
+    if (NextSucc == BB->getTerminator()->getNumSuccessors()) {
+      Worklist.pop_back();
+      continue;
+    }
+    
+    // Otherwise, increment the successor number for the next time we get to it.
+    ++Worklist.back().second;
+    
+    // Visit the successor next, if it isn't already visited.
+    BasicBlock *Succ = BB->getTerminator()->getSuccessor(NextSucc);
+    
+    InfoRec &SuccVInfo = Info[Succ];
+    if (SuccVInfo.Semi == 0) {
+      SuccVInfo.Parent = BB;
+      Worklist.push_back(std::make_pair(Succ, 0U));
+    }
+  }
+#endif
   return N;
 }
 






More information about the llvm-commits mailing list