diff options
author | John Regehr <regehr@cs.utah.edu> | 2022-01-10 22:24:23 -0700 |
---|---|---|
committer | John Regehr <regehr@cs.utah.edu> | 2022-01-10 22:24:23 -0700 |
commit | 4eec1710c51865b47480bc63a736a3719496679d (patch) | |
tree | e2548911926aa63ccdfbb1ace52ce6b94e75b593 /llvm/tools/llvm-reduce/DeltaManager.cpp | |
parent | 5dbbd4eeb8c47d82d3acd804d0e2961be6914b4f (diff) | |
download | llvm-4eec1710c51865b47480bc63a736a3719496679d.zip llvm-4eec1710c51865b47480bc63a736a3719496679d.tar.gz llvm-4eec1710c51865b47480bc63a736a3719496679d.tar.bz2 |
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.
Diffstat (limited to 'llvm/tools/llvm-reduce/DeltaManager.cpp')
-rw-r--r-- | llvm/tools/llvm-reduce/DeltaManager.cpp | 35 |
1 files changed, 26 insertions, 9 deletions
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; } } |