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/Assembly/Writer.h" 23 #include "llvm/Analysis/DominatorInternals.h" 24 using namespace llvm; 25 26 //===----------------------------------------------------------------------===// 27 // PostDominatorTree Implementation 28 //===----------------------------------------------------------------------===// 29 30 char PostDominatorTree::ID = 0; 31 char PostDominanceFrontier::ID = 0; 32 INITIALIZE_PASS(PostDominatorTree, "postdomtree", 33 "Post-Dominator Tree Construction", true, true) 34 35 bool PostDominatorTree::runOnFunction(Function &F) { 36 DT->recalculate(F); 37 return false; 38 } 39 40 PostDominatorTree::~PostDominatorTree() { 41 delete DT; 42 } 43 44 void PostDominatorTree::print(raw_ostream &OS, const Module *) const { 45 DT->print(OS); 46 } 47 48 49 FunctionPass* llvm::createPostDomTree() { 50 return new PostDominatorTree(); 51 } 52 53 //===----------------------------------------------------------------------===// 54 // PostDominanceFrontier Implementation 55 //===----------------------------------------------------------------------===// 56 57 INITIALIZE_PASS_BEGIN(PostDominanceFrontier, "postdomfrontier", 58 "Post-Dominance Frontier Construction", true, true) 59 INITIALIZE_PASS_DEPENDENCY(PostDominatorTree) 60 INITIALIZE_PASS_END(PostDominanceFrontier, "postdomfrontier", 61 "Post-Dominance Frontier Construction", true, true) 62 63 const DominanceFrontier::DomSetType & 64 PostDominanceFrontier::calculate(const PostDominatorTree &DT, 65 const DomTreeNode *Node) { 66 // Loop over CFG successors to calculate DFlocal[Node] 67 BasicBlock *BB = Node->getBlock(); 68 DomSetType &S = Frontiers[BB]; // The new set to fill in... 69 if (getRoots().empty()) return S; 70 71 if (BB) 72 for (pred_iterator SI = pred_begin(BB), SE = pred_end(BB); 73 SI != SE; ++SI) { 74 BasicBlock *P = *SI; 75 // Does Node immediately dominate this predecessor? 76 DomTreeNode *SINode = DT[P]; 77 if (SINode && SINode->getIDom() != Node) 78 S.insert(P); 79 } 80 81 // At this point, S is DFlocal. Now we union in DFup's of our children... 82 // Loop through and visit the nodes that Node immediately dominates (Node's 83 // children in the IDomTree) 84 // 85 for (DomTreeNode::const_iterator 86 NI = Node->begin(), NE = Node->end(); NI != NE; ++NI) { 87 DomTreeNode *IDominee = *NI; 88 const DomSetType &ChildDF = calculate(DT, IDominee); 89 90 DomSetType::const_iterator CDFI = ChildDF.begin(), CDFE = ChildDF.end(); 91 for (; CDFI != CDFE; ++CDFI) { 92 if (!DT.properlyDominates(Node, DT[*CDFI])) 93 S.insert(*CDFI); 94 } 95 } 96 97 return S; 98 } 99 100 FunctionPass* llvm::createPostDomFrontier() { 101 return new PostDominanceFrontier(); 102 } 103