summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/VMCore/PassManager.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index 620d4da963..3d3858e4a4 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -189,6 +189,8 @@ public:
void dumpPasses() const;
void dumpArguments() const;
+ void initializeAllAnalysisInfo();
+
protected:
/// Collection of pass managers
@@ -773,6 +775,21 @@ void PMTopLevelManager::dumpArguments() const {
cerr << "\n";
}
+void PMTopLevelManager::initializeAllAnalysisInfo() {
+
+ for (std::vector<Pass *>::iterator I = PassManagers.begin(),
+ E = PassManagers.end(); I != E; ++I) {
+ PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
+ assert(PMD && "This is not a PassManager");
+ PMD->initializeAnalysisInfo();
+ }
+
+ // Initailize other pass managers
+ for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(),
+ E = IndirectPassManagers.end(); I != E; ++I)
+ (*I)->initializeAnalysisInfo();
+}
+
//===----------------------------------------------------------------------===//
// PMDataManager implementation
@@ -1051,7 +1068,6 @@ BBPassManager::runOnFunction(Function &F) {
return false;
bool Changed = doInitialization(F);
- initializeAnalysisInfo();
std::string Msg1 = "Executing Pass '";
std::string Msg3 = "' Made Modification '";
@@ -1240,6 +1256,7 @@ bool FunctionPassManagerImpl::run(Function &F) {
dumpArguments();
dumpPasses();
+ initializeAllAnalysisInfo();
for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
FPPassManager *FP = getContainedManager(Index);
Changed |= FP->runOnFunction(F);
@@ -1322,8 +1339,6 @@ bool FPPassManager::runOnFunction(Function &F) {
if (F.isExternal())
return false;
- initializeAnalysisInfo();
-
std::string Msg1 = "Executing Pass '";
std::string Msg3 = "' Made Modification '";
@@ -1357,7 +1372,6 @@ bool FPPassManager::runOnFunction(Function &F) {
bool FPPassManager::runOnModule(Module &M) {
bool Changed = doInitialization(M);
- initializeAnalysisInfo();
for(Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
this->runOnFunction(*I);
@@ -1462,7 +1476,6 @@ MPPassManager::addPass(Pass *P) {
bool
MPPassManager::runOnModule(Module &M) {
bool Changed = false;
- initializeAnalysisInfo();
std::string Msg1 = "Executing Pass '";
std::string Msg3 = "' Made Modification '";
@@ -1528,6 +1541,7 @@ bool PassManagerImpl::run(Module &M) {
dumpArguments();
dumpPasses();
+ initializeAllAnalysisInfo();
for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
MPPassManager *MP = getContainedManager(Index);
Changed |= MP->runOnModule(M);