summaryrefslogtreecommitdiff
path: root/lib/IR
diff options
context:
space:
mode:
Diffstat (limited to 'lib/IR')
-rw-r--r--lib/IR/PassManager.cpp40
1 files changed, 22 insertions, 18 deletions
diff --git a/lib/IR/PassManager.cpp b/lib/IR/PassManager.cpp
index 35fc534151..0508b3cb28 100644
--- a/lib/IR/PassManager.cpp
+++ b/lib/IR/PassManager.cpp
@@ -12,20 +12,24 @@
using namespace llvm;
-void ModulePassManager::run(Module *M) {
- for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx)
- if (Passes[Idx]->run(M))
- if (AM)
- AM->invalidateAll(M);
+PreservedAnalyses ModulePassManager::run(Module *M) {
+ PreservedAnalyses PA = PreservedAnalyses::all();
+ for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
+ PreservedAnalyses PassPA = Passes[Idx]->run(M);
+ if (AM)
+ AM->invalidate(M, PassPA);
+ PA.intersect(llvm_move(PassPA));
+ }
+ return PA;
}
-void ModuleAnalysisManager::invalidateAll(Module *M) {
+void ModuleAnalysisManager::invalidate(Module *M, const PreservedAnalyses &PA) {
// FIXME: This is a total hack based on the fact that erasure doesn't
// invalidate iteration for DenseMap.
for (ModuleAnalysisResultMapT::iterator I = ModuleAnalysisResults.begin(),
E = ModuleAnalysisResults.end();
I != E; ++I)
- if (I->second->invalidate(M))
+ if (!PA.preserved(I->first) && I->second->invalidate(M))
ModuleAnalysisResults.erase(I);
}
@@ -53,18 +57,18 @@ void ModuleAnalysisManager::invalidateImpl(void *PassID, Module *M) {
ModuleAnalysisResults.erase(PassID);
}
-bool FunctionPassManager::run(Function *F) {
- bool Changed = false;
- for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx)
- if (Passes[Idx]->run(F)) {
- Changed = true;
- if (AM)
- AM->invalidateAll(F);
- }
- return Changed;
+PreservedAnalyses FunctionPassManager::run(Function *F) {
+ PreservedAnalyses PA = PreservedAnalyses::all();
+ for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
+ PreservedAnalyses PassPA = Passes[Idx]->run(F);
+ if (AM)
+ AM->invalidate(F, PassPA);
+ PA.intersect(llvm_move(PassPA));
+ }
+ return PA;
}
-void FunctionAnalysisManager::invalidateAll(Function *F) {
+void FunctionAnalysisManager::invalidate(Function *F, const PreservedAnalyses &PA) {
// Clear all the invalidated results associated specifically with this
// function.
SmallVector<void *, 8> InvalidatedPassIDs;
@@ -72,7 +76,7 @@ void FunctionAnalysisManager::invalidateAll(Function *F) {
for (FunctionAnalysisResultListT::iterator I = ResultsList.begin(),
E = ResultsList.end();
I != E;)
- if (I->second->invalidate(F)) {
+ if (!PA.preserved(I->first) && I->second->invalidate(F)) {
InvalidatedPassIDs.push_back(I->first);
I = ResultsList.erase(I);
} else {