[Mlir-commits] [mlir] [mlir][tosa] Fold 'small' constant 1D slice operations (PR #128193)
Jack Frankland
llvmlistbot at llvm.org
Thu Feb 27 07:10:56 PST 2025
================
@@ -1115,18 +1115,41 @@ OpFoldResult SliceOp::fold(FoldAdaptor adaptor) {
return SplatElementsAttr::get(outputTy, operand.getSplatValue<Attribute>());
}
- if (inputTy.hasStaticShape() && outputTy.hasStaticShape() &&
- outputTy.getNumElements() == 1) {
- DenseElementsAttr startElems;
- if (!matchPattern(getStart(), m_Constant(&startElems)))
- return {};
+ if (!inputTy.hasStaticShape() || !outputTy.hasStaticShape())
+ return {};
+
+ DenseElementsAttr startElems;
+ if (!matchPattern(getStart(), m_Constant(&startElems)))
+ return {};
- llvm::SmallVector<uint64_t> indices =
- llvm::to_vector(startElems.getValues<uint64_t>());
+ llvm::SmallVector<uint64_t> indices =
+ llvm::to_vector(startElems.getValues<uint64_t>());
+
+ if (outputTy.getNumElements() == 1) {
auto value = operand.getValues<Attribute>()[indices];
return SplatElementsAttr::get(outputTy, value);
}
+ DenseElementsAttr size_elems;
+ if (!matchPattern(getSize(), m_Constant(&size_elems)))
+ return {};
+ const llvm::SmallVector<uint64_t> sizes =
+ llvm::to_vector(size_elems.getValues<uint64_t>());
+
+ // Fold slice when all operands are constant and the output is 'small'
+ // A 'small' output is currently defined as 1D and <= 6 elements
+ // (tosa_level_8k MAX_RANK)
+ if (inputTy.getRank() == 1 && outputTy.getRank() == 1 &&
+ outputTy.getNumElements() <= 6 && indices.size() == 1 &&
+ sizes.size() == 1) {
+ const auto begin = operand.value_begin<Attribute>();
----------------
FranklandJack wrote:
I'm not sure this should be `const` since it is an iterator of a core MLIR type: https://mlir.llvm.org/docs/Rationale/UsageOfConst/
https://github.com/llvm/llvm-project/pull/128193
More information about the Mlir-commits
mailing list