diff options
author | Devang Patel <dpatel@apple.com> | 2007-01-16 19:46:09 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-01-16 19:46:09 +0000 |
commit | 68dc3d22637e37148460c433b38f169b5166791c (patch) | |
tree | 5c9717cb01880c448d8345f4cb0d3389a3020f03 /llvm/lib/VMCore/PassManager.cpp | |
parent | 8c87f124dc32420f4fec5a5ca050fed3730b7021 (diff) | |
download | bcm5719-llvm-68dc3d22637e37148460c433b38f169b5166791c.tar.gz bcm5719-llvm-68dc3d22637e37148460c433b38f169b5166791c.zip |
Setup pass manager before scheduling required analysis.
llvm-svn: 33262
Diffstat (limited to 'llvm/lib/VMCore/PassManager.cpp')
-rw-r--r-- | llvm/lib/VMCore/PassManager.cpp | 112 |
1 files changed, 62 insertions, 50 deletions
diff --git a/llvm/lib/VMCore/PassManager.cpp b/llvm/lib/VMCore/PassManager.cpp index 1e3b48ee686..50364e9c71d 100644 --- a/llvm/lib/VMCore/PassManager.cpp +++ b/llvm/lib/VMCore/PassManager.cpp @@ -366,8 +366,7 @@ void PMTopLevelManager::collectLastUses(std::vector<Pass *> &LastUses, /// the manager. Remove dead passes. This is a recursive function. void PMTopLevelManager::schedulePass(Pass *P) { - // TODO : Allocate function manager for this pass, other wise required set - // may be inserted into previous function manager + P->setupPassManager(activeStack); AnalysisUsage AnUsage; P->getAnalysisUsage(AnUsage); @@ -1218,47 +1217,55 @@ void ModulePass::assignPassManager(PMStack &PMS) { MPP->add(this); } -/// Find appropriate Function Pass Manager or Call Graph Pass Manager -/// in the PM Stack and add self into that manager. -void FunctionPass::assignPassManager(PMStack &PMS) { +/// Setup Pass Manager in advance before checking availability of +/// required analysis passes. +void FunctionPass::setupPassManager(PMStack &PMS) { // Find Module Pass Manager (TODO : Or Call Graph Pass Manager) while(!PMS.empty()) { if (PMS.top()->getPassManagerType() > PMT_FunctionPassManager) PMS.pop(); else - break; + break; } - FPPassManager *FPP = dynamic_cast<FPPassManager *>(PMS.top()); - - // Create new Function Pass Manager - if (!FPP) { - assert(!PMS.empty() && "Unable to create Function Pass Manager"); - PMDataManager *PMD = PMS.top(); - // [1] Create new Function Pass Manager - FPP = new FPPassManager(PMD->getDepth() + 1); + assert(!PMS.empty() && "Unable to create Function Pass Manager"); - // [2] Set up new manager's top level manager - PMTopLevelManager *TPM = PMD->getTopLevelManager(); - TPM->addIndirectPassManager(FPP); + if (PMS.top()->getPassManagerType() == PMT_FunctionPassManager + || PMS.top()->getPassManagerType() == PMT_CallGraphPassManager) + return; + + PMDataManager *PMD = PMS.top(); + + // [1] Create new Function Pass Manager + FPPassManager *FPP = new FPPassManager(PMD->getDepth() + 1); + + // [2] Set up new manager's top level manager + PMTopLevelManager *TPM = PMD->getTopLevelManager(); + TPM->addIndirectPassManager(FPP); + + // [3] Assign manager to manage this new manager. This may create + // and push new managers into PMS + Pass *P = dynamic_cast<Pass *>(FPP); + P->assignPassManager(PMS); + + // [4] Push new manager into PMS + PMS.push(FPP); +} - // [3] Assign manager to manage this new manager. This may create - // and push new managers into PMS - Pass *P = dynamic_cast<Pass *>(FPP); - P->assignPassManager(PMS); +/// Find appropriate Function Pass Manager or Call Graph Pass Manager +/// in the PM Stack and add self into that manager. +void FunctionPass::assignPassManager(PMStack &PMS) { - // [4] Push new manager into PMS - PMS.push(FPP); - } + PMDataManager *PMD = dynamic_cast<PMDataManager *>(PMS.top()); + assert(PMD && "Unable to assign Pass Manager"); - // Assign FPP as the manager of this pass. - FPP->add(this); + PMD->add(this); } -/// Find appropriate Basic Pass Manager or Call Graph Pass Manager -/// in the PM Stack and add self into that manager. -void BasicBlockPass::assignPassManager(PMStack &PMS) { +/// Setup Pass Manager in advance before checking availability of +/// required analysis passes. +void BasicBlockPass::setupPassManager(PMStack &PMS) { BBPassManager *BBP = NULL; @@ -1268,32 +1275,37 @@ void BasicBlockPass::assignPassManager(PMStack &PMS) { BBP = dynamic_cast<BBPassManager *>(PMS.top()); } - // If leaf manager is not Basic Block Pass manager then create new - // basic Block Pass manager. - - if (!BBP) { - assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager"); - PMDataManager *PMD = PMS.top(); - - // [1] Create new Basic Block Manager - BBP = new BBPassManager(PMD->getDepth() + 1); - - // [2] Set up new manager's top level manager - // Basic Block Pass Manager does not live by itself - PMTopLevelManager *TPM = PMD->getTopLevelManager(); - TPM->addIndirectPassManager(BBP); + if (BBP) + return; + assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager"); + PMDataManager *PMD = PMS.top(); + + // [1] Create new Basic Block Manager + BBP = new BBPassManager(PMD->getDepth() + 1); + + // [2] Set up new manager's top level manager + // Basic Block Pass Manager does not live by itself + PMTopLevelManager *TPM = PMD->getTopLevelManager(); + TPM->addIndirectPassManager(BBP); + // [3] Assign manager to manage this new manager. This may create // and push new managers into PMS - Pass *P = dynamic_cast<Pass *>(BBP); - P->assignPassManager(PMS); + Pass *P = dynamic_cast<Pass *>(BBP); + P->assignPassManager(PMS); + + // [4] Push new manager into PMS + PMS.push(BBP); +} - // [4] Push new manager into PMS - PMS.push(BBP); - } +/// Find appropriate Basic Pass Manager or Call Graph Pass Manager +/// in the PM Stack and add self into that manager. +void BasicBlockPass::assignPassManager(PMStack &PMS) { + + PMDataManager *PMD = dynamic_cast<PMDataManager *>(PMS.top()); + assert(PMD && "Unable to assign Pass Manager"); - // Assign BBP as the manager of this pass. - BBP->add(this); + PMD->add(this); } |