diff --git a/mlir/include/mlir/IR/BuiltinAttributes.td b/mlir/include/mlir/IR/BuiltinAttributes.td --- a/mlir/include/mlir/IR/BuiltinAttributes.td +++ b/mlir/include/mlir/IR/BuiltinAttributes.td @@ -155,8 +155,11 @@ }]; } -def Builtin_DenseArray : Builtin_Attr< - "DenseArray", [ElementsAttrInterface, TypedAttrInterface]> { +def Builtin_DenseArray : Builtin_Attr<"DenseArray", [ + DeclareAttrInterfaceMethods, + TypedAttrInterface + ]> { let summary = "A dense array of integer or floating point elements."; let description = [{ A dense array attribute is an attribute that represents a dense array of @@ -206,24 +209,6 @@ }]>, ]; - let extraClassDeclaration = [{ - /// Allow implicit conversion to ElementsAttr. - operator ElementsAttr() const { - return *this ? cast() : nullptr; - } - - /// ElementsAttr implementation. - using ContiguousIterableTypesT = - std::tuple; - const bool *value_begin_impl(OverloadToken) const; - const int8_t *value_begin_impl(OverloadToken) const; - const int16_t *value_begin_impl(OverloadToken) const; - const int32_t *value_begin_impl(OverloadToken) const; - const int64_t *value_begin_impl(OverloadToken) const; - const float *value_begin_impl(OverloadToken) const; - const double *value_begin_impl(OverloadToken) const; - }]; - let genVerifyDecl = 1; } diff --git a/mlir/lib/IR/BuiltinAttributes.cpp b/mlir/lib/IR/BuiltinAttributes.cpp --- a/mlir/lib/IR/BuiltinAttributes.cpp +++ b/mlir/lib/IR/BuiltinAttributes.cpp @@ -709,28 +709,46 @@ return success(); } -const bool *DenseArrayAttr::value_begin_impl(OverloadToken) const { - return cast().asArrayRef().begin(); -} -const int8_t *DenseArrayAttr::value_begin_impl(OverloadToken) const { - return cast().asArrayRef().begin(); -} -const int16_t *DenseArrayAttr::value_begin_impl(OverloadToken) const { - return cast().asArrayRef().begin(); -} -const int32_t *DenseArrayAttr::value_begin_impl(OverloadToken) const { - return cast().asArrayRef().begin(); -} -const int64_t *DenseArrayAttr::value_begin_impl(OverloadToken) const { - return cast().asArrayRef().begin(); -} -const float *DenseArrayAttr::value_begin_impl(OverloadToken) const { - return cast().asArrayRef().begin(); -} -const double *DenseArrayAttr::value_begin_impl(OverloadToken) const { - return cast().asArrayRef().begin(); +//===----------------------------------------------------------------------===// +// ElementsAttr Implementation + +/// A dense array is never a splat. +bool DenseArrayAttr::isSplat() const { return false; } + +/// Try to dispatch to the given dense array subclass to contiguously iterate +/// its elements. +template +static FailureOr +tryContainerBegin(DenseArrayAttr attr) { + if (auto container = attr.dyn_cast()) + return detail::ElementsAttrIndexer::contiguous( + /*isSplat=*/false, container.asArrayRef().begin()); + return failure(); +} + +/// Re-implement `getValuesImpl` to dynamically dispatch to subclasses. +FailureOr +DenseArrayAttr::getValuesImpl(TypeID elementID) const { + if (elementID == TypeID::get()) + return tryContainerBegin(*this); + if (elementID == TypeID::get()) + return tryContainerBegin(*this); + if (elementID == TypeID::get()) + return tryContainerBegin(*this); + if (elementID == TypeID::get()) + return tryContainerBegin(*this); + if (elementID == TypeID::get()) + return tryContainerBegin(*this); + if (elementID == TypeID::get()) + return tryContainerBegin(*this); + if (elementID == TypeID::get()) + return tryContainerBegin(*this); + return failure(); } +//===----------------------------------------------------------------------===// +// DenseArrayAttrUtil + namespace { /// Instantiations of this class provide utilities for interacting with native /// data types in the context of DenseArrayAttr. @@ -814,6 +832,9 @@ }; } // namespace +//===----------------------------------------------------------------------===// +// DenseArrayAttrImpl + template void DenseArrayAttrImpl::print(AsmPrinter &printer) const { print(printer.getStream());