Have PostDomTree use the newly templated DFSPass.
authorOwen Anderson <resistor@mac.com>
Fri, 28 Sep 2007 01:23:47 +0000 (01:23 +0000)
committerOwen Anderson <resistor@mac.com>
Fri, 28 Sep 2007 01:23:47 +0000 (01:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42427 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/DominatorInternals.h
include/llvm/Analysis/Dominators.h
include/llvm/Analysis/PostDominators.h
lib/Analysis/PostDominatorCalculation.h
lib/Analysis/PostDominators.cpp
lib/VMCore/DominatorInternals.cpp

index 66ac2b70e2c2ab18aa95c56ecb957bae557a0bd2..cfd2d749a59591ae9999ccef6112de9994264585 100644 (file)
@@ -21,7 +21,8 @@
 namespace llvm {
 
 template<class GraphT>
-unsigned DFSPass(DominatorTree& DT, typename GraphT::NodeType* V, unsigned N) {
+unsigned DFSPass(DominatorTreeBase& DT, typename GraphT::NodeType* V,
+                 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.
index e8ed92c6815a42bbc18db31ef001a7a11b2048d0..b14e6196a754ae6315b289618506d0b7c6fd7ab5 100644 (file)
@@ -280,6 +280,10 @@ protected:
   friend void Link(DominatorTreeBase& DT, BasicBlock *V,
                    BasicBlock *W, InfoRec &WInfo);
   
+  template<class GraphT> friend unsigned DFSPass(DominatorTreeBase& DT,
+                                                 typename GraphT::NodeType* V,
+                                                 unsigned N);
+  
   /// updateDFSNumbers - Assign In and Out numbers to the nodes while walking
   /// dominator tree in dfs order.
   void updateDFSNumbers();
@@ -319,9 +323,6 @@ public:
 
 private:
   friend void DTcalculate(DominatorTree& DT, Function& F);
-  
-  template<class GraphT> friend
-  unsigned DFSPass(DominatorTree& DT, typename GraphT::NodeType* V, unsigned N);
 };
 
 //===-------------------------------------
index b2a37ffdb062917c8882741d6c7d042a09b2bd17..d87f60465bb7d712d0495ef4da85a560746a83a1 100644 (file)
@@ -37,10 +37,7 @@ struct PostDominatorTree : public DominatorTreeBase {
     AU.setPreservesAll();
   }
 private:
-  unsigned DFSPass(BasicBlock *V, unsigned N);
   friend void PDTcalculate(PostDominatorTree& PDT, Function &F);
-  friend void PDTLink(PostDominatorTree& PDT,BasicBlock *V,
-                      BasicBlock *W, InfoRec &WInfo);
 };
 
 
index 550422d701e88dac8cf649f945be0df8ab238131..5e2b3c86de150d64d54a293e282f32b01439785f 100644 (file)
@@ -13,7 +13,9 @@
 #ifndef LLVM_ANALYSIS_POST_DOMINATOR_CALCULATION_H
 #define LLVM_ANALYSIS_POST_DOMINATOR_CALCULATION_H
 
+#include "llvm/Analysis/Dominators.h"
 #include "llvm/Analysis/PostDominators.h"
+#include "llvm/Analysis/DominatorInternals.h"
 
 namespace llvm {
 
@@ -40,7 +42,7 @@ void PDTcalculate(PostDominatorTree& PDT, Function &F) {
   // in later stages of the algorithm.
   unsigned N = 0;
   for (unsigned i = 0, e = PDT.Roots.size(); i != e; ++i)
-    N = PDT.DFSPass(PDT.Roots[i], N);
+    N = DFSPass<GraphTraits<Inverse<BasicBlock*> > >(PDT, PDT.Roots[i], N);
   
   for (unsigned i = N; i >= 2; --i) {
     BasicBlock *W = PDT.Vertex[i];
index b8d833e23d7501a55c7c5262f7e63e842f5c3c48..cd29749c830e65c15fc6a6ee669929176264c368 100644 (file)
@@ -28,51 +28,6 @@ char PostDominanceFrontier::ID = 0;
 static RegisterPass<PostDominatorTree>
 F("postdomtree", "Post-Dominator Tree Construction", true);
 
-unsigned PostDominatorTree::DFSPass(BasicBlock *V, unsigned N) {
-  std::vector<BasicBlock *> workStack;
-  SmallPtrSet<BasicBlock *, 32> Visited;
-  workStack.push_back(V);
-
-  do {
-    BasicBlock *currentBB = workStack.back();
-    InfoRec &CurVInfo = Info[currentBB];
-
-    // Visit each block only once.
-    if (Visited.insert(currentBB)) {
-      CurVInfo.Semi = ++N;
-      CurVInfo.Label = currentBB;
-      
-      Vertex.push_back(currentBB);  // Vertex[n] = current;
-      // Info[currentBB].Ancestor = 0;     
-      // Ancestor[n] = 0
-      // Child[currentBB] = 0;
-      CurVInfo.Size = 1;       // Size[currentBB] = 1
-    }
-
-    // Visit children
-    bool visitChild = false;
-    for (pred_iterator PI = pred_begin(currentBB), PE = pred_end(currentBB); 
-         PI != PE && !visitChild; ++PI) {
-      InfoRec &SuccVInfo = Info[*PI];
-      if (SuccVInfo.Semi == 0) {
-        SuccVInfo.Parent = currentBB;
-        if (!Visited.count(*PI)) {
-          workStack.push_back(*PI);   
-          visitChild = true;
-        }
-      }
-    }
-
-    // If all children are visited or if this block has no child then pop this
-    // block out of workStack.
-    if (!visitChild)
-      workStack.pop_back();
-
-  } while (!workStack.empty());
-
-  return N;
-}
-
 //===----------------------------------------------------------------------===//
 //  PostDominanceFrontier Implementation
 //===----------------------------------------------------------------------===//
index fbbac9f6b99231996aefe8d072af97e12434392b..abb87cd38187950cb89c3e21b63e9a4e1e51644f 100644 (file)
@@ -7,9 +7,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LIB_LLVM_ANALYSIS_DOMINATOR_INTERNALS_H
-#define LIB_LLVM_ANALYSIS_DOMINATOR_INTERNALS_H
-
 #include "llvm/Analysis/Dominators.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallPtrSet.h"
@@ -141,5 +138,3 @@ void Link(DominatorTreeBase& DT, BasicBlock *V, BasicBlock *W,
 }
 
 }
-
-#endif