|  | //=- llvm/Analysis/PostDominators.h - Post Dominator Calculation-*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file exposes interfaces to post dominance information. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_ANALYSIS_POST_DOMINATORS_H | 
|  | #define LLVM_ANALYSIS_POST_DOMINATORS_H | 
|  |  | 
|  | #include "llvm/Analysis/Dominators.h" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | /// PostDominatorTree Class - Concrete subclass of DominatorTree that is used to | 
|  | /// compute the a post-dominator tree. | 
|  | /// | 
|  | struct PostDominatorTree : public FunctionPass { | 
|  | static char ID; // Pass identification, replacement for typeid | 
|  | DominatorTreeBase<BasicBlock>* DT; | 
|  |  | 
|  | PostDominatorTree() : FunctionPass(ID) { | 
|  | initializePostDominatorTreePass(*PassRegistry::getPassRegistry()); | 
|  | DT = new DominatorTreeBase<BasicBlock>(true); | 
|  | } | 
|  |  | 
|  | ~PostDominatorTree(); | 
|  |  | 
|  | virtual bool runOnFunction(Function &F); | 
|  |  | 
|  | virtual void getAnalysisUsage(AnalysisUsage &AU) const { | 
|  | AU.setPreservesAll(); | 
|  | } | 
|  |  | 
|  | inline const std::vector<BasicBlock*> &getRoots() const { | 
|  | return DT->getRoots(); | 
|  | } | 
|  |  | 
|  | inline DomTreeNode *getRootNode() const { | 
|  | return DT->getRootNode(); | 
|  | } | 
|  |  | 
|  | inline DomTreeNode *operator[](BasicBlock *BB) const { | 
|  | return DT->getNode(BB); | 
|  | } | 
|  |  | 
|  | inline DomTreeNode *getNode(BasicBlock *BB) const { | 
|  | return DT->getNode(BB); | 
|  | } | 
|  |  | 
|  | inline bool dominates(DomTreeNode* A, DomTreeNode* B) const { | 
|  | return DT->dominates(A, B); | 
|  | } | 
|  |  | 
|  | inline bool dominates(const BasicBlock* A, const BasicBlock* B) const { | 
|  | return DT->dominates(A, B); | 
|  | } | 
|  |  | 
|  | inline bool properlyDominates(const DomTreeNode* A, DomTreeNode* B) const { | 
|  | return DT->properlyDominates(A, B); | 
|  | } | 
|  |  | 
|  | inline bool properlyDominates(BasicBlock* A, BasicBlock* B) const { | 
|  | return DT->properlyDominates(A, B); | 
|  | } | 
|  |  | 
|  | inline BasicBlock *findNearestCommonDominator(BasicBlock *A, BasicBlock *B) { | 
|  | return DT->findNearestCommonDominator(A, B); | 
|  | } | 
|  |  | 
|  | virtual void releaseMemory() { | 
|  | DT->releaseMemory(); | 
|  | } | 
|  |  | 
|  | virtual void print(raw_ostream &OS, const Module*) const; | 
|  | }; | 
|  |  | 
|  | FunctionPass* createPostDomTree(); | 
|  |  | 
|  | template <> struct GraphTraits<PostDominatorTree*> | 
|  | : public GraphTraits<DomTreeNode*> { | 
|  | static NodeType *getEntryNode(PostDominatorTree *DT) { | 
|  | return DT->getRootNode(); | 
|  | } | 
|  |  | 
|  | static nodes_iterator nodes_begin(PostDominatorTree *N) { | 
|  | if (getEntryNode(N)) | 
|  | return df_begin(getEntryNode(N)); | 
|  | else | 
|  | return df_end(getEntryNode(N)); | 
|  | } | 
|  |  | 
|  | static nodes_iterator nodes_end(PostDominatorTree *N) { | 
|  | return df_end(getEntryNode(N)); | 
|  | } | 
|  | }; | 
|  |  | 
|  | } // End llvm namespace | 
|  |  | 
|  | #endif |