Use inverted map to speedup collectLastUses().

llvm-svn: 34364
This commit is contained in:
Devang Patel 2007-02-17 03:53:44 +00:00
parent 401a49c4e2
commit 953cadacbc
2 changed files with 21 additions and 4 deletions

View File

@ -120,6 +120,10 @@ public:
/// Collect passes whose last user is P
void collectLastUses(std::vector<Pass *> &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<Pass *, Pass *> LastUser;
std::map<Pass *, std::vector <Pass *> > InvertedLU;
/// Immutable passes are managed by top level manager.
std::vector<ImmutablePass *> ImmutablePasses;

View File

@ -362,13 +362,19 @@ void PMTopLevelManager::setLastUser(std::vector<Pass *> &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<Pass *, Pass *>::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<Pass *> &LastUses,
Pass *P) {
for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(),
LUE = LastUser.end(); LUI != LUE; ++LUI)
if (LUI->second == P)
LastUses.push_back(LUI->first);
std::vector<Pass *>&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);