diff --git a/llvm/tools/llvm-reduce/DeltaManager.cpp b/llvm/tools/llvm-reduce/DeltaManager.cpp index 59edf739d35c5c..4d646a7c861d68 100644 --- a/llvm/tools/llvm-reduce/DeltaManager.cpp +++ b/llvm/tools/llvm-reduce/DeltaManager.cpp @@ -103,15 +103,32 @@ void llvm::printDeltaPasses(raw_ostream &OS) { #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; +// FIXME: We might want to use a different metric than "number of +// bytes in serialized IR" to detect non-progress of the main delta +// loop +static int getIRSize(TestRunner &Tester) { + std::string Str; + raw_string_ostream SS(Str); + Tester.getProgram().print(SS, /*AnnotationWriter=*/nullptr); + return 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; } } diff --git a/llvm/tools/llvm-reduce/DeltaManager.h b/llvm/tools/llvm-reduce/DeltaManager.h index 8fb69be13eb3dd..b72e5604bd54a8 100644 --- a/llvm/tools/llvm-reduce/DeltaManager.h +++ b/llvm/tools/llvm-reduce/DeltaManager.h @@ -19,7 +19,7 @@ class raw_ostream; class TestRunner; void printDeltaPasses(raw_ostream &OS); -void runDeltaPasses(TestRunner &Tester); +void runDeltaPasses(TestRunner &Tester, int MaxPassIterations); } // namespace llvm #endif diff --git a/llvm/tools/llvm-reduce/llvm-reduce.cpp b/llvm/tools/llvm-reduce/llvm-reduce.cpp index 11e3dd03949924..e07351aaa385bb 100644 --- a/llvm/tools/llvm-reduce/llvm-reduce.cpp +++ b/llvm/tools/llvm-reduce/llvm-reduce.cpp @@ -88,6 +88,12 @@ static cl::opt TargetTriple("mtriple", 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 @@ int main(int Argc, char **Argv) { TestRunner Tester(TestFilename, TestArguments, std::move(OriginalProgram)); // Try to reduce code - runDeltaPasses(Tester); + runDeltaPasses(Tester, MaxPassIterations); // Print reduced file to STDOUT if (OutputFilename == "-")