[Mlir-commits] [mlir] [mlir][memref] Add a `ViewOp::getMixedSizes` (PR #176561)

Longsheng Mou llvmlistbot at llvm.org
Sat Jan 17 07:26:39 PST 2026


https://github.com/CoTinker updated https://github.com/llvm/llvm-project/pull/176561

>From ccf07b87cb8d9fa613bd5d8bc0322820ae4dbce3 Mon Sep 17 00:00:00 2001
From: Longsheng Mou <longshengmou at gmail.com>
Date: Sat, 17 Jan 2026 19:58:34 +0800
Subject: [PATCH 1/3] [mlir][memref] Add a `ViewOp::getMixedSizes`

This PR adds a useful `getMixedSizes` method for memref.view.
---
 mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td |  3 +++
 mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp         | 16 ++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
index bd96bace7994f..6f8f1481725fc 100644
--- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
+++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
@@ -2459,6 +2459,9 @@ def MemRef_ViewOp : MemRef_Op<"view", [
     /// The result of a view is always a memref.
     MemRefType getType() { return ::llvm::cast<MemRefType>(getResult().getType()); }
 
+    // Return both static and dynamic sizes as a list of `OpFoldResult`.
+    SmallVector<OpFoldResult> getMixedSizes();
+
     /// Returns the dynamic sizes for this view operation. This is redundant
     /// with `sizes` but needed in template implementations. More specifically:
     /// ```
diff --git a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
index e0f7a8b452a1d..aea2bc58dd5ee 100644
--- a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
+++ b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
@@ -3762,6 +3762,22 @@ OpFoldResult ViewOp::fold(FoldAdaptor adaptor) {
   return {};
 }
 
+SmallVector<OpFoldResult> ViewOp::getMixedSizes() {
+  SmallVector<OpFoldResult> result;
+  unsigned ctr = 0;
+  OpBuilder b(getContext());
+  MemRefType resultType = getType();
+  auto resultShape = resultType.getShape();
+  for (int64_t i = 0; i < resultType.getRank(); ++i) {
+    if (resultType.isDynamicDim(i)) {
+      result.push_back(getSizes()[ctr++]);
+    } else {
+      result.push_back(b.getIndexAttr(resultShape[i]));
+    }
+  }
+  return result;
+}
+
 namespace {
 
 struct ViewOpShapeFolder : public OpRewritePattern<ViewOp> {

>From 675136cdd0c3041bec5dcead921700e90b3bde6a Mon Sep 17 00:00:00 2001
From: Longsheng Mou <longshengmou at gmail.com>
Date: Sat, 17 Jan 2026 22:48:33 +0800
Subject: [PATCH 2/3] use Builder

---
 mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
index aea2bc58dd5ee..4c7ec2c89a13f 100644
--- a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
+++ b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
@@ -3765,7 +3765,7 @@ OpFoldResult ViewOp::fold(FoldAdaptor adaptor) {
 SmallVector<OpFoldResult> ViewOp::getMixedSizes() {
   SmallVector<OpFoldResult> result;
   unsigned ctr = 0;
-  OpBuilder b(getContext());
+  Builder b(getContext());
   MemRefType resultType = getType();
   auto resultShape = resultType.getShape();
   for (int64_t i = 0; i < resultType.getRank(); ++i) {

>From f3b63782075a1fb66d86559eced4dd419f90ed2a Mon Sep 17 00:00:00 2001
From: Longsheng Mou <longshengmou at gmail.com>
Date: Sat, 17 Jan 2026 23:24:35 +0800
Subject: [PATCH 3/3] do not recalculate end

---
 mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp |  2 +-
 mlir/lib/Dialect/Tensor/IR/TensorOps.cpp | 10 ++++++----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
index 4c7ec2c89a13f..b9bd304bac12c 100644
--- a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
+++ b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
@@ -3768,7 +3768,7 @@ SmallVector<OpFoldResult> ViewOp::getMixedSizes() {
   Builder b(getContext());
   MemRefType resultType = getType();
   auto resultShape = resultType.getShape();
-  for (int64_t i = 0; i < resultType.getRank(); ++i) {
+  for (int64_t i = 0, e = resultType.getRank(); i < e; ++i) {
     if (resultType.isDynamicDim(i)) {
       result.push_back(getSizes()[ctr++]);
     } else {
diff --git a/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp b/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp
index 05db7d0dd33ee..4bd63b96052a1 100644
--- a/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp
+++ b/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp
@@ -1107,12 +1107,14 @@ Value EmptyOp::getDynamicSize(unsigned idx) {
 SmallVector<OpFoldResult> EmptyOp::getMixedSizes() {
   SmallVector<OpFoldResult> result;
   unsigned ctr = 0;
-  OpBuilder b(getContext());
-  for (int64_t i = 0; i < getType().getRank(); ++i) {
-    if (getType().isDynamicDim(i)) {
+  Builder b(getContext());
+  RankedTensorType type = getType();
+  auto shape = type.getShape();
+  for (int64_t i = 0, e = type.getRank(); i < e; ++i) {
+    if (type.isDynamicDim(i)) {
       result.push_back(getDynamicSizes()[ctr++]);
     } else {
-      result.push_back(b.getIndexAttr(getType().getShape()[i]));
+      result.push_back(b.getIndexAttr(shape[i]));
     }
   }
   return result;



More information about the Mlir-commits mailing list