Use iterative while loop instead of recursive function call.
authorDevang Patel <dpatel@apple.com>
Thu, 3 May 2007 20:55:18 +0000 (20:55 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 3 May 2007 20:55:18 +0000 (20:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36694 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/Dominators.h
lib/VMCore/Dominators.cpp

index cca73bfb70356ba6f0cac24011335d6ccd75fcb2..20c2c5fdf9fe6c856a720b9bf0ec05179b4829c5 100644 (file)
@@ -225,7 +225,7 @@ private:
   void calculate(Function& F);
   Node *getNodeForBlock(BasicBlock *BB);
   unsigned DFSPass(BasicBlock *V, InfoRec &VInfo, unsigned N);
-  void Compress(BasicBlock *V, InfoRec &VInfo);
+  void Compress(BasicBlock *V);
   BasicBlock *Eval(BasicBlock *v);
   void Link(BasicBlock *V, BasicBlock *W, InfoRec &WInfo);
   inline BasicBlock *getIDom(BasicBlock *BB) const {
index 9f49b5506439761c922c48ed05bf1b20e975a6ec..4c674c2f5a45cdad2753ccab77d0ebef41ae4e71 100644 (file)
@@ -124,20 +124,40 @@ unsigned DominatorTree::DFSPass(BasicBlock *V, InfoRec &VInfo,
   return N;
 }
 
-void DominatorTree::Compress(BasicBlock *V, InfoRec &VInfo) {
-  BasicBlock *VAncestor = VInfo.Ancestor;
-  InfoRec &VAInfo = Info[VAncestor];
-  if (VAInfo.Ancestor == 0)
-    return;
+void DominatorTree::Compress(BasicBlock *VIn) {
 
-  Compress(VAncestor, VAInfo);
+  std::vector<BasicBlock *> Work;
+  std::set<BasicBlock *> Visited;
+  InfoRec &VInInfo = Info[VIn];
+  BasicBlock *VInAncestor = VInInfo.Ancestor;
+  InfoRec &VInVAInfo = Info[VInAncestor];
 
-  BasicBlock *VAncestorLabel = VAInfo.Label;
-  BasicBlock *VLabel = VInfo.Label;
-  if (Info[VAncestorLabel].Semi < Info[VLabel].Semi)
-    VInfo.Label = VAncestorLabel;
+  if (VInVAInfo.Ancestor != 0)
+    Work.push_back(VIn);
+  
+  while (!Work.empty()) {
+    BasicBlock *V = Work.back();
+    InfoRec &VInfo = Info[V];
+    BasicBlock *VAncestor = VInfo.Ancestor;
+    InfoRec &VAInfo = Info[VAncestor];
+
+    // Process Ancestor first
+    if (Visited.count(VAncestor) == 0 && VAInfo.Ancestor != 0) {
+      Work.push_back(VAncestor);
+      Visited.insert(VAncestor);
+      continue;
+    } 
+    Work.pop_back(); 
 
-  VInfo.Ancestor = VAInfo.Ancestor;
+    // Update VINfo based on Ancestor info
+    if (VAInfo.Ancestor == 0)
+      continue;
+    BasicBlock *VAncestorLabel = VAInfo.Label;
+    BasicBlock *VLabel = VInfo.Label;
+    if (Info[VAncestorLabel].Semi < Info[VLabel].Semi)
+      VInfo.Label = VAncestorLabel;
+    VInfo.Ancestor = VAInfo.Ancestor;
+  }
 }
 
 BasicBlock *DominatorTree::Eval(BasicBlock *V) {
@@ -146,13 +166,13 @@ BasicBlock *DominatorTree::Eval(BasicBlock *V) {
   // Higher-complexity but faster implementation
   if (VInfo.Ancestor == 0)
     return V;
-  Compress(V, VInfo);
+  Compress(V);
   return VInfo.Label;
 #else
   // Lower-complexity but slower implementation
   if (VInfo.Ancestor == 0)
     return VInfo.Label;
-  Compress(V, VInfo);
+  Compress(V);
   BasicBlock *VLabel = VInfo.Label;
 
   BasicBlock *VAncestorLabel = Info[VInfo.Ancestor].Label;