//=- llvm/Analysis/PostDominators.h - Post Dominator Calculation-*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and 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 { /// PostDominatorSet Class - Concrete subclass of DominatorSetBase that is used /// to compute the post-dominator set. Because there can be multiple exit nodes /// in an LLVM function, we calculate post dominators with a special null block /// which is the virtual exit node that the real exit nodes all virtually branch /// to. Clients should be prepared to see an entry in the dominator sets with a /// null BasicBlock*. /// struct PostDominatorSet : public DominatorSetBase { PostDominatorSet() : DominatorSetBase(true) {} virtual bool runOnFunction(Function &F); /// getAnalysisUsage - This pass does not modify the function at all. /// virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } }; /// ImmediatePostDominators Class - Concrete subclass of ImmediateDominatorsBase /// that is used to compute the immediate post-dominators. /// struct ImmediatePostDominators : public ImmediateDominatorsBase { ImmediatePostDominators() : ImmediateDominatorsBase(true) {} virtual bool runOnFunction(Function &F) { IDoms.clear(); // Reset from the last time we were run... PostDominatorSet &DS = getAnalysis(); Roots = DS.getRoots(); calcIDoms(DS); return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); } private: void calcIDoms(const DominatorSetBase &DS); }; /// PostDominatorTree Class - Concrete subclass of DominatorTree that is used to /// compute the a post-dominator tree. /// struct PostDominatorTree : public DominatorTreeBase { PostDominatorTree() : DominatorTreeBase(true) {} virtual bool runOnFunction(Function &F) { reset(); // Reset from the last time we were run... PostDominatorSet &DS = getAnalysis(); Roots = DS.getRoots(); calculate(DS); return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); } private: void calculate(const PostDominatorSet &DS); }; /// PostETForest Class - Concrete subclass of ETForestBase that is used to /// compute a forwards post-dominator ET-Forest. struct PostETForest : public ETForestBase { PostETForest() : ETForestBase(true) {} virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); } virtual bool runOnFunction(Function &F) { reset(); // Reset from the last time we were run... ImmediatePostDominators &ID = getAnalysis(); Roots = ID.getRoots(); calculate(ID); return false; } void calculate(const ImmediatePostDominators &ID); ETNode *getNodeForBlock(BasicBlock *BB); }; /// PostDominanceFrontier Class - Concrete subclass of DominanceFrontier that is /// used to compute the a post-dominance frontier. /// struct PostDominanceFrontier : public DominanceFrontierBase { PostDominanceFrontier() : DominanceFrontierBase(true) {} virtual bool runOnFunction(Function &) { Frontiers.clear(); PostDominatorTree &DT = getAnalysis(); Roots = DT.getRoots(); if (const DominatorTree::Node *Root = DT.getRootNode()) calculate(DT, Root); return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); } // stub - dummy function, just ignore it static void stub(); private: const DomSetType &calculate(const PostDominatorTree &DT, const DominatorTree::Node *Node); }; // Make sure that any clients of this file link in PostDominators.cpp static IncludeFile POST_DOMINATOR_INCLUDE_FILE((void*)&PostDominanceFrontier::stub); } // End llvm namespace #endif