aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Springer <mspringer@nvidia.com>2025-04-03 22:46:07 +0200
committerMatthias Springer <mspringer@nvidia.com>2025-04-03 22:46:07 +0200
commitc30253ea54e47b3317930e01e81aa15ea59c6afe (patch)
tree32ab43065b5aef5a22f3125fb5c409431f9fdb57
parentb738b82699e58fa50d15d76e1e26b58100ad344e (diff)
downloadllvm-users/matthias-springer/replace_with_different_converter.zip
llvm-users/matthias-springer/replace_with_different_converter.tar.gz
llvm-users/matthias-springer/replace_with_different_converter.tar.bz2
-rw-r--r--mlir/test/Transforms/test-legalizer.mlir13
-rw-r--r--mlir/test/lib/Dialect/Test/TestPatterns.cpp33
2 files changed, 46 insertions, 0 deletions
diff --git a/mlir/test/Transforms/test-legalizer.mlir b/mlir/test/Transforms/test-legalizer.mlir
index 34948ae..43e8f44 100644
--- a/mlir/test/Transforms/test-legalizer.mlir
+++ b/mlir/test/Transforms/test-legalizer.mlir
@@ -518,3 +518,16 @@ func.func @test_multiple_1_to_n_replacement() {
%0 = "test.multiple_1_to_n_replacement"() : () -> (f16)
"test.invalid"(%0) : (f16) -> ()
}
+
+// -----
+
+func.func @test_duplicate_block_arg() {
+ %p = "some_producer"() : () -> (i64)
+ //"some_user"(%p) : (i64) -> ()
+ %0 = "test.replace_with_different_converter"(%p) : (i64) -> (i64)
+ //"some_user2"(%0) : (i64) -> (i64)
+ "test.invalid"(%p) : (i64) -> ()
+ //"test.return"() : () -> ()
+}
+
+// replace i64 with f64
diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
index db02a12..8c701c0 100644
--- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp
+++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
@@ -1245,6 +1245,22 @@ public:
}
};
+class TestReplaceWithDifferentConverter : public ConversionPattern {
+public:
+ TestReplaceWithDifferentConverter(MLIRContext *ctx, const TypeConverter &converter)
+ : ConversionPattern(converter, "test.replace_with_different_converter", 1, ctx) {}
+ LogicalResult
+ matchAndRewrite(Operation *op, ArrayRef<Value> operands,
+ ConversionPatternRewriter &rewriter) const final {
+ // A single operand is expected.
+ if (op->getNumOperands() != 1)
+ return failure();
+ rewriter.replaceOp(op, {operands.front()});
+ return success();
+ }
+};
+
+
/// A pattern that tests two back-to-back 1 -> 2 op replacements.
class TestMultiple1ToNReplacement : public ConversionPattern {
public:
@@ -1311,6 +1327,7 @@ struct TestTypeConverter : public TypeConverter {
TestTypeConverter() {
addConversion(convertType);
addSourceMaterialization(materializeCast);
+ addTargetMaterialization(materializeCast);
}
static LogicalResult convertType(Type t, SmallVectorImpl<Type> &results) {
@@ -1389,6 +1406,22 @@ struct TestLegalizePatternDriver
patterns.add<TestDropOpSignatureConversion, TestDropAndReplaceInvalidOp,
TestPassthroughInvalidOp, TestMultiple1ToNReplacement>(
&getContext(), converter);
+ TypeConverter differentConverter;
+ differentConverter.addConversion(
+ [](Type type) { return IntegerType::get(type.getContext(), 7); });
+ differentConverter.addTargetMaterialization(
+ [](OpBuilder &builder, Type type, ValueRange inputs, Location loc) {
+ Operation *castOp = builder.create<TestCastOp>(loc, type, inputs);
+ castOp->setAttr("different_type_converter", builder.getUnitAttr());
+ return castOp->getResult(0);
+ });
+ differentConverter.addSourceMaterialization(
+ [](OpBuilder &builder, Type type, ValueRange inputs, Location loc) {
+ Operation *castOp = builder.create<TestCastOp>(loc, type, inputs);
+ castOp->setAttr("different_type_converter", builder.getUnitAttr());
+ return castOp->getResult(0);
+ });
+ patterns.add<TestReplaceWithDifferentConverter>(&getContext(), differentConverter);
patterns.add<TestConvertBlockArgs>(converter, &getContext());
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern(patterns,
converter);