Skip to content

Commit c836b4a

Browse files
authored
[mlir] Verify TestBuiltinAttributeInterfaces eltype (#69878)
Fixes #61871 and fixes #60581. This PR fixes two small things. First and foremost, it throws a clear error in the `-test-elements-attr-interface` when those tests are called on elements which are not an integer. I've looked through the introduction of the attribute interface (https://reviews.llvm.org/D109190) and later commits and see no evidence that the interface (`attr.tryGetValues<T>()`) is expected to handle mismatching types. For example, the case which is given in #61871 is: ```mlir arith.constant sparse<[[0, 0, 5]], -2.0> : vector<1x1x10xf16> ``` So, a sparse vector containing `f16` elements. This will crash at various locations when called in the test because the test introduces integer types (`int64_t`, `uint64_t`, `APInt`, `IntegerAttr`), but as I said in the previous paragraph: I see no reason to believe that the implementation of the interface is wrong here. The interface just assumes that clients don't do things like `attr.tryGetValues<APInt>()` on a floating point `attr`. Also I've added a test for the implementation of this interface by the `sparse` dialect. There were no problems there. Still, probably good to increase code coverage on that one.
1 parent 600e38b commit c836b4a

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

mlir/test/IR/elements-attr-interface.mlir

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ arith.constant #test.i64_elements<[10, 11, 12, 13, 14]> : tensor<5xi64>
2020
// expected-error@below {{Test iterating `IntegerAttr`: 10 : i64, 11 : i64, 12 : i64, 13 : i64, 14 : i64}}
2121
arith.constant dense<[10, 11, 12, 13, 14]> : tensor<5xi64>
2222

23+
// This test is expected to only be called on integer elements.
24+
// expected-error@below {{Test iterating `int64_t`: expected element type to be an integer type}}
25+
// expected-error@below {{Test iterating `uint64_t`: expected element type to be an integer type}}
26+
// expected-error@below {{Test iterating `APInt`: expected element type to be an integer type}}
27+
// expected-error@below {{Test iterating `IntegerAttr`: expected element type to be an integer type}}
28+
arith.constant dense<[1.1, 1.2, 1.3]> : tensor<3xf32>
29+
2330
// Check that we don't crash on empty element attributes.
2431
// expected-error@below {{Test iterating `int64_t`: }}
2532
// expected-error@below {{Test iterating `uint64_t`: }}
@@ -41,3 +48,9 @@ arith.constant #test.e1di64_elements<blob1> : tensor<3xi64>
4148
}
4249
}
4350
#-}
51+
52+
// expected-error@below {{Test iterating `int64_t`: 0, 0, 1}}
53+
// expected-error@below {{Test iterating `uint64_t`: 0, 0, 1}}
54+
// expected-error@below {{Test iterating `APInt`: 0, 0, 1}}
55+
// expected-error@below {{Test iterating `IntegerAttr`: 0 : i64, 0 : i64, 1 : i64}}
56+
arith.constant sparse<[[0, 0, 2]], 1> : vector <1x1x3xi64>

mlir/test/lib/IR/TestBuiltinAttributeInterfaces.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ struct TestElementsAttrInterface
5151
InFlightDiagnostic diag = op->emitError()
5252
<< "Test iterating `" << type << "`: ";
5353

54+
if (!attr.getElementType().isa<mlir::IntegerType>()) {
55+
diag << "expected element type to be an integer type";
56+
return;
57+
}
58+
5459
auto values = attr.tryGetValues<T>();
5560
if (!values) {
5661
diag << "unable to iterate type";

0 commit comments

Comments
 (0)