//=- 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* DT; PostDominatorTree() : FunctionPass(&ID) { DT = new DominatorTreeBase(true); } ~PostDominatorTree(); virtual bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } inline const std::vector &getRoots() const { return DT->getRoots(); } inline DomTreeNode *getRootNode() const { return DT->getRootNode(); } inline DomTreeNode *operator[](BasicBlock *BB) const { return DT->getNode(BB); } 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); } virtual void print(std::ostream &OS, const Module* M= 0) const { DT->print(OS, M); } }; FunctionPass* createPostDomTree(); /// PostDominanceFrontier Class - Concrete subclass of DominanceFrontier that is /// used to compute the a post-dominance frontier. /// struct PostDominanceFrontier : public DominanceFrontierBase { static char ID; PostDominanceFrontier() : DominanceFrontierBase(&ID, true) {} virtual bool runOnFunction(Function &) { Frontiers.clear(); PostDominatorTree &DT = getAnalysis(); Roots = DT.getRoots(); if (const DomTreeNode *Root = DT.getRootNode()) calculate(DT, Root); return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); } private: const DomSetType &calculate(const PostDominatorTree &DT, const DomTreeNode *Node); }; FunctionPass* createPostDomFrontier(); } // End llvm namespace #endif