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
This commit is contained in:
Dan Gohman 2009-09-27 23:38:27 +00:00
parent c261df9fab
commit 27a8fb8a54
2 changed files with 30 additions and 25 deletions

View File

@ -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);

View File

@ -815,34 +815,35 @@ void PMDataManager::removeDeadPasses(Pass *P, const StringRef &Msg,
}
for (SmallVector<Pass *, 12>::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<const PassInfo*> &II = PI->getInterfacesImplemented();
for (unsigned i = 0, e = II.size(); i != e; ++i) {
std::map<AnalysisID, Pass*>::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<const PassInfo*> &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);
}
}
}
}