Skip to content

Commit 23ad6a3

Browse files
[mlir][Transforms] OneToNTypeConversion.cpp: Fix invalid IR
`buildUnrealizedCast` used to generate invalid `builtin.unrealized_conversion_cast` ops with zero results. This commit fixes `test/Conversion/OneToNTypeConversion/one-to-n-type-conversion.mlir` when running with `MLIR_ENABLE_EXPENSIVE_PATTERN_API_CHECKS`. ``` * Pattern (anonymous namespace)::ConvertMakeTupleOp : 'test.make_tuple -> ()' { Trying to match "(anonymous namespace)::ConvertMakeTupleOp" ** Insert : 'builtin.unrealized_conversion_cast'(0x559cb66b1180) ** Insert : 'builtin.unrealized_conversion_cast'(0x559cb66aa830) ** Insert : 'builtin.unrealized_conversion_cast'(0x559cb66b1210) ** Replace : 'test.make_tuple'(0x559cb6692420) ** Modified: 'builtin.unrealized_conversion_cast'(0x559cb66b0ff0) ** Modified: 'builtin.unrealized_conversion_cast'(0x559cb66b0ac0) ** Erase : 'test.make_tuple'(0x559cb6692420) "(anonymous namespace)::ConvertMakeTupleOp" result 1 } -> success : pattern applied successfully // *** IR Dump After Pattern Application *** mlir-asm-printer: Verifying operation: func.func 'builtin.unrealized_conversion_cast' op expected at least one result for cast operation mlir-asm-printer: 'func.func' failed to verify and will be printed in generic form "func.func"() <{function_type = (i1, i2) -> (i1, i2), sym_name = "pack_unpack"}> ({ ^bb0(%arg0: i1, %arg1: i2): %0 = "test.make_tuple"() : () -> tuple<> %1 = "test.make_tuple"(%arg1) : (i2) -> tuple<i2> %2 = "test.make_tuple"(%1) : (tuple<i2>) -> tuple<tuple<i2>> "builtin.unrealized_conversion_cast"(%0) {"__one-to-n-type-conversion_cast-kind__" = "target"} : (tuple<>) -> () %3 = "builtin.unrealized_conversion_cast"(%2) {"__one-to-n-type-conversion_cast-kind__" = "target"} : (tuple<tuple<i2>>) -> i2 %4 = "builtin.unrealized_conversion_cast"(%arg0, %3) {"__one-to-n-type-conversion_cast-kind__" = "source"} : (i1, i2) -> tuple<tuple<>, i1, tuple<tuple<i2>>> %5:2 = "builtin.unrealized_conversion_cast"(%4) {"__one-to-n-type-conversion_cast-kind__" = "target"} : (tuple<tuple<>, i1, tuple<tuple<i2>>>) -> (i1, i2) %6:2 = "builtin.unrealized_conversion_cast"(%4) {"__one-to-n-type-conversion_cast-kind__" = "target"} : (tuple<tuple<>, i1, tuple<tuple<i2>>>) -> (i1, i2) "func.return"(%5#0, %6#1) : (i1, i2) -> () }) : () -> () within split at /usr/local/google/home/springerm/mlir_public/llvm-project/mlir/test/Conversion/OneToNTypeConversion/one-to-n-type-conversion.mlir:1 offset :20:8: error: 'builtin.unrealized_conversion_cast' op expected at least one result for cast operation %0 = "test.make_tuple"() : () -> tuple<> ^ within split at /usr/local/google/home/springerm/mlir_public/llvm-project/mlir/test/Conversion/OneToNTypeConversion/one-to-n-type-conversion.mlir:1 offset :20:8: note: see current operation: "builtin.unrealized_conversion_cast"(%0) {"__one-to-n-type-conversion_cast-kind__" = "target"} : (tuple<>) -> () LLVM ERROR: IR failed to verify after pattern application ```
1 parent 959a430 commit 23ad6a3

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

mlir/lib/Transforms/Utils/OneToNTypeConversion.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ static const char *const castKindAttrName =
113113
/// result types. Returns the result values of the cast.
114114
static ValueRange buildUnrealizedCast(OpBuilder &builder, TypeRange resultTypes,
115115
ValueRange inputs, CastKind kind) {
116+
if (resultTypes.empty())
117+
return ValueRange();
118+
116119
// Create cast.
117120
Location loc = builder.getUnknownLoc();
118121
if (!inputs.empty())

0 commit comments

Comments
 (0)