[llvm] 4eec171 - 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.

John Regehr via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 10 21:30:16 PST 2022


Author: John Regehr
Date: 2022-01-10T22:24:23-07:00
New Revision: 4eec1710c51865b47480bc63a736a3719496679d

URL: https://github.com/llvm/llvm-project/commit/4eec1710c51865b47480bc63a736a3719496679d
DIFF: https://github.com/llvm/llvm-project/commit/4eec1710c51865b47480bc63a736a3719496679d.diff

LOG: 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.

Added: 
    

Modified: 
    llvm/tools/llvm-reduce/DeltaManager.cpp
    llvm/tools/llvm-reduce/DeltaManager.h
    llvm/tools/llvm-reduce/llvm-reduce.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/tools/llvm-reduce/DeltaManager.cpp b/llvm/tools/llvm-reduce/DeltaManager.cpp
index 59edf739d35c5..4d646a7c861d6 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 
diff erent 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 8fb69be13eb3d..b72e5604bd54a 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 11e3dd0394992..e07351aaa385b 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 == "-")


        


More information about the llvm-commits mailing list