Skip to content

Commit 2b887ee

Browse files
Add regression test
1 parent ecadaec commit 2b887ee

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

mlir/test/Transforms/test-legalizer.mlir

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,14 @@ func.func @convert_detached_signature() {
452452
}) : () -> ()
453453
"test.return"() : () -> ()
454454
}
455+
456+
// -----
457+
458+
// CHECK-LABEL: func @circular_mapping()
459+
// CHECK-NEXT: "test.valid"() : () -> ()
460+
func.func @circular_mapping() {
461+
// Regression test that used to crash due to circular
462+
// unrealized_conversion_cast ops.
463+
%0 = "test.erase_op"() : () -> (i64)
464+
"test.drop_operands_and_replace_with_valid"(%0) : (i64) -> ()
465+
}

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,22 @@ struct TestPassthroughInvalidOp : public ConversionPattern {
907907
return success();
908908
}
909909
};
910+
/// Replace with valid op, but simply drop the operands. This is used in a
911+
/// regression where we used to generate circular unrealized_conversion_cast
912+
/// ops.
913+
struct TestDropAndReplaceInvalidOp : public ConversionPattern {
914+
TestDropAndReplaceInvalidOp(MLIRContext *ctx, const TypeConverter &converter)
915+
: ConversionPattern(converter,
916+
"test.drop_operands_and_replace_with_valid", 1, ctx) {
917+
}
918+
LogicalResult
919+
matchAndRewrite(Operation *op, ArrayRef<Value> operands,
920+
ConversionPatternRewriter &rewriter) const final {
921+
rewriter.replaceOpWithNewOp<TestValidOp>(op, std::nullopt, ValueRange(),
922+
std::nullopt);
923+
return success();
924+
}
925+
};
910926
/// This pattern handles the case of a split return value.
911927
struct TestSplitReturnType : public ConversionPattern {
912928
TestSplitReturnType(MLIRContext *ctx)
@@ -1070,6 +1086,19 @@ struct TestCreateUnregisteredOp : public OpRewritePattern<ILLegalOpG> {
10701086
return success();
10711087
};
10721088
};
1089+
1090+
class TestEraseOp : public ConversionPattern {
1091+
public:
1092+
TestEraseOp(MLIRContext *ctx) : ConversionPattern("test.erase_op", 1, ctx) {}
1093+
LogicalResult
1094+
matchAndRewrite(Operation *op, ArrayRef<Value> operands,
1095+
ConversionPatternRewriter &rewriter) const final {
1096+
// Erase op without replacements.
1097+
rewriter.eraseOp(op);
1098+
return success();
1099+
}
1100+
};
1101+
10731102
} // namespace
10741103

10751104
namespace {
@@ -1148,8 +1177,9 @@ struct TestLegalizePatternDriver
11481177
TestUpdateConsumerType, TestNonRootReplacement,
11491178
TestBoundedRecursiveRewrite, TestNestedOpCreationUndoRewrite,
11501179
TestReplaceEraseOp, TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1151-
TestUndoPropertiesModification>(&getContext());
1152-
patterns.add<TestDropOpSignatureConversion>(&getContext(), converter);
1180+
TestUndoPropertiesModification, TestEraseOp>(&getContext());
1181+
patterns.add<TestDropOpSignatureConversion, TestDropAndReplaceInvalidOp>(
1182+
&getContext(), converter);
11531183
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern(patterns,
11541184
converter);
11551185
mlir::populateCallOpTypeConversionPattern(patterns, converter);

0 commit comments

Comments
 (0)