00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef LLVM_ANALYSIS_POST_DOMINATORS_H
00015 #define LLVM_ANALYSIS_POST_DOMINATORS_H
00016
00017 #include "llvm/Analysis/Dominators.h"
00018
00019 namespace llvm {
00020
00024 struct PostDominatorTree : public FunctionPass {
00025 static char ID;
00026 DominatorTreeBase<BasicBlock>* DT;
00027
00028 PostDominatorTree() : FunctionPass(&ID) {
00029 DT = new DominatorTreeBase<BasicBlock>(true);
00030 }
00031
00032 ~PostDominatorTree();
00033
00034 virtual bool runOnFunction(Function &F);
00035
00036 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
00037 AU.setPreservesAll();
00038 }
00039
00040 inline const std::vector<BasicBlock*> &getRoots() const {
00041 return DT->getRoots();
00042 }
00043
00044 inline DomTreeNode *getRootNode() const {
00045 return DT->getRootNode();
00046 }
00047
00048 inline DomTreeNode *operator[](BasicBlock *BB) const {
00049 return DT->getNode(BB);
00050 }
00051
00052 inline DomTreeNode *getNode(BasicBlock *BB) const {
00053 return DT->getNode(BB);
00054 }
00055
00056 inline bool dominates(DomTreeNode* A, DomTreeNode* B) const {
00057 return DT->dominates(A, B);
00058 }
00059
00060 inline bool dominates(const BasicBlock* A, const BasicBlock* B) const {
00061 return DT->dominates(A, B);
00062 }
00063
00064 inline bool properlyDominates(const DomTreeNode* A, DomTreeNode* B) const {
00065 return DT->properlyDominates(A, B);
00066 }
00067
00068 inline bool properlyDominates(BasicBlock* A, BasicBlock* B) const {
00069 return DT->properlyDominates(A, B);
00070 }
00071
00072 inline BasicBlock *findNearestCommonDominator(BasicBlock *A, BasicBlock *B) {
00073 return DT->findNearestCommonDominator(A, B);
00074 }
00075
00076 virtual void releaseMemory() {
00077 DT->releaseMemory();
00078 }
00079
00080 virtual void print(raw_ostream &OS, const Module*) const;
00081 };
00082
00083 FunctionPass* createPostDomTree();
00084
00085 template <> struct GraphTraits<PostDominatorTree*>
00086 : public GraphTraits<DomTreeNode*> {
00087 static NodeType *getEntryNode(PostDominatorTree *DT) {
00088 return DT->getRootNode();
00089 }
00090
00091 static nodes_iterator nodes_begin(PostDominatorTree *N) {
00092 if (getEntryNode(N))
00093 return df_begin(getEntryNode(N));
00094 else
00095 return df_end(getEntryNode(N));
00096 }
00097
00098 static nodes_iterator nodes_end(PostDominatorTree *N) {
00099 return df_end(getEntryNode(N));
00100 }
00101 };
00102
00106 struct PostDominanceFrontier : public DominanceFrontierBase {
00107 static char ID;
00108 PostDominanceFrontier()
00109 : DominanceFrontierBase(&ID, true) {}
00110
00111 virtual bool runOnFunction(Function &) {
00112 Frontiers.clear();
00113 PostDominatorTree &DT = getAnalysis<PostDominatorTree>();
00114 Roots = DT.getRoots();
00115 if (const DomTreeNode *Root = DT.getRootNode())
00116 calculate(DT, Root);
00117 return false;
00118 }
00119
00120 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
00121 AU.setPreservesAll();
00122 AU.addRequired<PostDominatorTree>();
00123 }
00124
00125 private:
00126 const DomSetType &calculate(const PostDominatorTree &DT,
00127 const DomTreeNode *Node);
00128 };
00129
00130 FunctionPass* createPostDomFrontier();
00131
00132 }
00133
00134 #endif