Skip to content

Commit 02d29af

Browse files
committed
[MLIR] Add decomposeMixedStridesOrOffsets and decomposeMixedSizes
Add the reverse functions to the ViewLikeInterface's functions `getMixedStrides`, `getMixedSizes`, and `getMixedOffsets`. The new functions are useful to build view-like operations from an array of mixed static/dynamic values. Differential Revision: https://reviews.llvm.org/D128376
1 parent 7bfad7b commit 02d29af

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

mlir/include/mlir/Interfaces/ViewLikeInterface.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@ SmallVector<OpFoldResult, 4> getMixedStrides(OffsetSizeAndStrideOpInterface op,
4949
ArrayAttr staticStrides,
5050
ValueRange strides);
5151

52+
/// Decompose a vector of mixed static or dynamic strides/offsets into the
53+
/// corresponding pair of arrays. This is the inverse function of
54+
/// `getMixedStrides` and `getMixedOffsets`.
55+
std::pair<ArrayAttr, SmallVector<Value>> decomposeMixedStridesOrOffsets(
56+
OpBuilder &b, const SmallVectorImpl<OpFoldResult> &mixedValues);
57+
58+
/// Decompose a vector of mixed static or dynamic strides/offsets into the
59+
/// corresponding pair of arrays. This is the inverse function of
60+
/// `getMixedSizes`.
61+
std::pair<ArrayAttr, SmallVector<Value>>
62+
decomposeMixedSizes(OpBuilder &b,
63+
const SmallVectorImpl<OpFoldResult> &mixedValues);
64+
5265
namespace detail {
5366
LogicalResult verifyOffsetSizeAndStrideOp(OffsetSizeAndStrideOpInterface op);
5467

mlir/lib/Interfaces/ViewLikeInterface.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,3 +242,31 @@ mlir::getMixedStrides(OffsetSizeAndStrideOpInterface op,
242242
}
243243
return res;
244244
}
245+
246+
static std::pair<ArrayAttr, SmallVector<Value>>
247+
decomposeMixedImpl(OpBuilder &b,
248+
const SmallVectorImpl<OpFoldResult> &mixedValues,
249+
const int64_t dynamicValuePlaceholder) {
250+
SmallVector<int64_t> staticValues;
251+
SmallVector<Value> dynamicValues;
252+
for (const auto &it : mixedValues) {
253+
if (it.is<Attribute>()) {
254+
staticValues.push_back(it.get<Attribute>().cast<IntegerAttr>().getInt());
255+
} else {
256+
staticValues.push_back(ShapedType::kDynamicStrideOrOffset);
257+
dynamicValues.push_back(it.get<Value>());
258+
}
259+
}
260+
return {b.getI64ArrayAttr(staticValues), dynamicValues};
261+
}
262+
263+
std::pair<ArrayAttr, SmallVector<Value>> mlir::decomposeMixedStridesOrOffsets(
264+
OpBuilder &b, const SmallVectorImpl<OpFoldResult> &mixedValues) {
265+
return decomposeMixedImpl(b, mixedValues, ShapedType::kDynamicStrideOrOffset);
266+
}
267+
268+
std::pair<ArrayAttr, SmallVector<Value>>
269+
mlir::decomposeMixedSizes(OpBuilder &b,
270+
const SmallVectorImpl<OpFoldResult> &mixedValues) {
271+
return decomposeMixedImpl(b, mixedValues, ShapedType::kDynamicSize);
272+
}

0 commit comments

Comments
 (0)