aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2006-11-14 03:05:08 +0000
committerDevang Patel <dpatel@apple.com>2006-11-14 03:05:08 +0000
commitdf1a10ece6a75f230d98c6fb001349eede90387a (patch)
tree32b0ecd8c77395ac3669557c7b5b56528e29ed92
parent03153c70de080e4c184ad29f0d78e456019b9a4c (diff)
Implement removeDeadPasses().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31722 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/VMCore/PassManager.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index 2332fed5de..0f52b2d674 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -53,7 +53,7 @@ public:
void removeNotPreservedAnalysis(Pass *P);
/// Remove dead passes
- void removeDeadPasses() { /* TODO : Implement */ }
+ void removeDeadPasses(Pass *P);
/// Add pass P into the PassVector. Update RequiredAnalysis and
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
@@ -292,6 +292,25 @@ void CommonPassManagerImpl::removeNotPreservedAnalysis(Pass *P) {
}
}
+/// Remove analysis passes that are not used any longer
+void CommonPassManagerImpl::removeDeadPasses(Pass *P) {
+
+ for (std::map<Pass *, Pass *>::iterator I = LastUser.begin(),
+ E = LastUser.end(); I !=E; ++I) {
+ if (I->second == P) {
+ Pass *deadPass = I->first;
+ deadPass->releaseMemory();
+
+ std::map<AnalysisID, Pass*>::iterator Pos =
+ AvailableAnalysis.find(deadPass->getPassInfo());
+
+ assert (Pos != AvailableAnalysis.end() &&
+ "Pass is not available");
+ AvailableAnalysis.erase(Pos);
+ }
+ }
+}
+
/// Add pass P into the PassVector. Update RequiredAnalysis and
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
void CommonPassManagerImpl::addPassToManager (Pass *P,
@@ -349,7 +368,7 @@ BasicBlockPassManager_New::runOnFunction(Function &F) {
BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
Changed |= BP->runOnBasicBlock(*I);
removeNotPreservedAnalysis(P);
- removeDeadPasses();
+ removeDeadPasses(P);
}
return Changed;
}
@@ -439,7 +458,7 @@ FunctionPassManagerImpl_New::runOnModule(Module &M) {
FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
Changed |= FP->runOnFunction(*I);
removeNotPreservedAnalysis(P);
- removeDeadPasses();
+ removeDeadPasses(P);
}
return Changed;
}
@@ -514,7 +533,7 @@ ModulePassManager_New::runOnModule(Module &M) {
ModulePass *MP = dynamic_cast<ModulePass*>(P);
Changed |= MP->runOnModule(M);
removeNotPreservedAnalysis(P);
- removeDeadPasses();
+ removeDeadPasses(P);
}
return Changed;
}