diff options
-rw-r--r-- | lib/VMCore/PassManager.cpp | 4 | ||||
-rw-r--r-- | tools/opt/opt.cpp | 17 |
2 files changed, 14 insertions, 7 deletions
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index ef90aace3d..6f559c47c3 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -458,8 +458,10 @@ void PMTopLevelManager::schedulePass(Pass *P) { // generate the analysis again. Stale analysis info should not be // available at this point. if (P->getPassInfo() && - P->getPassInfo()->isAnalysis() && findAnalysisPass(P->getPassInfo())) + P->getPassInfo()->isAnalysis() && findAnalysisPass(P->getPassInfo())) { + delete P; return; + } AnalysisUsage *AnUsage = findAnalysisUsage(P); diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index a339d316ea..b0077eaf29 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -527,16 +527,21 @@ int main(int argc, char **argv) { cerr << argv[0] << ": cannot create pass: " << PassInf->getPassName() << "\n"; if (P) { + bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0; + bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0; + bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0; + bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0; + addPass(Passes, P); - + if (AnalyzeOnly) { - if (dynamic_cast<BasicBlockPass*>(P)) + if (isBBPass) Passes.add(new BasicBlockPassPrinter(PassInf)); - else if (dynamic_cast<LoopPass*>(P)) - Passes.add(new LoopPassPrinter(PassInf)); - else if (dynamic_cast<FunctionPass*>(P)) + else if (isLPass) + Passes.add(new LoopPassPrinter(PassInf)); + else if (isFPass) Passes.add(new FunctionPassPrinter(PassInf)); - else if (dynamic_cast<CallGraphSCCPass*>(P)) + else if (isCGSCCPass) Passes.add(new CallGraphSCCPassPrinter(PassInf)); else Passes.add(new ModulePassPrinter(PassInf)); |