aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/VMCore/PassManager.cpp4
-rw-r--r--tools/opt/opt.cpp17
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));