Skip to content

Commit 83892d7

Browse files
committed
Print custom assembly on pass failure by default
The printer is now resilient to invalid IR and will already automatically fallback to the generic form on invalid IR. Using the generic printer on pass failure was a conservative option before the printer was made failsafe. Reviewed By: lattner, rriddle, jpienaar, bondhugula Differential Revision: https://reviews.llvm.org/D123915
1 parent 1aa3a54 commit 83892d7

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

mlir/lib/Pass/IRPrinting.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,7 @@ void IRPrinterInstrumentation::runAfterPassFailed(Pass *pass, Operation *op) {
170170

171171
config->printAfterIfEnabled(pass, op, [&](raw_ostream &out) {
172172
out << formatv("// -----// IR Dump After {0} Failed", pass->getName());
173-
printIR(op, config->shouldPrintAtModuleScope(), out,
174-
OpPrintingFlags().printGenericOpForm());
173+
printIR(op, config->shouldPrintAtModuleScope(), out, OpPrintingFlags());
175174
out << "\n\n";
176175
});
177176
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: not mlir-opt %s -pass-pipeline='func.func(test-pass-create-invalid-ir{emit-invalid-ir=true signal-pass-failure=true})' -mlir-print-ir-after-failure 2>&1 | FileCheck %s --check-prefix=CHECK-INVALID
2+
// RUN: not mlir-opt %s -pass-pipeline='func.func(test-pass-create-invalid-ir{emit-invalid-ir=true signal-pass-failure=false})' -mlir-print-ir-after-failure 2>&1 | FileCheck %s --check-prefix=CHECK-INVALID
3+
// RUN: not mlir-opt %s -pass-pipeline='func.func(test-pass-create-invalid-ir{emit-invalid-ir=false signal-pass-failure=true})' -mlir-print-ir-after-failure 2>&1 | FileCheck %s --check-prefix=CHECK-VALID
4+
// RUN: mlir-opt %s -pass-pipeline='func.func(test-pass-create-invalid-ir{emit-invalid-ir=false signal-pass-failure=false})' -mlir-print-ir-after-failure 2>&1 | FileCheck %s --check-prefix=CHECK-VALID
5+
6+
// Test whether we print generically or not on pass failure, depending on whether there is invalid IR or not.
7+
8+
// CHECK-VALID: func @TestCreateInvalidCallInPass
9+
// CHECK-INVALID: "func.func"
10+
func @TestCreateInvalidCallInPass() {
11+
return
12+
}

mlir/test/Pass/ir-printing.mlir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,4 @@ func @bar() {
6464

6565
// AFTER_FAILURE-NOT: // -----// IR Dump After{{.*}}CSE
6666
// AFTER_FAILURE: // -----// IR Dump After{{.*}}TestFailurePass Failed //----- //
67+
// AFTER_FAILURE: func @foo()

mlir/test/lib/Pass/TestPassManager.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,37 @@ struct TestFailurePass : public PassWrapper<TestFailurePass, OperationPass<>> {
108108
}
109109
};
110110

111+
/// A test pass that creates an invalid operation in a function body.
112+
struct TestInvalidIRPass
113+
: public PassWrapper<TestInvalidIRPass,
114+
InterfacePass<FunctionOpInterface>> {
115+
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestInvalidIRPass)
116+
117+
TestInvalidIRPass() = default;
118+
TestInvalidIRPass(const TestInvalidIRPass &other) {}
119+
120+
StringRef getArgument() const final { return "test-pass-create-invalid-ir"; }
121+
StringRef getDescription() const final {
122+
return "Test pass that adds an invalid operation in a function body";
123+
}
124+
void getDependentDialects(DialectRegistry &registry) const final {
125+
registry.insert<test::TestDialect>();
126+
}
127+
void runOnOperation() final {
128+
if (signalFailure)
129+
signalPassFailure();
130+
if (!emitInvalidIR)
131+
return;
132+
OpBuilder b(getOperation().getBody());
133+
OperationState state(b.getUnknownLoc(), "test.any_attr_of_i32_str");
134+
b.create(state);
135+
}
136+
Option<bool> signalFailure{*this, "signal-pass-failure",
137+
llvm::cl::desc("Trigger a pass failure")};
138+
Option<bool> emitInvalidIR{*this, "emit-invalid-ir", llvm::cl::init(true),
139+
llvm::cl::desc("Emit invalid IR")};
140+
};
141+
111142
/// A test pass that always fails to enable testing the failure recovery
112143
/// mechanisms of the pass manager.
113144
struct TestInvalidParentPass
@@ -179,6 +210,7 @@ void registerPassManagerTestPass() {
179210

180211
PassRegistration<TestCrashRecoveryPass>();
181212
PassRegistration<TestFailurePass>();
213+
PassRegistration<TestInvalidIRPass>();
182214
PassRegistration<TestInvalidParentPass>();
183215

184216
PassRegistration<TestStatisticPass>();

0 commit comments

Comments
 (0)