[Mlir-commits] [mlir] 17f3664 - [mlir][memref] Fold no-op subview(subview(x)) ops
Matthias Springer
llvmlistbot at llvm.org
Wed Dec 14 03:47:08 PST 2022
Author: Matthias Springer
Date: 2022-12-14T12:47:00+01:00
New Revision: 17f36648e6d6f543af7a965b7ceab71a1cf69a6b
URL: https://github.com/llvm/llvm-project/commit/17f36648e6d6f543af7a965b7ceab71a1cf69a6b
DIFF: https://github.com/llvm/llvm-project/commit/17f36648e6d6f543af7a965b7ceab71a1cf69a6b.diff
LOG: [mlir][memref] Fold no-op subview(subview(x)) ops
Differential Revision: https://reviews.llvm.org/D140008
Added:
Modified:
mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
mlir/test/Dialect/MemRef/canonicalize.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
index 4b60eb9c79870..de9690fd2eb78 100644
--- a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
+++ b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
@@ -3065,6 +3065,24 @@ OpFoldResult SubViewOp::fold(ArrayRef<Attribute> operands) {
return getViewSource();
}
+ // Fold subview(subview(x)), where both subviews have the same size and the
+ // second subview's offsets are all zero. (I.e., the second subview is a
+ // no-op.)
+ if (auto srcSubview = getViewSource().getDefiningOp<SubViewOp>()) {
+ auto srcSizes = srcSubview.getMixedSizes();
+ auto sizes = getMixedSizes();
+ auto offsets = getMixedOffsets();
+ bool allOffsetsZero = llvm::all_of(
+ offsets, [](OpFoldResult ofr) { return isConstantIntValue(ofr, 0); });
+ auto strides = getMixedStrides();
+ bool allStridesOne = llvm::all_of(
+ strides, [](OpFoldResult ofr) { return isConstantIntValue(ofr, 1); });
+ bool allSizesSame = llvm::equal(sizes, srcSizes);
+ if (allOffsetsZero && allStridesOne && allSizesSame &&
+ resultShapedType == sourceShapedType)
+ return getViewSource();
+ }
+
return {};
}
diff --git a/mlir/test/Dialect/MemRef/canonicalize.mlir b/mlir/test/Dialect/MemRef/canonicalize.mlir
index d9710b75f5b3e..88d9155ccd361 100644
--- a/mlir/test/Dialect/MemRef/canonicalize.mlir
+++ b/mlir/test/Dialect/MemRef/canonicalize.mlir
@@ -875,3 +875,22 @@ func.func @collapse_expand_fold_to_cast(%m: memref<?xf32, strided<[1]>, 3>)
: memref<1x?xf32, 3> into memref<?xf32, 3>
return %1 : memref<?xf32, 3>
}
+
+// -----
+
+// CHECK-LABEL: func @fold_trivial_subviews(
+// CHECK-SAME: %[[m:.*]]: memref<?xf32, strided<[?], offset: ?>>
+// CHECK: %[[subview:.*]] = memref.subview %[[m]][5]
+// CHECK: return %[[subview]]
+func.func @fold_trivial_subviews(%m: memref<?xf32, strided<[?], offset: ?>>,
+ %sz: index)
+ -> memref<?xf32, strided<[?], offset: ?>>
+{
+ %0 = memref.subview %m[5] [%sz] [1]
+ : memref<?xf32, strided<[?], offset: ?>>
+ to memref<?xf32, strided<[?], offset: ?>>
+ %1 = memref.subview %0[0] [%sz] [1]
+ : memref<?xf32, strided<[?], offset: ?>>
+ to memref<?xf32, strided<[?], offset: ?>>
+ return %1 : memref<?xf32, strided<[?], offset: ?>>
+}
More information about the Mlir-commits
mailing list