diff options
| author | Lorenzo Chelini <l.chelini@icloud.com> | 2022-11-22 12:41:44 +0100 |
|---|---|---|
| committer | Lorenzo Chelini <l.chelini@icloud.com> | 2022-11-25 09:43:30 +0100 |
| commit | a9733b8a5eed441d6378d0fc88630233e00a6395 (patch) | |
| tree | 7ad5d94c022de1fdb22f7220bd5111e932ad4be9 /mlir/lib/Interfaces/ViewLikeInterface.cpp | |
| parent | 36f61d14fb851b5ca6e8806890a2ee284be964ab (diff) | |
[MLIR] Adopt `DenseI64ArrayAttr` in tensor, memref and linalg transform
This commit is a first step toward removing inconsistencies between dynamic
and static attributes (i64 v. index) by dropping `I64ArrayAttr` and
using `DenseI64ArrayAttr` in Tensor, Memref and Linalg Transform ops.
In Linalg Transform ops only `TileToScfForOp` and `TileOp` have been updated.
See related discussion: https://discourse.llvm.org/t/rfc-inconsistency-between-dynamic-and-static-attributes-i64-v-index/66612/1
Reviewed By: nicolasvasilache
Differential Revision: https://reviews.llvm.org/D138567
Diffstat (limited to 'mlir/lib/Interfaces/ViewLikeInterface.cpp')
| -rw-r--r-- | mlir/lib/Interfaces/ViewLikeInterface.cpp | 67 |
1 files changed, 18 insertions, 49 deletions
diff --git a/mlir/lib/Interfaces/ViewLikeInterface.cpp b/mlir/lib/Interfaces/ViewLikeInterface.cpp index 775d26a6d159..9a39a217bf44 100644 --- a/mlir/lib/Interfaces/ViewLikeInterface.cpp +++ b/mlir/lib/Interfaces/ViewLikeInterface.cpp @@ -20,15 +20,15 @@ using namespace mlir; LogicalResult mlir::verifyListOfOperandsOrIntegers(Operation *op, StringRef name, unsigned numElements, - ArrayAttr attr, + ArrayRef<int64_t> staticVals, ValueRange values) { - /// Check static and dynamic offsets/sizes/strides does not overflow type. - if (attr.size() != numElements) + // Check static and dynamic offsets/sizes/strides does not overflow type. + if (staticVals.size() != numElements) return op->emitError("expected ") << numElements << " " << name << " values"; unsigned expectedNumDynamicEntries = - llvm::count_if(attr.getValue(), [&](Attribute attr) { - return ShapedType::isDynamic(attr.cast<IntegerAttr>().getInt()); + llvm::count_if(staticVals, [&](int64_t staticVal) { + return ShapedType::isDynamic(staticVal); }); if (values.size() != expectedNumDynamicEntries) return op->emitError("expected ") @@ -70,19 +70,19 @@ mlir::detail::verifyOffsetSizeAndStrideOp(OffsetSizeAndStrideOpInterface op) { } void mlir::printDynamicIndexList(OpAsmPrinter &printer, Operation *op, - OperandRange values, ArrayAttr integers) { + OperandRange values, + ArrayRef<int64_t> integers) { printer << '['; if (integers.empty()) { printer << "]"; return; } unsigned idx = 0; - llvm::interleaveComma(integers, printer, [&](Attribute a) { - int64_t val = a.cast<IntegerAttr>().getInt(); - if (ShapedType::isDynamic(val)) + llvm::interleaveComma(integers, printer, [&](int64_t integer) { + if (ShapedType::isDynamic(integer)) printer << values[idx++]; else - printer << val; + printer << integer; }); printer << ']'; } @@ -90,28 +90,28 @@ void mlir::printDynamicIndexList(OpAsmPrinter &printer, Operation *op, ParseResult mlir::parseDynamicIndexList( OpAsmParser &parser, SmallVectorImpl<OpAsmParser::UnresolvedOperand> &values, - ArrayAttr &integers) { + DenseI64ArrayAttr &integers) { if (failed(parser.parseLSquare())) return failure(); // 0-D. if (succeeded(parser.parseOptionalRSquare())) { - integers = parser.getBuilder().getArrayAttr({}); + integers = parser.getBuilder().getDenseI64ArrayAttr({}); return success(); } - SmallVector<int64_t, 4> attrVals; + SmallVector<int64_t, 4> integerVals; while (true) { OpAsmParser::UnresolvedOperand operand; auto res = parser.parseOptionalOperand(operand); if (res.has_value() && succeeded(res.value())) { values.push_back(operand); - attrVals.push_back(ShapedType::kDynamic); + integerVals.push_back(ShapedType::kDynamic); } else { - IntegerAttr attr; - if (failed(parser.parseAttribute<IntegerAttr>(attr))) + int64_t integer; + if (failed(parser.parseInteger(integer))) return parser.emitError(parser.getNameLoc()) << "expected SSA value or integer"; - attrVals.push_back(attr.getInt()); + integerVals.push_back(integer); } if (succeeded(parser.parseOptionalComma())) @@ -120,7 +120,7 @@ ParseResult mlir::parseDynamicIndexList( return failure(); break; } - integers = parser.getBuilder().getI64ArrayAttr(attrVals); + integers = parser.getBuilder().getDenseI64ArrayAttr(integerVals); return success(); } @@ -144,34 +144,3 @@ bool mlir::detail::sameOffsetsSizesAndStrides( return false; return true; } - -SmallVector<OpFoldResult, 4> mlir::getMixedValues(ArrayAttr staticValues, - ValueRange dynamicValues) { - SmallVector<OpFoldResult, 4> res; - res.reserve(staticValues.size()); - unsigned numDynamic = 0; - unsigned count = static_cast<unsigned>(staticValues.size()); - for (unsigned idx = 0; idx < count; ++idx) { - APInt value = staticValues[idx].cast<IntegerAttr>().getValue(); - res.push_back(ShapedType::isDynamic(value.getSExtValue()) - ? OpFoldResult{dynamicValues[numDynamic++]} - : OpFoldResult{staticValues[idx]}); - } - return res; -} - -std::pair<ArrayAttr, SmallVector<Value>> -mlir::decomposeMixedValues(Builder &b, - const SmallVectorImpl<OpFoldResult> &mixedValues) { - SmallVector<int64_t> staticValues; - SmallVector<Value> dynamicValues; - for (const auto &it : mixedValues) { - if (it.is<Attribute>()) { - staticValues.push_back(it.get<Attribute>().cast<IntegerAttr>().getInt()); - } else { - staticValues.push_back(ShapedType::kDynamic); - dynamicValues.push_back(it.get<Value>()); - } - } - return {b.getI64ArrayAttr(staticValues), dynamicValues}; -} |
