From a0bf7c4fb3456b305fc7696967104270efa82875 Mon Sep 17 00:00:00 2001 From: TatWai Chong Date: Sat, 28 Jan 2023 20:43:14 -0800 Subject: Switch ArrayAttr to DenseArrayAttr Align with mlir commits: 9e1a344155c0b78be46348b94cae635b7305326c 11030c7d67a7ac0b469e3fbc53dd7a09b47792c9 Change-Id: I5be0fc084fabc1057a39127b67a1ee9a55e5079f Signed-off-by: TatWai Chong --- src/TosaSerialize.cpp | 180 ++++++++++++-------------------------------------- 1 file changed, 41 insertions(+), 139 deletions(-) diff --git a/src/TosaSerialize.cpp b/src/TosaSerialize.cpp index 51923ea..ead54f1 100644 --- a/src/TosaSerialize.cpp +++ b/src/TosaSerialize.cpp @@ -202,6 +202,19 @@ TosaSerializationOperatorBuilder::GetTensorName(mlir::Value val) const { assert(0); } +// Unpack 64-bit integer attribute element and pack into a std vector. +template +static std::vector getDenseI64ArrayAttr(mlir::Attribute attr) { + auto array_ref = attr.cast().asArrayRef(); + + std::vector vec; + for (auto val : array_ref) { + vec.push_back(val); + } + + return vec; +} + // Main template to catch unimplemented translation. template TosaSerializationOperator * @@ -225,26 +238,13 @@ TosaSerializationOperatorBuilder::build(mlir::Operation &op) const { TosaSerializationOperator * TosaSerializationOperatorBuilder::BuildPoolOpFromMlirOp(mlir::Operation &op, Op opcode) const { - std::vector pad, stride, kernel; - - auto pad_attr = op.getAttr("pad").dyn_cast().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast().getInt()); - } + auto pad = getDenseI64ArrayAttr(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast().getInt()); - } + auto stride = getDenseI64ArrayAttr(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto kernel_attr = - op.getAttr("kernel").dyn_cast().getValue(); - for (auto &int_attr : kernel_attr) { - kernel.push_back(int_attr.dyn_cast().getInt()); - } + auto kernel = getDenseI64ArrayAttr(op.getAttr("kernel")); ASSERT_VECTOR_LENGTH(kernel, 2); std::string input_name = GetTensorName(op.getOperand(0)); @@ -549,26 +549,13 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build( mlir::Operation &op) const { - std::vector pad, stride, dilation; - - auto pad_attr = op.getAttr("pad").dyn_cast().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast().getInt()); - } + auto pad = getDenseI64ArrayAttr(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast().getInt()); - } + auto stride = getDenseI64ArrayAttr(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto dilation_attr = - op.getAttr("dilation").dyn_cast().getValue(); - for (auto &int_attr : dilation_attr) { - dilation.push_back(int_attr.dyn_cast().getInt()); - } + auto dilation = getDenseI64ArrayAttr(op.getAttr("dilation")); ASSERT_VECTOR_LENGTH(dilation, 2); std::string input0_name = GetTensorName(op.getOperand(0)); @@ -600,26 +587,13 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build( mlir::Operation &op) const { - std::vector pad, stride, dilation; - - auto pad_attr = op.getAttr("pad").dyn_cast().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast().getInt()); - } + auto pad = getDenseI64ArrayAttr(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 6); - auto stride_attr = - op.getAttr("stride").dyn_cast().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast().getInt()); - } + auto stride = getDenseI64ArrayAttr(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 3); - auto dilation_attr = - op.getAttr("dilation").dyn_cast().getValue(); - for (auto &int_attr : dilation_attr) { - dilation.push_back(int_attr.dyn_cast().getInt()); - } + auto dilation = getDenseI64ArrayAttr(op.getAttr("dilation")); ASSERT_VECTOR_LENGTH(dilation, 3); std::string input0_name = GetTensorName(op.getOperand(0)); @@ -650,26 +624,13 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build( mlir::Operation &op) const { - std::vector pad, stride, dilation; - - auto pad_attr = op.getAttr("pad").dyn_cast().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast().getInt()); - } + auto pad = getDenseI64ArrayAttr(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast().getInt()); - } + auto stride = getDenseI64ArrayAttr(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto dilation_attr = - op.getAttr("dilation").dyn_cast().getValue(); - for (auto &int_attr : dilation_attr) { - dilation.push_back(int_attr.dyn_cast().getInt()); - } + auto dilation = getDenseI64ArrayAttr(op.getAttr("dilation")); ASSERT_VECTOR_LENGTH(dilation, 2); std::string input0_name = GetTensorName(op.getOperand(0)); @@ -700,28 +661,14 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build( mlir::Operation &op) const { - std::vector outpad, stride, dilation, output_shape; - - auto outpad_attr = - op.getAttr("out_pad").dyn_cast().getValue(); - for (auto &int_attr : outpad_attr) { - outpad.push_back(int_attr.dyn_cast().getInt()); - } - ASSERT_VECTOR_LENGTH(outpad, 4); + auto out_pad = getDenseI64ArrayAttr(op.getAttr("out_pad")); + ASSERT_VECTOR_LENGTH(out_pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast().getInt()); - } + auto stride = getDenseI64ArrayAttr(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto output_shape_attr = - op.getAttr("out_shape").dyn_cast().getValue(); - for (auto &int_attr : output_shape_attr) { - output_shape.push_back(int_attr.dyn_cast().getInt()); - } - ASSERT_VECTOR_LENGTH(output_shape, 4); + auto out_shape = getDenseI64ArrayAttr(op.getAttr("out_shape")); + ASSERT_VECTOR_LENGTH(out_shape, 4); std::string input0_name = GetTensorName(op.getOperand(0)); std::string input1_name = GetTensorName(op.getOperand(1)); @@ -737,7 +684,7 @@ TosaSerializationOperatorBuilder::build( op.getOperand(0).getType().cast(); DType type = Type2AccumDType(tensor.getElementType()); - TosaTransposeConvAttribute attribute(outpad, stride, output_shape, input_zp, weight_zp, type); + TosaTransposeConvAttribute attribute(out_pad, stride, out_shape, input_zp, weight_zp, type); TosaSerializationOperator *tyop = new TosaSerializationOperator( Op_TRANSPOSE_CONV2D, Attribute_TransposeConvAttribute, &attribute, @@ -919,13 +866,7 @@ TosaSerializationOperatorBuilder::build( mlir::Operation &op) const { std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); - - std::vector shape; - auto shape_attr = - op.getAttr("new_shape").dyn_cast().getValue(); - for (auto &int_attr : shape_attr) { - shape.push_back(int_attr.dyn_cast().getInt()); - } + auto shape = getDenseI64ArrayAttr(op.getAttr("new_shape")); TosaReshapeAttribute attribute(shape); @@ -993,17 +934,8 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build( mlir::Operation &op) const { - std::vector start, size; - auto begin_attr = op.getAttr("start").dyn_cast().getValue(); - auto size_attr = op.getAttr("size").dyn_cast().getValue(); - - for (auto &int_attr : begin_attr) { - start.push_back(int_attr.dyn_cast().getInt()); - } - - for (auto &int_attr : size_attr) { - size.push_back(int_attr.dyn_cast().getInt()); - } + auto start = getDenseI64ArrayAttr(op.getAttr("start")); + auto size = getDenseI64ArrayAttr(op.getAttr("size")); TosaSliceAttribute attribute(start, size); @@ -1024,13 +956,7 @@ TosaSerializationOperatorBuilder::build( mlir::Operation &op) const { std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); - - std::vector multiples; - auto multiples_attr = - op.getAttr("multiples").dyn_cast().getValue(); - for (auto &int_attr : multiples_attr) { - multiples.push_back(int_attr.dyn_cast().getInt()); - } + auto multiples = getDenseI64ArrayAttr(op.getAttr("multiples")); TosaTileAttribute attribute(multiples); @@ -1082,28 +1008,13 @@ TosaSerializationOperatorBuilder::build( std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); - std::vector scale; - auto scale_attr = - op.getAttr("scale").dyn_cast().getValue(); - for (auto &int_attr : scale_attr) { - scale.push_back(int_attr.dyn_cast().getInt()); - } + auto scale = getDenseI64ArrayAttr(op.getAttr("scale")); ASSERT_VECTOR_LENGTH(scale, 4); - std::vector offset; - auto offset_attr = - op.getAttr("offset").dyn_cast().getValue(); - for (auto &int_attr : offset_attr) { - offset.push_back(int_attr.dyn_cast().getInt()); - } + auto offset = getDenseI64ArrayAttr(op.getAttr("offset")); ASSERT_VECTOR_LENGTH(offset, 2); - std::vector border; - auto border_attr = - op.getAttr("border").dyn_cast().getValue(); - for (auto &int_attr : border_attr) { - border.push_back(int_attr.dyn_cast().getInt()); - } + auto border = getDenseI64ArrayAttr(op.getAttr("border")); ASSERT_VECTOR_LENGTH(border, 2); auto mode_str = @@ -1222,18 +1133,9 @@ TosaSerializationOperatorBuilder::build( bool per_channel = op.getAttr("per_channel").dyn_cast().getValue(); - std::vector multiplier, shift; - auto multiplier_attr = - op.getAttr("multiplier").dyn_cast().getValue(); - auto shift_attr = op.getAttr("shift").dyn_cast().getValue(); - - for (auto &int_attr : multiplier_attr) { - multiplier.push_back(int_attr.dyn_cast().getInt()); - } - - for (auto &int_attr : shift_attr) { - shift.push_back(int_attr.dyn_cast().getInt()); - } + auto multiplier = + op.getAttr("multiplier").dyn_cast().asArrayRef(); + auto shift = op.getAttr("shift").dyn_cast().asArrayRef(); std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); -- cgit v1.2.1