From 98354dabc112f60b47826fce6a957b95c60f1a52 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Sat, 17 Feb 2007 03:53:44 +0000 Subject: [PATCH] Use inverted map to speedup collectLastUses(). llvm-svn: 34364 --- llvm/include/llvm/PassManagers.h | 5 +++++ llvm/lib/VMCore/PassManager.cpp | 20 ++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/PassManagers.h b/llvm/include/llvm/PassManagers.h index bd3672f944ac..4b82c9898531 100644 --- a/llvm/include/llvm/PassManagers.h +++ b/llvm/include/llvm/PassManagers.h @@ -120,6 +120,10 @@ public: /// Collect passes whose last user is P void collectLastUses(std::vector &LastUses, Pass *P); + // Walk LastUser map and create inverted map. This should be done + // after all passes are added and before running first pass. + void collectInvertedLU(); + /// Find the pass that implements Analysis AID. Search immutable /// passes and all pass managers. If desired pass is not found /// then return NULL. @@ -171,6 +175,7 @@ private: // Map to keep track of last user of the analysis pass. // LastUser->second is the last user of Lastuser->first. std::map LastUser; + std::map > InvertedLU; /// Immutable passes are managed by top level manager. std::vector ImmutablePasses; diff --git a/llvm/lib/VMCore/PassManager.cpp b/llvm/lib/VMCore/PassManager.cpp index bc85967ee1c0..6c1f2360d838 100644 --- a/llvm/lib/VMCore/PassManager.cpp +++ b/llvm/lib/VMCore/PassManager.cpp @@ -362,13 +362,19 @@ void PMTopLevelManager::setLastUser(std::vector &AnalysisPasses, } } +// Walk LastUser map and create inverted map. This should be done +// after all passes are added and before running first pass. +void PMTopLevelManager::collectInvertedLU() { + for (std::map::iterator LUI = LastUser.begin(), + LUE = LastUser.end(); LUI != LUE; ++LUI) + InvertedLU[LUI->second].push_back(LUI->first); +} + /// Collect passes whose last user is P void PMTopLevelManager::collectLastUses(std::vector &LastUses, Pass *P) { - for (std::map::iterator LUI = LastUser.begin(), - LUE = LastUser.end(); LUI != LUE; ++LUI) - if (LUI->second == P) - LastUses.push_back(LUI->first); + std::vector&LU = InvertedLU[P]; + LastUses.insert(LastUses.end(), LU.begin(), LU.end()); } /// Schedule pass P for execution. Make sure that passes required by @@ -938,6 +944,9 @@ bool FunctionPassManagerImpl::run(Function &F) { dumpArguments(); dumpPasses(); + // Collect inverted map of LastUsers. This improves speed of + // collectLastUses(). + TPM->collectInvertedLU(); initializeAllAnalysisInfo(); for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { FPPassManager *FP = getContainedManager(Index); @@ -1086,6 +1095,9 @@ bool PassManagerImpl::run(Module &M) { dumpArguments(); dumpPasses(); + // Collect inverted map of LastUsers. This improves speed of + // collectLastUses(). + TPM->collectInvertedLU(); initializeAllAnalysisInfo(); for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { MPPassManager *MP = getContainedManager(Index);