PostDominators.h revision 794fd75c67a2cdc128d67342c6d88a504d186896
1//=- llvm/Analysis/PostDominators.h - Post Dominator Calculation-*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file exposes interfaces to post dominance information. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_ANALYSIS_POST_DOMINATORS_H 15#define LLVM_ANALYSIS_POST_DOMINATORS_H 16 17#include "llvm/Analysis/Dominators.h" 18 19namespace llvm { 20 21/// PostDominatorTree Class - Concrete subclass of DominatorTree that is used to 22/// compute the a post-dominator tree. 23/// 24struct PostDominatorTree : public DominatorTreeBase { 25 static const int ID; // Pass identifcation, replacement for typeid 26 27 PostDominatorTree() : 28 DominatorTreeBase((intptr_t)&ID, true) {} 29 30 virtual bool runOnFunction(Function &F) { 31 reset(); // Reset from the last time we were run... 32 calculate(F); 33 return false; 34 } 35 36 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 37 AU.setPreservesAll(); 38 } 39private: 40 void calculate(Function &F); 41 Node *getNodeForBlock(BasicBlock *BB); 42 unsigned DFSPass(BasicBlock *V, InfoRec &VInfo,unsigned N); 43 void Compress(BasicBlock *V, InfoRec &VInfo); 44 BasicBlock *Eval(BasicBlock *V); 45 void Link(BasicBlock *V, BasicBlock *W, InfoRec &WInfo); 46 47 inline BasicBlock *getIDom(BasicBlock *BB) const { 48 std::map<BasicBlock*, BasicBlock*>::const_iterator I = IDoms.find(BB); 49 return I != IDoms.end() ? I->second : 0; 50 } 51}; 52 53 54/// PostETForest Class - Concrete subclass of ETForestBase that is used to 55/// compute a forwards post-dominator ET-Forest. 56struct PostETForest : public ETForestBase { 57 static const int ID; 58 PostETForest() : ETForestBase((intptr_t)&ID, true) {} 59 60 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 61 AU.setPreservesAll(); 62 AU.addRequired<PostDominatorTree>(); 63 } 64 65 virtual bool runOnFunction(Function &F) { 66 reset(); // Reset from the last time we were run... 67 PostDominatorTree &DT = getAnalysis<PostDominatorTree>(); 68 Roots = DT.getRoots(); 69 calculate(DT); 70 return false; 71 } 72 73 void calculate(const PostDominatorTree &DT); 74 ETNode *getNodeForBlock(BasicBlock *BB); 75}; 76 77 78/// PostDominanceFrontier Class - Concrete subclass of DominanceFrontier that is 79/// used to compute the a post-dominance frontier. 80/// 81struct PostDominanceFrontier : public DominanceFrontierBase { 82 static const int ID; 83 PostDominanceFrontier() 84 : DominanceFrontierBase((intptr_t) &ID, true) {} 85 86 virtual bool runOnFunction(Function &) { 87 Frontiers.clear(); 88 PostDominatorTree &DT = getAnalysis<PostDominatorTree>(); 89 Roots = DT.getRoots(); 90 if (const DominatorTree::Node *Root = DT.getRootNode()) 91 calculate(DT, Root); 92 return false; 93 } 94 95 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 96 AU.setPreservesAll(); 97 AU.addRequired<PostDominatorTree>(); 98 } 99 100private: 101 const DomSetType &calculate(const PostDominatorTree &DT, 102 const DominatorTree::Node *Node); 103}; 104 105} // End llvm namespace 106 107// Make sure that any clients of this file link in PostDominators.cpp 108FORCE_DEFINING_FILE_TO_BE_LINKED(PostDominanceFrontier) 109 110#endif 111