diff --git a/test/Other/2007-06-28-PassManager.ll b/test/Other/2007-06-28-PassManager.ll index b0d83d0a0c6..5968d8c68bc 100644 --- a/test/Other/2007-06-28-PassManager.ll +++ b/test/Other/2007-06-28-PassManager.ll @@ -1,5 +1,7 @@ ; RUN: llvm-as < %s | opt -analyze -inline -disable-output ; PR 1526 +; RUN: llvm-as < %s | opt -analyze -indvars -disable-output +; PR 1539 define i32 @test1() { ret i32 0; } diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index e6ff5ec4a25..ace0d3c9bc9 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -176,6 +176,33 @@ struct FunctionPassPrinter : public FunctionPass { }; char FunctionPassPrinter::ID = 0; + +struct LoopPassPrinter : public LoopPass { + static char ID; + const PassInfo *PassToPrint; + LoopPassPrinter(const PassInfo *PI) : + LoopPass((intptr_t)&ID), PassToPrint(PI) {} + + virtual bool runOnLoop(Loop *L, LPPassManager &LPM) { + if (!Quiet) { + cout << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; + getAnalysisID(PassToPrint).print(cout, + L->getHeader()->getParent()->getParent()); + } + // Get and print pass... + return false; + } + + virtual const char *getPassName() const { return "'Pass' Printer"; } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequiredID(PassToPrint); + AU.setPreservesAll(); + } +}; + +char LoopPassPrinter::ID = 0; + struct BasicBlockPassPrinter : public BasicBlockPass { const PassInfo *PassToPrint; static char ID; @@ -372,6 +399,8 @@ int main(int argc, char **argv) { if (AnalyzeOnly) { if (dynamic_cast(P)) Passes.add(new BasicBlockPassPrinter(PassInf)); + else if (dynamic_cast(P)) + Passes.add(new LoopPassPrinter(PassInf)); else if (dynamic_cast(P)) Passes.add(new FunctionPassPrinter(PassInf)); else if (dynamic_cast(P))