[llvm] ccc9107 - [OptBisect] Add flag to print IR when opt-bisect kicks in

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 14 13:49:44 PDT 2022


Author: Arthur Eubanks
Date: 2022-09-14T13:48:03-07:00
New Revision: ccc9107ad6858424fcfc1c24f0264f82d351b9eb

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

LOG: [OptBisect] Add flag to print IR when opt-bisect kicks in

-opt-bisect-print-ir-path=foo will dump the IR to foo when opt-bisect-limit starts skipping passes.

Currently we don't print the IR if the opt-bisect-limit is higher than the total number of times opt-bisect is called.

This makes getting the IR right before a bad transform easier.

Reviewed By: hans

Differential Revision: https://reviews.llvm.org/D133809

Added: 
    llvm/test/Other/opt-bisect-print-ir-path.ll

Modified: 
    llvm/docs/OptBisect.rst
    llvm/include/llvm/Passes/StandardInstrumentations.h
    llvm/lib/Passes/StandardInstrumentations.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/docs/OptBisect.rst b/llvm/docs/OptBisect.rst
index a0044eec8df4..a0dc2bd8fdf8 100644
--- a/llvm/docs/OptBisect.rst
+++ b/llvm/docs/OptBisect.rst
@@ -75,6 +75,8 @@ passes run in the primary driver compilation phase are not affected by options
 passed via '-Wl,-plugin-opt' and LTO passes are not affected by options
 passed to the driver-invoked LLVM invocation via '-mllvm'.
 
+Passing ``-opt-bisect-print-ir-path=path/foo.ll`` will dump the IR to
+``path/foo.ll`` when -opt-bisect-limit starts skipping passes.
 
 Bisection Index Values
 ======================

diff  --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index 166acc6252ca..19d3cbcb3506 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -75,6 +75,8 @@ class OptNoneInstrumentation {
 };
 
 class OptBisectInstrumentation {
+  bool HasWrittenIR = false;
+
 public:
   OptBisectInstrumentation() = default;
   void registerCallbacks(PassInstrumentationCallbacks &PIC);

diff  --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index d88333a30768..312a5a0bf10d 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -30,6 +30,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/CrashRecoveryContext.h"
 #include "llvm/Support/Debug.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/GraphWriter.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -101,6 +102,10 @@ static cl::opt<bool>
                  cl::desc("Print the last form of the IR before crash"),
                  cl::init(false), cl::Hidden);
 
+static cl::opt<std::string> OptBisectPrintIRPath(
+    "opt-bisect-print-ir-path",
+    cl::desc("Print IR to path when opt-bisect-limit is reached"), cl::Hidden);
+
 namespace {
 
 /// Extract Module out of \p IR unit. May return nullptr if \p IR does not match
@@ -765,9 +770,23 @@ void OptBisectInstrumentation::registerCallbacks(
     PassInstrumentationCallbacks &PIC) {
   if (!getOptBisector().isEnabled())
     return;
-  PIC.registerShouldRunOptionalPassCallback([](StringRef PassID, Any IR) {
-    return isIgnored(PassID) ||
-           getOptBisector().checkPass(PassID, getIRName(IR));
+  PIC.registerShouldRunOptionalPassCallback([this](StringRef PassID, Any IR) {
+    if (isIgnored(PassID))
+      return true;
+    bool ShouldRun = getOptBisector().checkPass(PassID, getIRName(IR));
+    if (!ShouldRun && !this->HasWrittenIR && !OptBisectPrintIRPath.empty()) {
+      // FIXME: print IR if limit is higher than number of opt-bisect
+      // invocations
+      this->HasWrittenIR = true;
+      const Module *M = unwrapModule(IR, /*Force=*/true);
+      assert(M && "expected Module");
+      std::error_code EC;
+      raw_fd_ostream OS(OptBisectPrintIRPath, EC);
+      if (EC)
+        report_fatal_error(errorCodeToError(EC));
+      M->print(OS, nullptr);
+    }
+    return ShouldRun;
   });
 }
 

diff  --git a/llvm/test/Other/opt-bisect-print-ir-path.ll b/llvm/test/Other/opt-bisect-print-ir-path.ll
new file mode 100644
index 000000000000..6db4fbc63736
--- /dev/null
+++ b/llvm/test/Other/opt-bisect-print-ir-path.ll
@@ -0,0 +1,28 @@
+; RUN: opt -disable-verify -passes=instcombine < %s -opt-bisect-limit=0 -opt-bisect-print-ir-path=%t -disable-output 
+; RUN: FileCheck %s --check-prefix=LIMIT0 --input-file %t
+; RUN: opt -disable-verify -passes=instcombine < %s -opt-bisect-limit=1 -opt-bisect-print-ir-path=%t -disable-output 
+; RUN: FileCheck %s --check-prefix=LIMIT1 --input-file %t
+; RUN: opt -disable-verify -passes=instcombine < %s -opt-bisect-limit=2 -opt-bisect-print-ir-path=%t -disable-output 
+; FIXME: print IR if limit is higher than number of opt-bisect invocations
+
+; Check that we only print the module once
+; RUN: opt -disable-verify -passes=instcombine < %s -opt-bisect-limit=1 -opt-bisect-print-ir-path=- -disable-output 2>&1 | FileCheck %s
+
+; LIMIT0: ret i32 %r
+; LIMIT0: ret i32 %r
+
+; LIMIT1: ret i32 2
+; LIMIT1: ret i32 %r
+
+; CHECK: ModuleID
+; CHECK-NOT: ModuleID
+
+define i32 @f1() {
+  %r = add i32 1, 1
+  ret i32 %r
+}
+
+define i32 @f2() {
+  %r = add i32 1, 1
+  ret i32 %r
+}


        


More information about the llvm-commits mailing list