[PATCH] D133809: [OptBisect] Add flag to print IR when opt-bisect kicks in
Arthur Eubanks via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 13 14:04:36 PDT 2022
aeubanks created this revision.
aeubanks added reviewers: hans, asbirlea.
Herald added a subscriber: hiraditya.
Herald added a project: All.
aeubanks requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
-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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D133809
Files:
llvm/include/llvm/Passes/StandardInstrumentations.h
llvm/lib/Passes/StandardInstrumentations.cpp
llvm/test/Other/opt-bisect-print-ir-path.ll
Index: llvm/test/Other/opt-bisect-print-ir-path.ll
===================================================================
--- /dev/null
+++ 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
+}
Index: llvm/lib/Passes/StandardInstrumentations.cpp
===================================================================
--- llvm/lib/Passes/StandardInstrumentations.cpp
+++ 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 @@
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 @@
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;
});
}
Index: llvm/include/llvm/Passes/StandardInstrumentations.h
===================================================================
--- llvm/include/llvm/Passes/StandardInstrumentations.h
+++ llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -75,6 +75,8 @@
};
class OptBisectInstrumentation {
+ bool HasWrittenIR = false;
+
public:
OptBisectInstrumentation() = default;
void registerCallbacks(PassInstrumentationCallbacks &PIC);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D133809.459869.patch
Type: text/x-patch
Size: 3555 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220913/48fdc811/attachment.bin>
More information about the llvm-commits
mailing list