Skip to content

Commit 684a5a3

Browse files
[mlir][Transforms] Dialect conversion: fix crash when converting detached region (#100633)
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 a737b87 commit 684a5a3

File tree

3 files changed

+56
-11
lines changed

3 files changed

+56
-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: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,33 @@ 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, e = newRegion->getNumArguments(); i < e; ++i)
707+
result.addInputs(i, rewriter.getF64Type());
708+
rewriter.applySignatureConversion(&newRegion->front(), result);
709+
Operation *newOp = rewriter.create(state);
710+
rewriter.replaceOp(op, newOp->getResults());
711+
return success();
712+
}
713+
};
714+
688715
/// This pattern is a simple pattern that inlines the first region of a given
689716
/// operation into the parent region.
690717
struct TestRegionRewriteBlockMovement : public ConversionPattern {
@@ -1112,16 +1139,16 @@ struct TestLegalizePatternDriver
11121139
TestTypeConverter converter;
11131140
mlir::RewritePatternSet patterns(&getContext());
11141141
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());
1142+
patterns.add<
1143+
TestRegionRewriteBlockMovement, TestDetachedSignatureConversion,
1144+
TestRegionRewriteUndo, TestCreateBlock, TestCreateIllegalBlock,
1145+
TestUndoBlockArgReplace, TestUndoBlockErase, TestPassthroughInvalidOp,
1146+
TestSplitReturnType, TestChangeProducerTypeI32ToF32,
1147+
TestChangeProducerTypeF32ToF64, TestChangeProducerTypeF32ToInvalid,
1148+
TestUpdateConsumerType, TestNonRootReplacement,
1149+
TestBoundedRecursiveRewrite, TestNestedOpCreationUndoRewrite,
1150+
TestReplaceEraseOp, TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1151+
TestUndoPropertiesModification>(&getContext());
11251152
patterns.add<TestDropOpSignatureConversion>(&getContext(), converter);
11261153
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern(patterns,
11271154
converter);
@@ -1132,6 +1159,8 @@ struct TestLegalizePatternDriver
11321159
target.addLegalOp<ModuleOp>();
11331160
target.addLegalOp<LegalOpA, LegalOpB, LegalOpC, TestCastOp, TestValidOp,
11341161
TerminatorOp, OneRegionOp>();
1162+
target.addLegalOp(
1163+
OperationName("test.legal_op_with_region", &getContext()));
11351164
target
11361165
.addIllegalOp<ILLegalOpF, TestRegionBuilderOp, TestOpWithRegionFold>();
11371166
target.addDynamicallyLegalOp<TestReturnOp>([](TestReturnOp op) {

0 commit comments

Comments
 (0)