PostDominators.h revision 45cfe545ec8177262dabc70580ce05feaa1c3880
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 properlyDominates(const DomTreeNode* A, DomTreeNode* B) const { 53 return DT->properlyDominates(A, B); 54 } 55 56 inline bool properlyDominates(BasicBlock* A, BasicBlock* B) const { 57 return DT->properlyDominates(A, B); 58 } 59 60 virtual void print(raw_ostream &OS, const Module*) const; 61}; 62 63FunctionPass* createPostDomTree(); 64 65/// PostDominanceFrontier Class - Concrete subclass of DominanceFrontier that is 66/// used to compute the a post-dominance frontier. 67/// 68struct PostDominanceFrontier : public DominanceFrontierBase { 69 static char ID; 70 PostDominanceFrontier() 71 : DominanceFrontierBase(&ID, true) {} 72 73 virtual bool runOnFunction(Function &) { 74 Frontiers.clear(); 75 PostDominatorTree &DT = getAnalysis<PostDominatorTree>(); 76 Roots = DT.getRoots(); 77 if (const DomTreeNode *Root = DT.getRootNode()) 78 calculate(DT, Root); 79 return false; 80 } 81 82 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 83 AU.setPreservesAll(); 84 AU.addRequired<PostDominatorTree>(); 85 } 86 87private: 88 const DomSetType &calculate(const PostDominatorTree &DT, 89 const DomTreeNode *Node); 90}; 91 92FunctionPass* createPostDomFrontier(); 93 94} // End llvm namespace 95 96#endif 97