diff options
author | Devang Patel <dpatel@apple.com> | 2007-03-06 01:55:46 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-03-06 01:55:46 +0000 |
commit | fe613905b371ef7160968cdaabf6074cfa10f4a0 (patch) | |
tree | 117eaa2b5e108e62103852008654c9d168be6242 /lib | |
parent | 22a1cf9d3a5c829d260bcf44ffe6b34ecf16076c (diff) | |
download | external_llvm-fe613905b371ef7160968cdaabf6074cfa10f4a0.zip external_llvm-fe613905b371ef7160968cdaabf6074cfa10f4a0.tar.gz external_llvm-fe613905b371ef7160968cdaabf6074cfa10f4a0.tar.bz2 |
Keep track of inherited analysis. For example, if a loop pass does not
preserve dominator info then it should update parent FPPassManager's
available analysis info to reflect this.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34942 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/PassManager.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 2535308..72804be 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -551,6 +551,27 @@ void PMDataManager::removeNotPreservedAnalysis(Pass *P) { AvailableAnalysis.erase(Info); } } + + // Check inherited analysis also. If P is not preserving analysis + // provided by parent manager then remove it here. + for (unsigned Index = 0; Index < PMT_Last; ++Index) { + + if (!InheritedAnalysis[Index]) + continue; + + for (std::map<AnalysisID, Pass*>::iterator + I = InheritedAnalysis[Index]->begin(), + E = InheritedAnalysis[Index]->end(); I != E; ) { + std::map<AnalysisID, Pass *>::iterator Info = I++; + if (std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) == + PreservedSet.end()) { + // Remove this analysis + if (!dynamic_cast<ImmutablePass*>(Info->second)) + InheritedAnalysis[Index]->erase(Info); + } + } + } + } /// Remove analysis passes that are not used any longer |