diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp --- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp +++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp @@ -164,7 +164,7 @@ $_reader.emitError("size mismatch for operand/result_segment_size"); return failure(); } - llvm::copy(ArrayRef(attr), $_storage); + llvm::copy(ArrayRef(attr), $_storage.begin()); } else { return $_reader.readSparseArray(MutableArrayRef($_storage)); } @@ -429,7 +429,8 @@ /*storageType=*/storageType, /*interfaceType=*/"::llvm::ArrayRef", /*convertFromStorageCall=*/"$_storage", - /*assignToStorageCall=*/"::llvm::copy($_value, $_storage)", + /*assignToStorageCall=*/ + "llvm::copy($_value, $_storage.begin())", /*convertToAttributeCall=*/ "DenseI32ArrayAttr::get($_ctxt, $_storage)", /*convertFromAttributeCall=*/ @@ -445,7 +446,7 @@ if (op.getTrait("::mlir::OpTrait::AttrSizedOperandSegments")) { if (op.getDialect().usePropertiesForAttributes()) { operandSegmentsSizeStorage = - llvm::formatv("int32_t[{0}]", op.getNumOperands()); + llvm::formatv("std::array", op.getNumOperands()); operandSegmentsSize = {"odsOperandSegmentSizes", makeProperty(operandSegmentsSizeStorage)}; } else { @@ -458,7 +459,7 @@ if (op.getTrait("::mlir::OpTrait::AttrSizedResultSegments")) { if (op.getDialect().usePropertiesForAttributes()) { resultSegmentsSizeStorage = - llvm::formatv("int32_t[{0}]", op.getNumResults()); + llvm::formatv("std::array", op.getNumResults()); resultSegmentsSize = {"odsResultSegmentSizes", makeProperty(resultSegmentsSizeStorage)}; } else { @@ -1491,7 +1492,7 @@ if (!arrAttr) return; if (arrAttr.size() != sizeof(prop.{0}) / sizeof(int32_t)) return; - llvm::copy(arrAttr.asArrayRef(), prop.{0}); + llvm::copy(arrAttr.asArrayRef(), prop.{0}.begin()); return; } )decl", @@ -2341,7 +2342,8 @@ }); if (op.getDialect().usePropertiesForAttributes()) { body << "}), " << builderOpState - << ".getOrAddProperties().odsResultSegmentSizes);\n"; + << ".getOrAddProperties()." + "odsResultSegmentSizes.begin());\n"; } else { body << "}));\n"; } @@ -2966,7 +2968,8 @@ body << " llvm::copy(ArrayRef({"; emitSegment(); body << "}), " << builderOpState - << ".getOrAddProperties().odsOperandSegmentSizes);\n"; + << ".getOrAddProperties()." + "odsOperandSegmentSizes.begin());\n"; } else { body << " " << builderOpState << ".addAttribute(" << sizes << "AttrName(" << builderOpState << ".name), " diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp --- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp +++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp @@ -1666,7 +1666,7 @@ llvm::interleaveComma(op.getOperands(), body, interleaveFn); body << formatv("}), " "result.getOrAddProperties<{0}::Properties>()." - "odsOperandSegmentSizes);\n", + "odsOperandSegmentSizes.begin());\n", op.getCppClassName()); } else { body << " result.addAttribute(\"operand_segment_sizes\", " @@ -1708,11 +1708,10 @@ if (op.getDialect().usePropertiesForAttributes()) { body << "llvm::copy(ArrayRef({"; llvm::interleaveComma(op.getResults(), body, interleaveFn); - body << formatv( - "}), " - "result.getOrAddProperties<{0}::Properties>().odsResultSegmentSizes" - ");\n", - op.getCppClassName()); + body << formatv("}), " + "result.getOrAddProperties<{0}::Properties>()." + "odsResultSegmentSizes.begin());\n", + op.getCppClassName()); } else { body << " result.addAttribute(\"result_segment_sizes\", " << "parser.getBuilder().getDenseI32ArrayAttr({"; diff --git a/mlir/unittests/IR/AdaptorTest.cpp b/mlir/unittests/IR/AdaptorTest.cpp --- a/mlir/unittests/IR/AdaptorTest.cpp +++ b/mlir/unittests/IR/AdaptorTest.cpp @@ -40,12 +40,18 @@ // value from the value 0. SmallVector> v = {0, 4}; OIListSimple::Properties prop; - llvm::copy(ArrayRef{1, 0, 1}, prop.odsOperandSegmentSizes); + prop.odsOperandSegmentSizes = {1, 0, 1}; OIListSimple::GenericAdaptor>> d(v, {}, prop, {}); EXPECT_EQ(d.getArg0(), 0); EXPECT_EQ(d.getArg1(), std::nullopt); EXPECT_EQ(d.getArg2(), 4); + + // Check the property comparison operator. + OIListSimple::Properties equivalentProp = {1, 0, 1}; + OIListSimple::Properties differentProp = {0, 0, 1}; + EXPECT_EQ(d.getProperties(), equivalentProp); + EXPECT_NE(d.getProperties(), differentProp); } // Has VariadicOfVariadic arguments.