1 //===- PostDominators.cpp - Post-Dominator Calculation --------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the post-dominator construction algorithms. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #define DEBUG_TYPE "postdomtree" 15 16 #include "llvm/Analysis/PostDominators.h" 17 #include "llvm/Instructions.h" 18 #include "llvm/Support/CFG.h" 19 #include "llvm/Support/Debug.h" 20 #include "llvm/ADT/DepthFirstIterator.h" 21 #include "llvm/ADT/SetOperations.h" 22 #include "llvm/Analysis/DominatorInternals.h" 23 using namespace llvm; 24 25 //===----------------------------------------------------------------------===// 26 // PostDominatorTree Implementation 27 //===----------------------------------------------------------------------===// 28 29 char PostDominatorTree::ID = 0; 30 char PostDominanceFrontier::ID = 0; 31 static RegisterPass<PostDominatorTree> 32 F("postdomtree", "Post-Dominator Tree Construction", true, true); 33 34 bool PostDominatorTree::runOnFunction(Function &F) { 35 DT->recalculate(F); 36 return false; 37 } 38 39 PostDominatorTree::~PostDominatorTree() { 40 delete DT; 41 } 42 43 void PostDominatorTree::print(raw_ostream &OS, const Module *) const { 44 DT->print(OS); 45 } 46 47 48 FunctionPass* llvm::createPostDomTree() { 49 return new PostDominatorTree(); 50 } 51 52 //===----------------------------------------------------------------------===// 53 // PostDominanceFrontier Implementation 54 //===----------------------------------------------------------------------===// 55 56 static RegisterPass<PostDominanceFrontier> 57 H("postdomfrontier", "Post-Dominance Frontier Construction", true, true); 58 59 const DominanceFrontier::DomSetType & 60 PostDominanceFrontier::calculate(const PostDominatorTree &DT, 61 const DomTreeNode *Node) { 62 // Loop over CFG successors to calculate DFlocal[Node] 63 BasicBlock *BB = Node->getBlock(); 64 DomSetType &S = Frontiers[BB]; // The new set to fill in... 65 if (getRoots().empty()) return S; 66 67 if (BB) 68 for (pred_iterator SI = pred_begin(BB), SE = pred_end(BB); 69 SI != SE; ++SI) { 70 // Does Node immediately dominate this predecessor? 71 DomTreeNode *SINode = DT[*SI]; 72 if (SINode && SINode->getIDom() != Node) 73 S.insert(*SI); 74 } 75 76 // At this point, S is DFlocal. Now we union in DFup's of our children... 77 // Loop through and visit the nodes that Node immediately dominates (Node's 78 // children in the IDomTree) 79 // 80 for (DomTreeNode::const_iterator 81 NI = Node->begin(), NE = Node->end(); NI != NE; ++NI) { 82 DomTreeNode *IDominee = *NI; 83 const DomSetType &ChildDF = calculate(DT, IDominee); 84 85 DomSetType::const_iterator CDFI = ChildDF.begin(), CDFE = ChildDF.end(); 86 for (; CDFI != CDFE; ++CDFI) { 87 if (!DT.properlyDominates(Node, DT[*CDFI])) 88 S.insert(*CDFI); 89 } 90 } 91 92 return S; 93 } 94 95 FunctionPass* llvm::createPostDomFrontier() { 96 return new PostDominanceFrontier(); 97 } 98