diff options
| author | Hongbin Zheng <etherzhhb@gmail.com> | 2016-02-25 16:33:06 +0000 |
|---|---|---|
| committer | Hongbin Zheng <etherzhhb@gmail.com> | 2016-02-25 16:33:06 +0000 |
| commit | a0273a04f53e89c6ef771a73ddedc4c25bbf62d9 (patch) | |
| tree | acc9cc0cde44a120159c5678c46f6adcdb8f51cc /llvm/include | |
| parent | 148445ef985eedf7d2d05467b5b8d634fc156bd6 (diff) | |
| download | bcm5719-llvm-a0273a04f53e89c6ef771a73ddedc4c25bbf62d9.tar.gz bcm5719-llvm-a0273a04f53e89c6ef771a73ddedc4c25bbf62d9.zip | |
Introduce analysis pass to compute PostDominators in the new pass manager. NFC
Differential Revision: http://reviews.llvm.org/D17537
llvm-svn: 261882
Diffstat (limited to 'llvm/include')
| -rw-r--r-- | llvm/include/llvm/Analysis/PostDominators.h | 89 | ||||
| -rw-r--r-- | llvm/include/llvm/InitializePasses.h | 2 |
2 files changed, 41 insertions, 50 deletions
diff --git a/llvm/include/llvm/Analysis/PostDominators.h b/llvm/include/llvm/Analysis/PostDominators.h index 0f7e2b88d2d..07d1a86f0d1 100644 --- a/llvm/include/llvm/Analysis/PostDominators.h +++ b/llvm/include/llvm/Analysis/PostDominators.h @@ -17,76 +17,67 @@ #include "llvm/IR/Dominators.h" namespace llvm { +// FIXME: Replace this brittle forward declaration with the include of the new +// PassManager.h when doing so doesn't break the PassManagerBuilder. +class PreservedAnalyses; /// PostDominatorTree Class - Concrete subclass of DominatorTree that is used to /// compute the post-dominator tree. /// -struct PostDominatorTree : public FunctionPass { - static char ID; // Pass identification, replacement for typeid - DominatorTreeBase<BasicBlock>* DT; +struct PostDominatorTree : public DominatorTreeBase<BasicBlock> { + PostDominatorTree() : DominatorTreeBase<BasicBlock>(true) {} +}; - PostDominatorTree() : FunctionPass(ID) { - initializePostDominatorTreePass(*PassRegistry::getPassRegistry()); - DT = new DominatorTreeBase<BasicBlock>(true); - } +/// \brief Analysis pass which computes a \c PostDominatorTree. +class PostDominatorTreeAnalysis { +public: + /// \brief Provide the result typedef for this analysis pass. + typedef PostDominatorTree Result; - ~PostDominatorTree() override; + /// \brief Opaque, unique identifier for this analysis pass. + static void *ID() { return (void *)&PassID; } - bool runOnFunction(Function &F) override; + /// \brief Run the analysis pass over a function and produce a post dominator + /// tree. + PostDominatorTree run(Function &F); - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesAll(); - } + /// \brief Provide access to a name for this pass for debugging purposes. + static StringRef name() { return "PostDominatorTreeAnalysis"; } - 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); - } +private: + static char PassID; +}; - inline DomTreeNode *getNode(BasicBlock *BB) const { - return DT->getNode(BB); - } +/// \brief Printer pass for the \c PostDominatorTree. +class PostDominatorTreePrinterPass { + raw_ostream &OS; - inline bool dominates(DomTreeNode* A, DomTreeNode* B) const { - return DT->dominates(A, B); - } +public: + explicit PostDominatorTreePrinterPass(raw_ostream &OS); + PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM); - inline bool dominates(const BasicBlock* A, const BasicBlock* B) const { - return DT->dominates(A, B); - } + static StringRef name() { return "PostDominatorTreePrinterPass"; } +}; - inline bool properlyDominates(const DomTreeNode* A, DomTreeNode* B) const { - return DT->properlyDominates(A, B); - } +struct PostDominatorTreeWrapperPass : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + PostDominatorTree DT; - inline bool properlyDominates(BasicBlock* A, BasicBlock* B) const { - return DT->properlyDominates(A, B); + PostDominatorTreeWrapperPass() : FunctionPass(ID) { + initializePostDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry()); } - inline BasicBlock *findNearestCommonDominator(BasicBlock *A, BasicBlock *B) { - return DT->findNearestCommonDominator(A, B); - } + PostDominatorTree &getPostDomTree() { return DT; } + const PostDominatorTree &getPostDomTree() const { return DT; } - inline const BasicBlock *findNearestCommonDominator(const BasicBlock *A, - const BasicBlock *B) { - return DT->findNearestCommonDominator(A, B); - } + bool runOnFunction(Function &F) override; - /// Get all nodes post-dominated by R, including R itself. - void getDescendants(BasicBlock *R, - SmallVectorImpl<BasicBlock *> &Result) const { - DT->getDescendants(R, Result); + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesAll(); } void releaseMemory() override { - DT->releaseMemory(); + DT.releaseMemory(); } void print(raw_ostream &OS, const Module*) const override; diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 296962ba2a0..5f2b886a18a 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -232,7 +232,7 @@ void initializePostDomOnlyPrinterPass(PassRegistry&); void initializePostDomOnlyViewerPass(PassRegistry&); void initializePostDomPrinterPass(PassRegistry&); void initializePostDomViewerPass(PassRegistry&); -void initializePostDominatorTreePass(PassRegistry&); +void initializePostDominatorTreeWrapperPassPass(PassRegistry&); void initializePostOrderFunctionAttrsLegacyPassPass(PassRegistry&); void initializePostRASchedulerPass(PassRegistry&); void initializePostMachineSchedulerPass(PassRegistry&); |

