[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