PostDominators.h revision 22bf8f21b4e91eadc27207c4b0a7db3dd1756b4f
1//=- llvm/Analysis/PostDominators.h - Post Dominator Calculation-*- C++ -*-===// 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 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 FunctionPass { 25 static char ID; // Pass identification, replacement for typeid 26 DominatorTreeBase<BasicBlock>* DT; 27 28 PostDominatorTree() : FunctionPass(&ID) { 29 DT = new DominatorTreeBase<BasicBlock>(true); 30 } 31 32 ~PostDominatorTree(); 33 34 virtual bool runOnFunction(Function &F); 35 36 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 37 AU.setPreservesAll(); 38 } 39 40 inline const std::vector<BasicBlock*> &getRoots() const { 41 return DT->getRoots(); 42 } 43 44 inline DomTreeNode *getRootNode() const { 45 return DT->getRootNode(); 46 } 47 48 inline DomTreeNode *operator[](BasicBlock *BB) const { 49 return DT->getNode(BB); 50 } 51 52 inline bool dominates(DomTreeNode* A, DomTreeNode* B) const { 53 return DT->dominates(A, B); 54 } 55 56 inline bool dominates(const BasicBlock* A, const BasicBlock* B) const { 57 return DT->dominates(A, B); 58 } 59 60 inline bool properlyDominates(const DomTreeNode* A, DomTreeNode* B) const { 61 return DT->properlyDominates(A, B); 62 } 63 64 inline bool properlyDominates(BasicBlock* A, BasicBlock* B) const { 65 return DT->properlyDominates(A, B); 66 } 67 68 virtual void releaseMemory() { 69 DT->releaseMemory(); 70 } 71 72 virtual void print(raw_ostream &OS, const Module*) const; 73}; 74 75FunctionPass* createPostDomTree(); 76 77/// PostDominanceFrontier Class - Concrete subclass of DominanceFrontier that is 78/// used to compute the a post-dominance frontier. 79/// 80struct PostDominanceFrontier : public DominanceFrontierBase { 81 static char ID; 82 PostDominanceFrontier() 83 : DominanceFrontierBase(&ID, true) {} 84 85 virtual bool runOnFunction(Function &) { 86 Frontiers.clear(); 87 PostDominatorTree &DT = getAnalysis<PostDominatorTree>(); 88 Roots = DT.getRoots(); 89 if (const DomTreeNode *Root = DT.getRootNode()) 90 calculate(DT, Root); 91 return false; 92 } 93 94 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 95 AU.setPreservesAll(); 96 AU.addRequired<PostDominatorTree>(); 97 } 98 99private: 100 const DomSetType &calculate(const PostDominatorTree &DT, 101 const DomTreeNode *Node); 102}; 103 104FunctionPass* createPostDomFrontier(); 105 106} // End llvm namespace 107 108#endif 109