| //=- 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 |