From be2d1239a40db5efd25e3f306ae15390d9db35c6 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Mon, 6 Jun 2011 22:45:46 +0000 Subject: [PATCH] Add -O1/2/3 to bugpoint, so when you conclude opt -O2 reproduces an issue, you can just run bugpoint -O2. :) My implementation isn't precisely equivalent to what opt does, but as far as I can tell, it's close enough. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132695 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/bugpoint/bugpoint.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/tools/bugpoint/bugpoint.cpp b/tools/bugpoint/bugpoint.cpp index efacd6ae75c..e25414fa426 100644 --- a/tools/bugpoint/bugpoint.cpp +++ b/tools/bugpoint/bugpoint.cpp @@ -69,6 +69,18 @@ static cl::opt StandardLinkOpts("std-link-opts", cl::desc("Include the standard link time optimizations")); +static cl::opt +OptLevelO1("O1", + cl::desc("Optimization level 1. Similar to llvm-gcc -O1")); + +static cl::opt +OptLevelO2("O2", + cl::desc("Optimization level 2. Similar to llvm-gcc -O2")); + +static cl::opt +OptLevelO3("O3", + cl::desc("Optimization level 3. Similar to llvm-gcc -O3")); + static cl::opt OverrideTriple("mtriple", cl::desc("Override target triple for module")); @@ -83,10 +95,10 @@ static void BugpointInterruptFunction() { // Hack to capture a pass list. namespace { - class AddToDriver : public PassManager { + class AddToDriver : public FunctionPassManager { BugDriver &D; public: - AddToDriver(BugDriver &_D) : D(_D) {} + AddToDriver(BugDriver &_D) : FunctionPassManager(0), D(_D) {} virtual void add(Pass *P) { const void *ID = P->getPassID(); @@ -158,6 +170,20 @@ int main(int argc, char **argv) { /*RunInliner=*/true); } + if (OptLevelO1 || OptLevelO2 || OptLevelO3) { + PassManagerBuilder Builder; + if (OptLevelO1) + Builder.Inliner = createAlwaysInlinerPass(); + else if (OptLevelO2) + Builder.Inliner = createFunctionInliningPass(225); + else + Builder.Inliner = createFunctionInliningPass(275); + + // Note that although clang/llvm-gcc use two separate passmanagers + // here, it shouldn't normally make a difference. + Builder.populateFunctionPassManager(PM); + Builder.populateModulePassManager(PM); + } for (std::vector::iterator I = PassList.begin(), E = PassList.end();