summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2017-01-15 06:32:49 +0000
committerChandler Carruth <chandlerc@gmail.com>2017-01-15 06:32:49 +0000
commitca68a3ec47416185252b84d2bf60710c88be155f (patch)
treeee01d0ac2b40351bb1a659719488d3db1ca43268 /llvm/lib/IR
parentf1388ef006fa87b5799e4bb7cc0662e0b644b35d (diff)
downloadbcm5719-llvm-ca68a3ec47416185252b84d2bf60710c88be155f.tar.gz
bcm5719-llvm-ca68a3ec47416185252b84d2bf60710c88be155f.zip
[PM] Introduce an analysis set used to preserve all analyses over
a function's CFG when that CFG is unchanged. This allows transformation passes to simply claim they preserve the CFG and analysis passes to check for the CFG being preserved to remove the fanout of all analyses being listed in all passes. I've gone through and removed or cleaned up as many of the comments reminding us to do this as I could. Differential Revision: https://reviews.llvm.org/D28627 llvm-svn: 292054
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/Dominators.cpp9
-rw-r--r--llvm/lib/IR/PassManager.cpp2
2 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/IR/Dominators.cpp b/llvm/lib/IR/Dominators.cpp
index 1880807da7e..009326825cd 100644
--- a/llvm/lib/IR/Dominators.cpp
+++ b/llvm/lib/IR/Dominators.cpp
@@ -73,6 +73,15 @@ template void llvm::Calculate<Function, Inverse<BasicBlock *>>(
GraphTraits<Inverse<BasicBlock *>>::NodeRef>::type> &DT,
Function &F);
+bool DominatorTree::invalidate(Function &F, const PreservedAnalyses &PA,
+ FunctionAnalysisManager::Invalidator &) {
+ // Check whether the analysis, all analyses on functions, or the function's
+ // CFG have been preserved.
+ auto PAC = PA.getChecker<DominatorTreeAnalysis>();
+ return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
+ PAC.preservedSet<CFGAnalyses>());
+}
+
// dominates - Return true if Def dominates a use in User. This performs
// the special checks necessary if Def and User are in the same basic block.
// Note that Def doesn't dominate a use in Def itself!
diff --git a/llvm/lib/IR/PassManager.cpp b/llvm/lib/IR/PassManager.cpp
index 8f68bb1daec..47fdfedfdde 100644
--- a/llvm/lib/IR/PassManager.cpp
+++ b/llvm/lib/IR/PassManager.cpp
@@ -91,4 +91,6 @@ bool FunctionAnalysisManagerModuleProxy::Result::invalidate(
}
}
+AnalysisSetKey CFGAnalyses::SetKey;
+
AnalysisSetKey PreservedAnalyses::AllAnalysesKey;
OpenPOWER on IntegriCloud