Index: llvm/tools/llvm-reduce/DeltaManager.h =================================================================== --- llvm/tools/llvm-reduce/DeltaManager.h +++ llvm/tools/llvm-reduce/DeltaManager.h @@ -19,7 +19,7 @@ class TestRunner; void printDeltaPasses(raw_ostream &OS); -void runDeltaPasses(TestRunner &Tester); +void runDeltaPasses(TestRunner &Tester, int MaxPassIterations); } // namespace llvm #endif Index: llvm/tools/llvm-reduce/DeltaManager.cpp =================================================================== --- llvm/tools/llvm-reduce/DeltaManager.cpp +++ llvm/tools/llvm-reduce/DeltaManager.cpp @@ -103,15 +103,29 @@ #undef DELTA_PASS } -void llvm::runDeltaPasses(TestRunner &Tester) { - if (DeltaPasses.empty()) { - runAllDeltaPasses(Tester); - } else { - StringRef Passes = DeltaPasses; - while (!Passes.empty()) { - auto Split = Passes.split(","); - runDeltaPassName(Tester, Split.first); - Passes = Split.second; +static int getIRSize(TestRunner &Tester) { + std::string Str; + raw_string_ostream SS(Str); + Tester.getProgram().print(SS, /*AnnotationWriter=*/nullptr); + return SS.str().length(); +} + +void llvm::runDeltaPasses(TestRunner &Tester, int MaxPassIterations) { + int OldSize = getIRSize(Tester); + for (int Iter = 0; Iter < MaxPassIterations; ++Iter) { + if (DeltaPasses.empty()) { + runAllDeltaPasses(Tester); + } else { + StringRef Passes = DeltaPasses; + while (!Passes.empty()) { + auto Split = Passes.split(","); + runDeltaPassName(Tester, Split.first); + Passes = Split.second; + } } + int NewSize = getIRSize(Tester); + if (NewSize >= OldSize) + break; + OldSize = NewSize; } } Index: llvm/tools/llvm-reduce/llvm-reduce.cpp =================================================================== --- llvm/tools/llvm-reduce/llvm-reduce.cpp +++ llvm/tools/llvm-reduce/llvm-reduce.cpp @@ -88,6 +88,12 @@ cl::desc("Set the target triple"), cl::cat(Options)); +static cl::opt + MaxPassIterations("max-pass-iterations", + cl::desc("Maximum number of times to run the full set " + "of delta passes (default=1)"), + cl::init(1), cl::cat(Options)); + static codegen::RegisterCodeGenFlags CGF; void writeOutput(ReducerWorkItem &M, StringRef Message) { @@ -161,7 +167,7 @@ TestRunner Tester(TestFilename, TestArguments, std::move(OriginalProgram)); // Try to reduce code - runDeltaPasses(Tester); + runDeltaPasses(Tester, MaxPassIterations); // Print reduced file to STDOUT if (OutputFilename == "-")