diff options
author | Matthias Springer <mspringer@nvidia.com> | 2025-04-03 22:46:07 +0200 |
---|---|---|
committer | Matthias Springer <mspringer@nvidia.com> | 2025-04-03 22:46:07 +0200 |
commit | c30253ea54e47b3317930e01e81aa15ea59c6afe (patch) | |
tree | 32ab43065b5aef5a22f3125fb5c409431f9fdb57 | |
parent | b738b82699e58fa50d15d76e1e26b58100ad344e (diff) | |
download | llvm-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.mlir | 13 | ||||
-rw-r--r-- | mlir/test/lib/Dialect/Test/TestPatterns.cpp | 33 |
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); |