Skip to content

Commit 47f05fa

Browse files
[mlir][Transforms] Dialect conversion: fix crash when converting detached region
This commit fixes a crash in the dialect conversion when applying a signature conversion to a block inside of a detached region. This fixes an issue reported in https://github.com/llvm/llvm-project/pull/97213/files/4114d5be87596e11d86706a338248ebf05cf7150#r1691809730.
1 parent b365dbb commit 47f05fa

File tree

3 files changed

+58
-11
lines changed

3 files changed

+58
-11
lines changed

mlir/lib/Transforms/Utils/DialectConversion.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1370,7 +1370,8 @@ Value ConversionPatternRewriterImpl::buildUnresolvedMaterialization(
13701370

13711371
// Create an unresolved materialization. We use a new OpBuilder to avoid
13721372
// tracking the materialization like we do for other operations.
1373-
OpBuilder builder(insertBlock, insertPt);
1373+
OpBuilder builder(outputType.getContext());
1374+
builder.setInsertionPoint(insertBlock, insertPt);
13741375
auto convertOp =
13751376
builder.create<UnrealizedConversionCastOp>(loc, outputType, inputs);
13761377
appendRewrite<UnresolvedMaterializationRewrite>(convertOp, converter, kind);

mlir/test/Transforms/test-legalizer.mlir

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,3 +437,18 @@ func.func @fold_legalization() -> i32 {
437437
%1 = "test.op_in_place_self_fold"() : () -> (i32)
438438
"test.return"(%1) : (i32) -> ()
439439
}
440+
441+
// -----
442+
443+
// CHECK-LABEL: func @convert_detached_signature()
444+
// CHECK: "test.legal_op_with_region"() ({
445+
// CHECK: ^bb0(%arg0: f64):
446+
// CHECK: "test.return"() : () -> ()
447+
// CHECK: }) : () -> ()
448+
func.func @convert_detached_signature() {
449+
"test.detached_signature_conversion"() ({
450+
^bb0(%arg0: i64):
451+
"test.return"() : () -> ()
452+
}) : () -> ()
453+
"test.return"() : () -> ()
454+
}

mlir/test/lib/Dialect/Test/TestPatterns.cpp

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,35 @@ namespace {
685685
//===----------------------------------------------------------------------===//
686686
// Region-Block Rewrite Testing
687687

688+
/// This pattern applies a signature conversion to a block inside a detached
689+
/// region.
690+
struct TestDetachedSignatureConversion : public ConversionPattern {
691+
TestDetachedSignatureConversion(MLIRContext *ctx)
692+
: ConversionPattern("test.detached_signature_conversion", /*benefit=*/1,
693+
ctx) {}
694+
695+
LogicalResult
696+
matchAndRewrite(Operation *op, ArrayRef<Value> operands,
697+
ConversionPatternRewriter &rewriter) const final {
698+
if (op->getNumRegions() != 1)
699+
return failure();
700+
OperationState state(op->getLoc(), "test.legal_op_with_region", operands,
701+
op->getResultTypes(), {}, BlockRange());
702+
Region *newRegion = state.addRegion();
703+
rewriter.inlineRegionBefore(op->getRegion(0), *newRegion,
704+
newRegion->begin());
705+
TypeConverter::SignatureConversion result(newRegion->getNumArguments());
706+
for (unsigned i = 0; i < newRegion->getNumArguments(); ++i) {
707+
result.addInputs(i, rewriter.getF64Type());
708+
}
709+
rewriter.applySignatureConversion(&newRegion->front(), result);
710+
Operation *newOp = rewriter.create(state);
711+
newOp->dump();
712+
rewriter.replaceOp(op, newOp->getResults());
713+
return success();
714+
}
715+
};
716+
688717
/// This pattern is a simple pattern that inlines the first region of a given
689718
/// operation into the parent region.
690719
struct TestRegionRewriteBlockMovement : public ConversionPattern {
@@ -1112,16 +1141,16 @@ struct TestLegalizePatternDriver
11121141
TestTypeConverter converter;
11131142
mlir::RewritePatternSet patterns(&getContext());
11141143
populateWithGenerated(patterns);
1115-
patterns
1116-
.add<TestRegionRewriteBlockMovement, TestRegionRewriteUndo,
1117-
TestCreateBlock, TestCreateIllegalBlock, TestUndoBlockArgReplace,
1118-
TestUndoBlockErase, TestPassthroughInvalidOp, TestSplitReturnType,
1119-
TestChangeProducerTypeI32ToF32, TestChangeProducerTypeF32ToF64,
1120-
TestChangeProducerTypeF32ToInvalid, TestUpdateConsumerType,
1121-
TestNonRootReplacement, TestBoundedRecursiveRewrite,
1122-
TestNestedOpCreationUndoRewrite, TestReplaceEraseOp,
1123-
TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1124-
TestUndoPropertiesModification>(&getContext());
1144+
patterns.add<
1145+
TestRegionRewriteBlockMovement, TestDetachedSignatureConversion,
1146+
TestRegionRewriteUndo, TestCreateBlock, TestCreateIllegalBlock,
1147+
TestUndoBlockArgReplace, TestUndoBlockErase, TestPassthroughInvalidOp,
1148+
TestSplitReturnType, TestChangeProducerTypeI32ToF32,
1149+
TestChangeProducerTypeF32ToF64, TestChangeProducerTypeF32ToInvalid,
1150+
TestUpdateConsumerType, TestNonRootReplacement,
1151+
TestBoundedRecursiveRewrite, TestNestedOpCreationUndoRewrite,
1152+
TestReplaceEraseOp, TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1153+
TestUndoPropertiesModification>(&getContext());
11251154
patterns.add<TestDropOpSignatureConversion>(&getContext(), converter);
11261155
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern(patterns,
11271156
converter);
@@ -1132,6 +1161,8 @@ struct TestLegalizePatternDriver
11321161
target.addLegalOp<ModuleOp>();
11331162
target.addLegalOp<LegalOpA, LegalOpB, LegalOpC, TestCastOp, TestValidOp,
11341163
TerminatorOp, OneRegionOp>();
1164+
target.addLegalOp(
1165+
OperationName("test.legal_op_with_region", &getContext()));
11351166
target
11361167
.addIllegalOp<ILLegalOpF, TestRegionBuilderOp, TestOpWithRegionFold>();
11371168
target.addDynamicallyLegalOp<TestReturnOp>([](TestReturnOp op) {

0 commit comments

Comments
 (0)