Changes in directory llvm/lib/VMCore:
PassManager.cpp updated: 1.11 -> 1.12 --- Log message: Keep track of analysis required by the passes. Force use of new pass manager if a pass does not preserve analysis that is used by other passes. --- Diffs of the changes: (+18 -5) PassManager.cpp | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-) Index: llvm/lib/VMCore/PassManager.cpp diff -u llvm/lib/VMCore/PassManager.cpp:1.11 llvm/lib/VMCore/PassManager.cpp:1.12 --- llvm/lib/VMCore/PassManager.cpp:1.11 Fri Nov 10 15:33:13 2006 +++ llvm/lib/VMCore/PassManager.cpp Fri Nov 10 18:42:16 2006 @@ -142,9 +142,18 @@ AnalysisUsage AnUsage; P->getAnalysisUsage(AnUsage); - // If this pass is not preserving information that is required by the other passes - // managed by this manager then use new manager - // TODO + // If this pass is not preserving information that is required by the other + // passes managed by this manager then use new manager + if (!AnUsage.getPreservesAll()) { + const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); + for (std::vector<AnalysisID>::iterator I = RequiredAnalysis.begin(), + E = RequiredAnalysis.end(); I != E; ++I) { + if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) == + PreservedSet.end()) + // This analysis is not preserved. Need new manager. + return false; + } + } return true; } @@ -157,8 +166,12 @@ /// Augment RequiredSet by adding analysis required by pass P. void CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) { + AnalysisUsage AnUsage; + P->getAnalysisUsage(AnUsage); + const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); - // TODO + // FIXME: What about duplicates ? + RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(), RequiredSet.end()); } /// Remove AnalysisID from the RequiredSet @@ -375,7 +388,7 @@ bool PassManagerImpl_New::addPass(Pass *P) { - if (!activeManager) { + if (!activeManager || !activeManager->addPass(P)) { activeManager = new ModulePassManager_New(); PassManagers.push_back(activeManager); } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits