From b9e705f09eb66649e6d1e49c52b7ae7043b611b4 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 6 Mar 2007 17:52:53 +0000 Subject: [PATCH] Keep track of higher level analysis. llvm-svn: 34974 --- include/llvm/PassManagers.h | 9 +++++++++ lib/VMCore/PassManager.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 0bc2def3163..fd78833a85a 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -228,6 +228,11 @@ public: InheritedAnalysis[i] = NULL; } + // Return true if P preserves high level analysis used by other + // passes that are managed by this manager. + bool preserveHigherLevelAnalysis(Pass *P); + + /// Populate RequiredPasses with the analysis pass that are required by /// pass P. void collectRequiredAnalysisPasses(std::vector &RequiredPasses, @@ -298,6 +303,10 @@ private: // scheduled to run. std::map AvailableAnalysis; + // Collection of higher level analysis used by the pass managed by + // this manager. + std::vector HigherLevelAnalysis; + unsigned Depth; }; diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 72804be1007..60c002cd280 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -532,6 +532,30 @@ void PMDataManager::recordAvailableAnalysis(Pass *P) { } } +// Return true if P preserves high level analysis used by other +// passes managed by this manager +bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) { + + AnalysisUsage AnUsage; + P->getAnalysisUsage(AnUsage); + + if (AnUsage.getPreservesAll()) + return true; + + const std::vector &PreservedSet = AnUsage.getPreservedSet(); + for (std::vector::iterator I = HigherLevelAnalysis.begin(), + E = HigherLevelAnalysis.end(); I != E; ++I) { + Pass *P1 = *I; + if (std::find(PreservedSet.begin(), PreservedSet.end(), P1->getPassInfo()) == + PreservedSet.end()) { + if (!dynamic_cast(P1)) + return false; + } + } + + return true; +} + /// Remove Analyss not preserved by Pass P void PMDataManager::removeNotPreservedAnalysis(Pass *P) { AnalysisUsage AnUsage; @@ -634,6 +658,8 @@ void PMDataManager::add(Pass *P, else if (PDepth > RDepth) { // Let the parent claim responsibility of last use TransferLastUses.push_back(PRequired); + // Keep track of higher level analysis used by this manager. + HigherLevelAnalysis.push_back(PRequired); } else { // Note : This feature is not yet implemented assert (0 &&