void removeNotPreservedAnalysis(Pass *P);
/// Remove dead passes
- void removeDeadPasses() { /* TODO : Implement */ }
+ void removeDeadPasses(Pass *P);
/// Add pass P into the PassVector. Update RequiredAnalysis and
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
}
}
+/// Remove analysis passes that are not used any longer
+void CommonPassManagerImpl::removeDeadPasses(Pass *P) {
+
+ for (std::map<Pass *, Pass *>::iterator I = LastUser.begin(),
+ E = LastUser.end(); I !=E; ++I) {
+ if (I->second == P) {
+ Pass *deadPass = I->first;
+ deadPass->releaseMemory();
+
+ std::map<AnalysisID, Pass*>::iterator Pos =
+ AvailableAnalysis.find(deadPass->getPassInfo());
+
+ assert (Pos != AvailableAnalysis.end() &&
+ "Pass is not available");
+ AvailableAnalysis.erase(Pos);
+ }
+ }
+}
+
/// Add pass P into the PassVector. Update RequiredAnalysis and
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
void CommonPassManagerImpl::addPassToManager (Pass *P,
BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
Changed |= BP->runOnBasicBlock(*I);
removeNotPreservedAnalysis(P);
- removeDeadPasses();
+ removeDeadPasses(P);
}
return Changed;
}
FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
Changed |= FP->runOnFunction(*I);
removeNotPreservedAnalysis(P);
- removeDeadPasses();
+ removeDeadPasses(P);
}
return Changed;
}
ModulePass *MP = dynamic_cast<ModulePass*>(P);
Changed |= MP->runOnModule(M);
removeNotPreservedAnalysis(P);
- removeDeadPasses();
+ removeDeadPasses(P);
}
return Changed;
}