aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools
diff options
context:
space:
mode:
authorJohn Regehr <regehr@cs.utah.edu>2022-01-10 22:24:23 -0700
committerJohn Regehr <regehr@cs.utah.edu>2022-01-10 22:24:23 -0700
commit4eec1710c51865b47480bc63a736a3719496679d (patch)
treee2548911926aa63ccdfbb1ace52ce6b94e75b593 /llvm/tools
parent5dbbd4eeb8c47d82d3acd804d0e2961be6914b4f (diff)
downloadllvm-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')
-rw-r--r--llvm/tools/llvm-reduce/DeltaManager.cpp35
-rw-r--r--llvm/tools/llvm-reduce/DeltaManager.h2
-rw-r--r--llvm/tools/llvm-reduce/llvm-reduce.cpp8
3 files changed, 34 insertions, 11 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;
}
}
diff --git a/llvm/tools/llvm-reduce/DeltaManager.h b/llvm/tools/llvm-reduce/DeltaManager.h
index 8fb69be..b72e560 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 11e3dd0..e07351a 100644
--- a/llvm/tools/llvm-reduce/llvm-reduce.cpp
+++ b/llvm/tools/llvm-reduce/llvm-reduce.cpp
@@ -88,6 +88,12 @@ static cl::opt<std::string> TargetTriple("mtriple",
cl::desc("Set the target triple"),
cl::cat(Options));
+static cl::opt<int>
+ 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 == "-")