diff --git a/llvm/include/llvm/IR/LegacyPassManagers.h b/llvm/include/llvm/IR/LegacyPassManagers.h index 498e736a0100c3..f4fae184e428d2 100644 --- a/llvm/include/llvm/IR/LegacyPassManagers.h +++ b/llvm/include/llvm/IR/LegacyPassManagers.h @@ -230,11 +230,11 @@ class PMTopLevelManager { // Map to keep track of last user of the analysis pass. // LastUser->second is the last user of Lastuser->first. + // This is kept in sync with InversedLastUser. DenseMap LastUser; // Map to keep track of passes that are last used by a pass. - // This inverse map is initialized at PM->run() based on - // LastUser map. + // This is kept in sync with LastUser. DenseMap > InversedLastUser; /// Immutable passes are managed by top level manager. diff --git a/llvm/lib/IR/LegacyPassManager.cpp b/llvm/lib/IR/LegacyPassManager.cpp index 5575bc469a8769..4547c3a01239e9 100644 --- a/llvm/lib/IR/LegacyPassManager.cpp +++ b/llvm/lib/IR/LegacyPassManager.cpp @@ -568,7 +568,12 @@ PMTopLevelManager::setLastUser(ArrayRef AnalysisPasses, Pass *P) { PDepth = P->getResolver()->getPMDataManager().getDepth(); for (Pass *AP : AnalysisPasses) { - LastUser[AP] = P; + // Record P as the new last user of AP. + auto &LastUserOfAP = LastUser[AP]; + if (LastUserOfAP) + InversedLastUser[LastUserOfAP].erase(AP); + LastUserOfAP = P; + InversedLastUser[P].insert(AP); if (P == AP) continue; @@ -598,13 +603,13 @@ PMTopLevelManager::setLastUser(ArrayRef AnalysisPasses, Pass *P) { if (P->getResolver()) setLastUser(LastPMUses, P->getResolver()->getPMDataManager().getAsPass()); - // If AP is the last user of other passes then make P last user of // such passes. - for (auto &LU : LastUser) { - if (LU.second == AP) - LU.second = P; - } + auto &LastUsedByAP = InversedLastUser[AP]; + for (Pass *L : LastUsedByAP) + LastUser[L] = P; + InversedLastUser[P].insert(LastUsedByAP.begin(), LastUsedByAP.end()); + LastUsedByAP.clear(); } } @@ -850,11 +855,6 @@ void PMTopLevelManager::initializeAllAnalysisInfo() { // Initailize other pass managers for (PMDataManager *IPM : IndirectPassManagers) IPM->initializeAnalysisInfo(); - - for (auto LU : LastUser) { - SmallPtrSet &L = InversedLastUser[LU.second]; - L.insert(LU.first); - } } /// Destructor @@ -1151,6 +1151,8 @@ Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) { // Print list of passes that are last used by P. void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{ + if (PassDebugging < Details) + return; SmallVector LUses;