From 4eec1710c51865b47480bc63a736a3719496679d Mon Sep 17 00:00:00 2001 From: John Regehr Date: Mon, 10 Jan 2022 22:24:23 -0700 Subject: allow llvm-reduce, if asked, to run its set of passes more than once, taking longer to finish but also potentially resulting in a smaller reduced file. --- llvm/tools/llvm-reduce/DeltaManager.cpp | 35 ++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'llvm/tools/llvm-reduce/DeltaManager.cpp') diff --git a/llvm/tools/llvm-reduce/DeltaManager.cpp b/llvm/tools/llvm-reduce/DeltaManager.cpp index 59edf73..4d646a7 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; } } -- cgit v1.1