Implement removeDeadPasses().


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31722 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index 2332fed..0f52b2d 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -53,7 +53,7 @@
   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 @@
   }
 }
 
+/// 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 @@
       BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
       Changed |= BP->runOnBasicBlock(*I);
       removeNotPreservedAnalysis(P);
-      removeDeadPasses();
+      removeDeadPasses(P);
     }
   return Changed;
 }
@@ -439,7 +458,7 @@
       FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
       Changed |= FP->runOnFunction(*I);
       removeNotPreservedAnalysis(P);
-      removeDeadPasses();
+      removeDeadPasses(P);
     }
   return Changed;
 }
@@ -514,7 +533,7 @@
     ModulePass *MP = dynamic_cast<ModulePass*>(P);
     Changed |= MP->runOnModule(M);
     removeNotPreservedAnalysis(P);
-    removeDeadPasses();
+    removeDeadPasses(P);
   }
   return Changed;
 }