/// AvailableAnalysis appropriately if ProcessAnalysis is true.
void addPassToManager (Pass *P, bool ProcessAnalysis = true);
+ /// Clear analysis vectors RequiredAnalysis and AvailableAnalysis.
+ /// This is used before running passes managed by the manager.
+ void clearAnalysis() {
+ RequiredAnalysis.clear();
+ AvailableAnalysis.clear();
+ }
+
inline std::vector<Pass *>::iterator passVectorBegin() {
return PassVector.begin();
}
BasicBlockPassManager_New::runOnFunction(Function &F) {
bool Changed = false;
+ clearAnalysis();
+
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
for (std::vector<Pass *>::iterator itr = passVectorBegin(),
e = passVectorEnd(); itr != e; ++itr) {
Pass *P = *itr;
+
+ noteDownAvailableAnalysis(P);
BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
Changed |= BP->runOnBasicBlock(*I);
+ removeNotPreservedAnalysis(P);
+ removeDeadPasses();
}
return Changed;
}
FunctionPassManagerImpl_New::runOnModule(Module &M) {
bool Changed = false;
+ clearAnalysis();
+
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
for (std::vector<Pass *>::iterator itr = passVectorBegin(),
e = passVectorEnd(); itr != e; ++itr) {
Pass *P = *itr;
+
+ noteDownAvailableAnalysis(P);
FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
Changed |= FP->runOnFunction(*I);
+ removeNotPreservedAnalysis(P);
+ removeDeadPasses();
}
return Changed;
}
bool
ModulePassManager_New::runOnModule(Module &M) {
bool Changed = false;
+ clearAnalysis();
+
for (std::vector<Pass *>::iterator itr = passVectorBegin(),
e = passVectorEnd(); itr != e; ++itr) {
Pass *P = *itr;
+
+ noteDownAvailableAnalysis(P);
ModulePass *MP = dynamic_cast<ModulePass*>(P);
Changed |= MP->runOnModule(M);
+ removeNotPreservedAnalysis(P);
+ removeDeadPasses();
}
return Changed;
}