diff options
author | Devang Patel <dpatel@apple.com> | 2007-03-06 17:52:53 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-03-06 17:52:53 +0000 |
commit | 9d9fc909528ce73287d4af1f54d6188425978e65 (patch) | |
tree | d1e86b194e2e62f59a1f3e7664cfeee47214822c /llvm/lib/VMCore/PassManager.cpp | |
parent | 87052bc86fe09dd29b46767a54aa9c88273ba6ef (diff) | |
download | bcm5719-llvm-9d9fc909528ce73287d4af1f54d6188425978e65.tar.gz bcm5719-llvm-9d9fc909528ce73287d4af1f54d6188425978e65.zip |
Keep track of higher level analysis.
llvm-svn: 34974
Diffstat (limited to 'llvm/lib/VMCore/PassManager.cpp')
-rw-r--r-- | llvm/lib/VMCore/PassManager.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/VMCore/PassManager.cpp b/llvm/lib/VMCore/PassManager.cpp index 72804be1007..60c002cd280 100644 --- a/llvm/lib/VMCore/PassManager.cpp +++ b/llvm/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<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); + for (std::vector<Pass *>::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<ImmutablePass*>(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 && |