[Mlir-commits] [mlir] [mlir][memref] Add static_sizes attribute to memref.view (PR #183795)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Feb 27 10:42:19 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-openacc
@llvm/pr-subscribers-mlir-func
Author: Amir Bishara (amirBish)
<details>
<summary>Changes</summary>
Add a `DenseI64ArrayAttr:$static_sizes` argument to `memref.view`, aligning it with `memref.subview` and `memref.reinterpret_cast` which already represent sizes as a mix of static attribute values and dynamic SSA operands.
Previously, `memref.view` only accepted dynamic SSA values for sizes, and static size information was only encoded implicitly in the result memref type. This made the op inconsistent with the rest of the dialect and limited the ability to express mixed static/dynamic sizes directly.
Also, Not having such an attribute made it hard to make a verification in the ViewOp's verifier without inspecting the producer's ops, therfore having such encoded attribute will make it possible.
The assembly format now uses `custom<DynamicIndexList>` to print/parse the sizes list, where static sizes appear as integer literals and dynamic sizes as SSA values:
// Before:
memref.view %buf[%off][] : memref<2048xi8> to memref<64x4xf32>
memref.view %buf[%off][%s0] : memref<2048xi8> to memref<4x?xf32>
// After:
memref.view %buf[%off][64, 4] : memref<2048xi8> to memref<64x4xf32>
memref.view %buf[%off][4, %s0] : memref<2048xi8> to memref<4x?xf32>
Three convenience builders are added accepting `ArrayRef<OpFoldResult>`, `ArrayRef<int64_t>`, and `ValueRange` for the sizes argument.
---
Patch is 63.53 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/183795.diff
23 Files Affected:
- (modified) mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td (+29-9)
- (modified) mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp (+3-2)
- (modified) mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp (+84-45)
- (modified) mlir/test/Analysis/test-alias-analysis.mlir (+1-1)
- (modified) mlir/test/Conversion/GPUCommon/lower-memory-space-attrs.mlir (+2-2)
- (modified) mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir (+4-4)
- (modified) mlir/test/Conversion/XeGPUToXeVM/loadstore_matrix.mlir (+1-1)
- (modified) mlir/test/Dialect/Func/func-transform-invalid.mlir (+22-22)
- (modified) mlir/test/Dialect/Func/func-transform.mlir (+40-40)
- (modified) mlir/test/Dialect/GPU/dynamic-shared-memory.mlir (+4-4)
- (modified) mlir/test/Dialect/Linalg/canonicalize.mlir (+1-1)
- (modified) mlir/test/Dialect/Linalg/forward-vector-transfers.mlir (+3-3)
- (modified) mlir/test/Dialect/Linalg/loops.mlir (+12-12)
- (modified) mlir/test/Dialect/Linalg/promote.mlir (+6-6)
- (modified) mlir/test/Dialect/Linalg/promotion_options.mlir (+2-2)
- (modified) mlir/test/Dialect/Linalg/roundtrip.mlir (+2-2)
- (modified) mlir/test/Dialect/Linalg/transform-promotion.mlir (+6-6)
- (modified) mlir/test/Dialect/MemRef/canonicalize.mlir (+7-7)
- (modified) mlir/test/Dialect/MemRef/invalid.mlir (+1-1)
- (modified) mlir/test/Dialect/MemRef/ops.mlir (+2-2)
- (modified) mlir/test/Dialect/NVGPU/canonicalization.mlir (+2-2)
- (modified) mlir/test/Dialect/OpenACC/acc-implicit-data.mlir (+1-1)
- (modified) mlir/test/Transforms/canonicalize.mlir (+5-5)
``````````diff
diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
index 70180c101407a..e0e5a28bc9504 100644
--- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
+++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
@@ -2422,8 +2422,11 @@ def MemRef_ViewOp : MemRef_Op<"view", [
* A single dynamic byte-shift operand must be specified which represents a
a shift of the base 1-D memref pointer from which to create the resulting
contiguous memref view with identity layout.
- * A dynamic size operand that must be specified for each dynamic dimension
- in the resulting view memref type.
+ * A size operand for each dimension in the resulting view memref type.
+ Sizes can be either static (specified as integer literals in the
+ `static_sizes` attribute) or dynamic (specified as SSA values in
+ `sizes`). The `static_sizes` attribute uses `ShapedType::kDynamic` as
+ sentinel for dynamic entries.
The "view" operation gives a structured indexing form to a flat 1-D buffer.
Unlike "subview" it can perform a type change. The type change behavior
@@ -2443,24 +2446,40 @@ def MemRef_ViewOp : MemRef_Op<"view", [
%0 = memref.alloc() : memref<2048xi8>
// ViewOp with dynamic offset and static sizes.
- %1 = memref.view %0[%offset_1024][] : memref<2048xi8> to memref<64x4xf32>
+ %1 = memref.view %0[%offset_1024][64, 4] : memref<2048xi8> to memref<64x4xf32>
- // ViewOp with dynamic offset and two dynamic size.
- %2 = memref.view %0[%offset_1024][%size0, %size1] :
+ // ViewOp with dynamic offset and mixed static/dynamic sizes.
+ %2 = memref.view %0[%offset_1024][%size0, 4, %size1] :
memref<2048xi8> to memref<?x4x?xf32>
```
}];
let arguments = (ins MemRefRankOf<[I8], [1]>:$source,
Index:$byte_shift,
- Variadic<Index>:$sizes);
+ Variadic<Index>:$sizes,
+ DenseI64ArrayAttr:$static_sizes);
let results = (outs AnyMemRef);
+ let builders = [
+ // Build a ViewOp with mixed static and dynamic entries.
+ OpBuilder<(ins "MemRefType":$resultType, "Value":$source,
+ "Value":$byte_shift, "ArrayRef<OpFoldResult>":$sizes,
+ CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
+ // Build a ViewOp with static entries.
+ OpBuilder<(ins "MemRefType":$resultType, "Value":$source,
+ "Value":$byte_shift, "ArrayRef<int64_t>":$sizes,
+ CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
+ // Build a ViewOp with dynamic entries.
+ OpBuilder<(ins "MemRefType":$resultType, "Value":$source,
+ "Value":$byte_shift, "ValueRange":$sizes,
+ CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>
+ ];
+
let extraClassDeclaration = [{
/// 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`.
+ /// 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
@@ -2476,8 +2495,9 @@ def MemRef_ViewOp : MemRef_Op<"view", [
}];
let assemblyFormat = [{
- $source `[` $byte_shift `]` `` `[` $sizes `]` attr-dict
- `:` type($source) `to` type(results)
+ $source `[` $byte_shift `]` ``
+ custom<DynamicIndexList>($sizes, $static_sizes)
+ attr-dict `:` type($source) `to` type(results)
}];
let hasCanonicalizer = 1;
diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
index 91a0c4b55fa84..1953556424d84 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
+++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
@@ -1863,10 +1863,11 @@ struct ViewOpLowering : public ConvertOpToLLVMPattern<memref::ViewOp> {
// Fields 4 and 5: Update sizes and strides.
Value stride = nullptr, nextSize = nullptr;
+ ArrayRef<int64_t> staticSizes = viewOp.getStaticSizes();
for (int i = viewMemRefType.getRank() - 1; i >= 0; --i) {
// Update size.
- Value size = getSize(rewriter, loc, viewMemRefType.getShape(),
- adaptor.getSizes(), i, indexType);
+ Value size = getSize(rewriter, loc, staticSizes, adaptor.getSizes(), i,
+ indexType);
targetMemRef.setSize(rewriter, loc, i, size);
// Update stride.
stride =
diff --git a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
index 844e6183cff06..62ee4ea72304a 100644
--- a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
+++ b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp
@@ -3741,6 +3741,34 @@ void ViewOp::getAsmResultNames(function_ref<void(Value, StringRef)> setNameFn) {
setNameFn(getResult(), "view");
}
+void ViewOp::build(OpBuilder &b, OperationState &result, MemRefType resultType,
+ Value source, Value byte_shift,
+ ArrayRef<OpFoldResult> sizes,
+ ArrayRef<NamedAttribute> attrs) {
+ SmallVector<int64_t> staticSizes;
+ SmallVector<Value> dynamicSizes;
+ dispatchIndexOpFoldResults(sizes, dynamicSizes, staticSizes);
+ result.addAttributes(attrs);
+ build(b, result, resultType, source, byte_shift, dynamicSizes,
+ b.getDenseI64ArrayAttr(staticSizes));
+}
+
+void ViewOp::build(OpBuilder &b, OperationState &result, MemRefType resultType,
+ Value source, Value byte_shift, ArrayRef<int64_t> sizes,
+ ArrayRef<NamedAttribute> attrs) {
+ SmallVector<OpFoldResult> sizeValues = llvm::map_to_vector<4>(
+ sizes, [&](int64_t v) -> OpFoldResult { return b.getI64IntegerAttr(v); });
+ build(b, result, resultType, source, byte_shift, sizeValues, attrs);
+}
+
+void ViewOp::build(OpBuilder &b, OperationState &result, MemRefType resultType,
+ Value source, Value byte_shift, ValueRange sizes,
+ ArrayRef<NamedAttribute> attrs) {
+ SmallVector<OpFoldResult> sizeValues =
+ llvm::map_to_vector<4>(sizes, [](Value v) -> OpFoldResult { return v; });
+ build(b, result, resultType, source, byte_shift, sizeValues, attrs);
+}
+
LogicalResult ViewOp::verify() {
auto baseType = llvm::cast<MemRefType>(getOperand(0).getType());
auto viewType = getType();
@@ -3759,9 +3787,31 @@ LogicalResult ViewOp::verify() {
"type ")
<< baseType << " and view memref type " << viewType;
- // Verify that we have the correct number of sizes for the result type.
- if (failed(verifyDynamicDimensionCount(getOperation(), viewType, getSizes())))
- return failure();
+ // Verify that static_sizes length matches the result type rank.
+ unsigned resultRank = viewType.getRank();
+ if (getStaticSizes().size() != resultRank)
+ return emitError("incorrect number of size values, has ")
+ << getStaticSizes().size() << ", expected " << resultRank;
+
+ // Verify that the number of dynamic sizes matches the number of dynamic
+ // entries in static_sizes.
+ unsigned numDynamicSizes = llvm::count_if(
+ getStaticSizes(), [](int64_t v) { return ShapedType::isDynamic(v); });
+ if (getSizes().size() != numDynamicSizes)
+ return emitError("incorrect number of dynamic sizes, has ")
+ << getSizes().size() << ", expected " << numDynamicSizes;
+
+ // Verify consistency between static_sizes and result type shape.
+ unsigned idx = 0;
+ for (auto [resultSize, expectedSize] :
+ llvm::zip_equal(viewType.getShape(), getStaticSizes())) {
+ if (!ShapedType::isDynamic(expectedSize) &&
+ !ShapedType::isDynamic(resultSize) && resultSize != expectedSize)
+ return emitError("expected result type with size = ")
+ << expectedSize << " instead of " << resultSize
+ << " in dim = " << idx;
+ ++idx;
+ }
return success();
}
@@ -3780,82 +3830,71 @@ OpFoldResult ViewOp::fold(FoldAdaptor adaptor) {
}
SmallVector<OpFoldResult> ViewOp::getMixedSizes() {
- SmallVector<OpFoldResult> result;
- unsigned ctr = 0;
Builder b(getContext());
- for (int64_t dim : getType().getShape()) {
- if (ShapedType::isDynamic(dim)) {
- result.push_back(getSizes()[ctr++]);
- } else {
- result.push_back(b.getIndexAttr(dim));
- }
- }
- return result;
+ return getMixedValues(getStaticSizes(), getSizes(), b);
}
namespace {
-/// Given a memref type and a range of values that defines its dynamic
-/// dimension sizes, turn all dynamic sizes that have a constant value into
-/// static dimension sizes.
+/// Given a memref type and its associated static_sizes attribute and the
+/// dynamic size operands, turn all dynamic sizes that have a constant value
+/// into static sizes. Returns a new MemRefType with the folded shape and
+/// populates `foldedSizes` with the surviving mixed static/dynamic sizes.
static MemRefType
-foldDynamicToStaticDimSizes(MemRefType type, ValueRange dynamicSizes,
- SmallVectorImpl<Value> &foldedDynamicSizes) {
- SmallVector<int64_t> staticShape(type.getShape());
+foldDynamicToStaticDimSizes(MemRefType type, ArrayRef<int64_t> staticSizes,
+ ValueRange dynamicSizes,
+ SmallVectorImpl<OpFoldResult> &foldedSizes) {
+ SmallVector<int64_t> newShape(staticSizes);
assert(type.getNumDynamicDims() == dynamicSizes.size() &&
"incorrect number of dynamic sizes");
+ Builder builder(type.getContext());
- // Compute new static and dynamic sizes.
- unsigned ctr = 0;
- for (auto [dim, dimSize] : llvm::enumerate(type.getShape())) {
- if (ShapedType::isStatic(dimSize))
+ unsigned dynamicIdx = 0;
+ for (auto [dim, dimSize] : llvm::enumerate(staticSizes)) {
+ if (ShapedType::isStatic(dimSize)) {
+ foldedSizes.push_back(builder.getI64IntegerAttr(dimSize));
+ continue;
+ }
+ assert(ShapedType::isDynamic(dimSize) && "expected dynamic size");
+ Value dynVal = dynamicSizes[dynamicIdx++];
+ std::optional<int64_t> cst = getConstantIntValue(dynVal);
+ if (!cst.has_value() || cst.value() < 0) {
+ foldedSizes.push_back(dynVal);
continue;
-
- Value dynamicSize = dynamicSizes[ctr++];
- if (auto cst = getConstantIntValue(dynamicSize)) {
- // Dynamic size must be non-negative.
- if (cst.value() < 0) {
- foldedDynamicSizes.push_back(dynamicSize);
- continue;
- }
- staticShape[dim] = cst.value();
- } else {
- foldedDynamicSizes.push_back(dynamicSize);
}
+ newShape[dim] = cst.value();
+ foldedSizes.push_back(builder.getI64IntegerAttr(cst.value()));
}
- return MemRefType::Builder(type).setShape(staticShape);
+ return MemRefType::Builder(type).setShape(newShape);
}
-/// Change the result type of a `memref.view` by making originally dynamic
-/// dimensions static when their sizes come from `constant` ops.
+/// Fold dynamic sizes into static_sizes when they are constants.
/// Example:
/// ```
/// %c5 = arith.constant 5: index
-/// %0 = memref.view %src[%offset][%c5] : memref<?xi8> to memref<?x4xf32>
+/// %0 = memref.view %src[%offset][%c5, 4] : memref<?xi8> to memref<?x4xf32>
/// ```
/// to
/// ```
-/// %0 = memref.view %src[%offset][] : memref<?xi8> to memref<5x4xf32>
+/// %0 = memref.view %src[%offset][5, 4] : memref<?xi8> to memref<5x4xf32>
/// ```
struct ViewOpShapeFolder : public OpRewritePattern<ViewOp> {
using Base::Base;
LogicalResult matchAndRewrite(ViewOp viewOp,
PatternRewriter &rewriter) const override {
- SmallVector<Value> foldedDynamicSizes;
+ SmallVector<OpFoldResult> foldedSizes;
MemRefType resultType = viewOp.getType();
MemRefType foldedMemRefType = foldDynamicToStaticDimSizes(
- resultType, viewOp.getSizes(), foldedDynamicSizes);
+ resultType, viewOp.getStaticSizes(), viewOp.getSizes(), foldedSizes);
// Stop here if no dynamic size was promoted to static.
if (foldedMemRefType == resultType)
return failure();
- // Create new ViewOp.
auto newViewOp = ViewOp::create(rewriter, viewOp.getLoc(), foldedMemRefType,
viewOp.getSource(), viewOp.getByteShift(),
- foldedDynamicSizes);
- // Insert a cast so we have the same type as the old memref type.
+ foldedSizes);
rewriter.replaceOpWithNewOp<CastOp>(viewOp, resultType, newViewOp);
return success();
}
@@ -3873,7 +3912,7 @@ struct ViewOpMemrefCastFolder : public OpRewritePattern<ViewOp> {
rewriter.replaceOpWithNewOp<ViewOp>(
viewOp, viewOp.getType(), memrefCastOp.getSource(),
- viewOp.getByteShift(), viewOp.getSizes());
+ viewOp.getByteShift(), viewOp.getMixedSizes());
return success();
}
};
diff --git a/mlir/test/Analysis/test-alias-analysis.mlir b/mlir/test/Analysis/test-alias-analysis.mlir
index d71adee05c7a3..cba9abc20c652 100644
--- a/mlir/test/Analysis/test-alias-analysis.mlir
+++ b/mlir/test/Analysis/test-alias-analysis.mlir
@@ -228,7 +228,7 @@ func.func @view_like(%arg: memref<2xf32>, %size: index) attributes {test.ptr = "
%c0 = arith.constant 0 : index
%2 = memref.alloca (%size) {test.ptr = "alloca_1"} : memref<?xi8>
- %3 = memref.view %2[%c0][] {test.ptr = "view"} : memref<?xi8> to memref<8x64xf32>
+ %3 = memref.view %2[%c0][8, 64] {test.ptr = "view"} : memref<?xi8> to memref<8x64xf32>
return
}
diff --git a/mlir/test/Conversion/GPUCommon/lower-memory-space-attrs.mlir b/mlir/test/Conversion/GPUCommon/lower-memory-space-attrs.mlir
index 771f3185904bb..9d2c31c48ffa8 100644
--- a/mlir/test/Conversion/GPUCommon/lower-memory-space-attrs.mlir
+++ b/mlir/test/Conversion/GPUCommon/lower-memory-space-attrs.mlir
@@ -53,7 +53,7 @@ gpu.module @kernel {
gpu.func @dynamic_shmem_with_vector(%arg1: memref<1xf32>) {
%0 = arith.constant 0 : index
%1 = gpu.dynamic_shared_memory : memref<?xi8, #gpu.address_space<workgroup>>
- %2 = memref.view %1[%0][] : memref<?xi8, #gpu.address_space<workgroup>> to memref<1xf32, #gpu.address_space<workgroup>>
+ %2 = memref.view %1[%0][1] : memref<?xi8, #gpu.address_space<workgroup>> to memref<1xf32, #gpu.address_space<workgroup>>
%3 = vector.load %2[%0] : memref<1xf32, #gpu.address_space<workgroup>>, vector<1xf32>
vector.store %3, %arg1[%0] : memref<1xf32>, vector<1xf32>
gpu.return
@@ -73,7 +73,7 @@ gpu.module @kernel {
gpu.func @dynamic_shmem(%arg0: f32) {
%0 = arith.constant 0 : index
%1 = gpu.dynamic_shared_memory : memref<?xi8, #gpu.address_space<workgroup>>
- %2 = memref.view %1[%0][] : memref<?xi8, #gpu.address_space<workgroup>> to memref<4xf32, #gpu.address_space<workgroup>>
+ %2 = memref.view %1[%0][4] : memref<?xi8, #gpu.address_space<workgroup>> to memref<4xf32, #gpu.address_space<workgroup>>
memref.store %arg0, %2[%0] : memref<4xf32, #gpu.address_space<workgroup>>
gpu.return
}
diff --git a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
index 0cbe064572911..dedbd3ee15576 100644
--- a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
+++ b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
@@ -51,7 +51,7 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[3, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
// CHECK: llvm.mul %{{.*}}, %[[ARG1]]
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
- %3 = memref.view %0[%arg2][%arg1] : memref<2048xi8> to memref<4x?xf32>
+ %3 = memref.view %0[%arg2][4, %arg1] : memref<2048xi8> to memref<4x?xf32>
// Test static sizes.
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
@@ -68,7 +68,7 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[3, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
// CHECK: llvm.mlir.constant(4 : index) : i64
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
- %5 = memref.view %0[%arg2][] : memref<2048xi8> to memref<64x4xf32>
+ %5 = memref.view %0[%arg2][64, 4] : memref<2048xi8> to memref<64x4xf32>
// Test view memory space.
// CHECK: llvm.mlir.constant(2048 : index) : i64
@@ -89,7 +89,7 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[3, 0] : !llvm.struct<(ptr<4>, ptr<4>, i64, array<2 x i64>, array<2 x i64>)>
// CHECK: llvm.mlir.constant(4 : index) : i64
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[4, 0] : !llvm.struct<(ptr<4>, ptr<4>, i64, array<2 x i64>, array<2 x i64>)>
- %7 = memref.view %6[%arg2][] : memref<2048xi8, 4> to memref<64x4xf32, 4>
+ %7 = memref.view %6[%arg2][64, 4] : memref<2048xi8, 4> to memref<64x4xf32, 4>
return
}
@@ -128,7 +128,7 @@ func.func @view_empty_memref(%offset: index, %mem: memref<0xi8>) {
// CHECK-INTERFACE: llvm.insertvalue %{{.*}}, %{{.*}}[3, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
// CHECK-INTERFACE: llvm.mlir.constant(4 : index) : i64
// CHECK-INTERFACE: = llvm.insertvalue %{{.*}}, %{{.*}}[4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
- %0 = memref.view %mem[%offset][] : memref<0xi8> to memref<0x4xf32>
+ %0 = memref.view %mem[%offset][0, 4] : memref<0xi8> to memref<0x4xf32>
return
}
diff --git a/mlir/test/Conversion/XeGPUToXeVM/loadstore_matrix.mlir b/mlir/test/Conversion/XeGPUToXeVM/loadstore_matrix.mlir
index fa683175693be..ec1e67f653951 100644
--- a/mlir/test/Conversion/XeGPUToXeVM/loadstore_matrix.mlir
+++ b/mlir/test/Conversion/XeGPUToXeVM/loadstore_matrix.mlir
@@ -37,7 +37,7 @@ gpu.module @test_kernel [#xevm.target<chip = "pvc">] {
//CHECK-LABEL: load_store_matrix_plain_2d_input
gpu.func @load_store_matrix_plain_2d_input(%arg0: memref<1024xi8, 3>) -> f32 {
%c0 = arith.constant 0 : index
- %view = memref.view %arg0[%c0][]: memref<1024xi8, 3> to memref<64x32xf32, 3>
+ %view = memref.view %arg0[%c0][64, 32] : memref<1024xi8, 3> to memref<64x32xf32, 3>
%subview = memref.subview %view[32, 0] [32, 32] [1, 1] : memref<64x32xf32, 3> to memref<32x32xf32, strided<[32, 1], offset: 1024>, 3>
diff --git a/mlir/test/Dialect/Func/func-transform-invalid.mlir b/mlir/test/Dialect/Func/func-transform-invalid.mlir
index 29bd58ab52742..b58cb7a3255f4 100644
--- a/mlir/test/Dialect/Func/func-transform-invalid.mlir
+++ b/mlir/test/Dialect/Func/func-transform-invalid.mlir
@@ -3,9 +3,9 @@
module {
func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {
%c0 = arith.constant 0 : index
- %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>
- %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>
- %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>
+ %view = memref.view %arg0[%c0][1] : memref<1xi8, 1> to memref<1xi8, 1>
+ %view0 = memref.view %arg1[%c0][2] : memref<2xi8, 1> to memref<2xi8, 1>
+ %view1 = memref.view %arg2[%c0][3] : memref<3xi8, 1> to memref<3xi8, 1>
return
}
}
@@ -25,9 +25,9 @@ module attributes {transform.with_named_sequence} {
module {
func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {
%c0 = arith.constant 0 : index
- %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>
- %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>
- %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>
+ %view = memref.view %arg0[%c0][1] : memref<1xi8, 1> to memref<1xi8, 1>
+ %view0 = memref.view %arg1[%c0][2] : memref<2xi8, 1> to memref<2xi8, 1>
+ %view1 = memref.view %arg2[%c0][3] : memref<3xi8, 1> to memref<3xi8, 1>
return
}
}
@@ -47,9 +47,9 @@ module attributes {transform.with_named_sequence} {
module {
func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/183795
More information about the Mlir-commits
mailing list