- (Value*)M);
- PMDebug::PrintAnalysisSetInfo(getDepth(), "Destroyed", P, Destroyed);
- PMDebug::PrintAnalysisSetInfo(getDepth(), "Provided", P, Provided);
-
- // Erase all analyses in the destroyed set...
- for (Pass::AnalysisSet::iterator I = Destroyed.begin(),
- E = Destroyed.end(); I != E; ++I)
- CurrentAnalyses.erase(*I);
-
+ (Annotable*)M);
+ PMDebug::PrintAnalysisSetInfo(getDepth(), "Preserved", P,
+ AnUsage.getPreservedSet());
+ PMDebug::PrintAnalysisSetInfo(getDepth(), "Provided", P,
+ AnUsage.getProvidedSet());
+
+
+ // Erase all analyses not in the preserved set...
+ if (!AnUsage.preservesAll()) {
+ const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
+ for (std::map<AnalysisID, Pass*>::iterator I = CurrentAnalyses.begin(),
+ E = CurrentAnalyses.end(); I != E; )
+ if (std::find(PreservedSet.begin(), PreservedSet.end(), I->first) !=
+ PreservedSet.end())
+ ++I; // This analysis is preserved, leave it in the available set...
+ else {
+#if MAP_DOESNT_HAVE_BROKEN_ERASE_MEMBER
+ I = CurrentAnalyses.erase(I); // Analysis not preserved!
+#else
+ // GCC 2.95.3 STL doesn't have correct erase member!
+ CurrentAnalyses.erase(I);
+ I = CurrentAnalyses.begin();
+#endif
+ }
+ }
+