PostDominatorTree() :
DominatorTreeBase((intptr_t)&ID, true) {}
- virtual bool runOnFunction(Function &F) {
- reset(); // Reset from the last time we were run...
- PDTcalculate(*this, F);
- return false;
- }
+ virtual bool runOnFunction(Function &F);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
namespace llvm {
void PDTcalculate(PostDominatorTree& PDT, Function &F) {
- // Step #0: Scan the function looking for the root nodes of the post-dominance
- // relationships. These blocks, which have no successors, end with return and
- // unwind instructions.
- for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
- TerminatorInst *Insn = I->getTerminator();
- if (Insn->getNumSuccessors() == 0) {
- // Unreachable block is not a root node.
- if (!isa<UnreachableInst>(Insn))
- PDT.Roots.push_back(I);
- }
-
- // Prepopulate maps so that we don't get iterator invalidation issues later.
- PDT.IDoms[I] = 0;
- PDT.DomTreeNodes[I] = 0;
- }
-
- PDT.Vertex.push_back(0);
-
// Step #1: Number blocks in depth-first order and initialize variables used
// in later stages of the algorithm.
unsigned N = 0;
static RegisterPass<PostDominatorTree>
F("postdomtree", "Post-Dominator Tree Construction", true);
+bool PostDominatorTree::runOnFunction(Function &F) {
+ reset(); // Reset from the last time we were run...
+
+ // Initialize the roots list
+ for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
+ TerminatorInst *Insn = I->getTerminator();
+ if (Insn->getNumSuccessors() == 0) {
+ // Unreachable block is not a root node.
+ if (!isa<UnreachableInst>(Insn))
+ Roots.push_back(I);
+ }
+
+ // Prepopulate maps so that we don't get iterator invalidation issues later.
+ IDoms[I] = 0;
+ DomTreeNodes[I] = 0;
+ }
+
+ Vertex.push_back(0);
+
+ PDTcalculate(*this, F);
+ return false;
+}
+
//===----------------------------------------------------------------------===//
// PostDominanceFrontier Implementation
//===----------------------------------------------------------------------===//
// Add a node for the root...
DT.DomTreeNodes[Root] = DT.RootNode = new DomTreeNode(Root, 0);
- DT.Vertex.push_back(0);
-
// Step #1: Number blocks in depth-first order and initialize variables used
// in later stages of the algorithm.
unsigned N = DFSPass<GraphTraits<BasicBlock*> >(DT, Root, 0);
bool DominatorTree::runOnFunction(Function &F) {
reset(); // Reset from the last time we were run...
+
+ // Initialize roots
Roots.push_back(&F.getEntryBlock());
+ IDoms[&F.getEntryBlock()] = 0;
+ DomTreeNodes[&F.getEntryBlock()] = 0;
+ Vertex.push_back(0);
+
DTcalculate(*this, F);
return false;
}