[mlir:ElementsAttr] Avoid crash on empty contiguous ranges
authorRiver Riddle <riddleriver@gmail.com>
Fri, 24 Sep 2021 23:45:25 +0000 (23:45 +0000)
committerRiver Riddle <riddleriver@gmail.com>
Fri, 24 Sep 2021 23:48:51 +0000 (23:48 +0000)
We currently, incorrectly, assume that a range always has at least
one element when building a contiguous range. This commit adds
a proper empty check to avoid crashing.

Differential Revision: https://reviews.llvm.org/D110457

mlir/include/mlir/IR/BuiltinAttributeInterfaces.td
mlir/test/IR/elements-attr-interface.mlir

index 2df7603..fa8cb28 100644 (file)
@@ -257,6 +257,11 @@ def ElementsAttrInterface : AttrInterface<"ElementsAttr"> {
     template <typename T>
     ::mlir::FailureOr<::mlir::detail::ElementsAttrIndexer> buildValueResult(
         /*isContiguous*/std::true_type) const {
+      if ($_attr.empty()) {
+        return ::mlir::detail::ElementsAttrIndexer::contiguous<T>(
+          /*isSplat=*/false, nullptr);
+      }
+
       auto valueIt = $_attr.value_begin_impl(OverloadToken<T>());
       return ::mlir::detail::ElementsAttrIndexer::contiguous(
         $_attr.isSplat(), &*valueIt);
index a9b00d2..3191b64 100644 (file)
@@ -19,3 +19,9 @@ std.constant dense<[10, 11, 12, 13, 14]> : tensor<5xi64>
 // expected-error@below {{Test iterating `APInt`: unable to iterate type}}
 // expected-error@below {{Test iterating `IntegerAttr`: unable to iterate type}}
 std.constant opaque<"_", "0xDEADBEEF"> : tensor<5xi64>
+
+// Check that we don't crash on empty element attributes.
+// expected-error@below {{Test iterating `uint64_t`: }}
+// expected-error@below {{Test iterating `APInt`: }}
+// expected-error@below {{Test iterating `IntegerAttr`: }}
+std.constant dense<> : tensor<0xi64>