[Mlir-commits] [mlir] [MLIR][Vector] Add a pattern that folds consecutive extract_strided_strided_slice ops (PR #175738)
Adam Paszke
llvmlistbot at llvm.org
Tue Jan 13 08:03:00 PST 2026
================
@@ -4366,6 +4366,68 @@ void ExtractStridedSliceOp::getOffsets(SmallVectorImpl<int64_t> &results) {
namespace {
+// Pattern to rewrite nested ExtractStridedSliceOp into a single one.
+//
+// Example:
+//
+// %0 = vector.extract_strided_slice %arg0
+// {offsets = [1, 2], sizes = [3, 4], strides = [1, 1]}
+// : vector<4x8x16xf32> to vector<3x4x16xf32>
+// %1 = vector.extract_strided_slice %0
+// {offsets = [0, 1], sizes = [2, 2], strides = [1, 1]}
+// : vector<3x4x16xf32> to vector<2x2x16xf32>
+//
+// to
+//
+// %1 = vector.extract_strided_slice %arg0
+// {offsets = [1, 3], sizes = [2, 2], strides = [1, 1]}
+// : vector<4x8x16xf32> to vector<2x2x16xf32>
+class StridedSliceFolder final
+ : public OpRewritePattern<ExtractStridedSliceOp> {
+public:
+ using OpRewritePattern<ExtractStridedSliceOp>::OpRewritePattern;
+
+ LogicalResult matchAndRewrite(ExtractStridedSliceOp secondOp,
+ PatternRewriter &rewriter) const override {
+ auto firstOp = secondOp.getSource().getDefiningOp<ExtractStridedSliceOp>();
+ if (!firstOp)
+ return failure();
+
+ if (secondOp.hasNonUnitStrides() || firstOp.hasNonUnitStrides())
+ return failure();
+
+ SmallVector<int64_t> firstOffsets = getI64SubArray(firstOp.getOffsets());
+ SmallVector<int64_t> firstSizes = getI64SubArray(firstOp.getSizes());
+ SmallVector<int64_t> secondOffsets = getI64SubArray(secondOp.getOffsets());
+ SmallVector<int64_t> secondSizes = getI64SubArray(secondOp.getSizes());
+
+ unsigned newRank = std::max(firstOffsets.size(), secondOffsets.size());
+ SmallVector<int64_t> combinedOffsets(newRank, 0);
+ SmallVector<int64_t> combinedSizes(newRank);
----------------
apaszke wrote:
I think the checks on the rank are still necessary because even if here we pad the offsets/sizes to the full rank, the ops we are rewriting might not. Unless I misunderstood what you meant?
https://github.com/llvm/llvm-project/pull/175738
More information about the Mlir-commits
mailing list