summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
authorHongbin Zheng <etherzhhb@gmail.com>2016-02-25 16:33:06 +0000
committerHongbin Zheng <etherzhhb@gmail.com>2016-02-25 16:33:06 +0000
commita0273a04f53e89c6ef771a73ddedc4c25bbf62d9 (patch)
treeacc9cc0cde44a120159c5678c46f6adcdb8f51cc /llvm/include
parent148445ef985eedf7d2d05467b5b8d634fc156bd6 (diff)
downloadbcm5719-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.h89
-rw-r--r--llvm/include/llvm/InitializePasses.h2
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&);
OpenPOWER on IntegriCloud