From 27a8fb8a546ec5d39b057bfe2ee5c36a8e454f09 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Sun, 27 Sep 2009 23:38:27 +0000 Subject: [PATCH] Extract the code for releasing a pass into a separate function, and tidy it up a little. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82944 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/PassManagers.h | 6 ++++- lib/VMCore/PassManager.cpp | 49 +++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 6a14b152bb5..94d56e4757c 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -285,10 +285,14 @@ public: /// Remove Analysis that is not preserved by the pass void removeNotPreservedAnalysis(Pass *P); - /// Remove dead passes + /// Remove dead passes used by P. void removeDeadPasses(Pass *P, const StringRef &Msg, enum PassDebuggingString); + /// Remove P. + void freePass(Pass *P, const StringRef &Msg, + enum PassDebuggingString); + /// Add pass P into the PassVector. Update /// AvailableAnalysis appropriately if ProcessAnalysis is true. void add(Pass *P, bool ProcessAnalysis = true); diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index f2c9ea3b997..79c30aa480c 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -815,34 +815,35 @@ void PMDataManager::removeDeadPasses(Pass *P, const StringRef &Msg, } for (SmallVector::iterator I = DeadPasses.begin(), - E = DeadPasses.end(); I != E; ++I) { + E = DeadPasses.end(); I != E; ++I) + freePass(*I, Msg, DBG_STR); +} - dumpPassInfo(*I, FREEING_MSG, DBG_STR, Msg); +void PMDataManager::freePass(Pass *P, const StringRef &Msg, + enum PassDebuggingString DBG_STR) { + dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg); - { - // If the pass crashes releasing memory, remember this. - PassManagerPrettyStackEntry X(*I); - - if (TheTimeInfo) TheTimeInfo->passStarted(*I); - (*I)->releaseMemory(); - if (TheTimeInfo) TheTimeInfo->passEnded(*I); - } - if (const PassInfo *PI = (*I)->getPassInfo()) { + { + // If the pass crashes releasing memory, remember this. + PassManagerPrettyStackEntry X(P); + + if (TheTimeInfo) TheTimeInfo->passStarted(P); + P->releaseMemory(); + if (TheTimeInfo) TheTimeInfo->passEnded(P); + } + + if (const PassInfo *PI = P->getPassInfo()) { + // Remove the pass itself (if it is not already removed). + AvailableAnalysis.erase(PI); + + // Remove all interfaces this pass implements, for which it is also + // listed as the available implementation. + const std::vector &II = PI->getInterfacesImplemented(); + for (unsigned i = 0, e = II.size(); i != e; ++i) { std::map::iterator Pos = - AvailableAnalysis.find(PI); - - // It is possible that pass is already removed from the AvailableAnalysis - if (Pos != AvailableAnalysis.end()) + AvailableAnalysis.find(II[i]); + if (Pos != AvailableAnalysis.end() && Pos->second == P) AvailableAnalysis.erase(Pos); - - // Remove all interfaces this pass implements, for which it is also - // listed as the available implementation. - const std::vector &II = PI->getInterfacesImplemented(); - for (unsigned i = 0, e = II.size(); i != e; ++i) { - Pos = AvailableAnalysis.find(II[i]); - if (Pos != AvailableAnalysis.end() && Pos->second == *I) - AvailableAnalysis.erase(Pos); - } } } }