[Mlir-commits] [mlir] [mlir][xegpu] Add support for 1D SLM case in vector-to-xepgu (PR #208276)
Charitha Saumya
llvmlistbot at llvm.org
Wed Jul 8 10:49:53 PDT 2026
https://github.com/charithaintc created https://github.com/llvm/llvm-project/pull/208276
Currently vector-to-xegpu only support 2D SLM buffers. However load/store_matrix op definition allows 1D access.
Assisted by: Claude
>From ea777cd2577eb4be81ea0358db31474bce64afa6 Mon Sep 17 00:00:00 2001
From: Charitha Saumya <charitha.saumya.gusthinna.waduge at intel.com>
Date: Wed, 8 Jul 2026 17:48:00 +0000
Subject: [PATCH] add 1D SLM support in vector to xegpu
---
.../VectorToXeGPU/VectorToXeGPU.cpp | 12 ++---
.../VectorToXeGPU/transfer-read-to-xegpu.mlir | 44 +++++++++++--------
.../transfer-write-to-xegpu.mlir | 20 ++++++---
3 files changed, 46 insertions(+), 30 deletions(-)
diff --git a/mlir/lib/Conversion/VectorToXeGPU/VectorToXeGPU.cpp b/mlir/lib/Conversion/VectorToXeGPU/VectorToXeGPU.cpp
index 8dcc9771d8db4..ee9327caab002 100644
--- a/mlir/lib/Conversion/VectorToXeGPU/VectorToXeGPU.cpp
+++ b/mlir/lib/Conversion/VectorToXeGPU/VectorToXeGPU.cpp
@@ -560,10 +560,10 @@ struct TransferReadLowering : public OpRewritePattern<vector::TransferReadOp> {
bool isSharedMemory = xegpu::XeGPUDialect::isSharedMemory(readMemTy);
// Handle the SLM case.
if (isSharedMemory) {
- // If the memref is SLM only support 2D case for now.
- if (loadedVecTy.getRank() != 2)
+ // load_matrix supports 1D and 2D loads from SLM.
+ if (loadedVecTy.getRank() != 1 && loadedVecTy.getRank() != 2)
return rewriter.notifyMatchFailure(
- readOp, "Only 2D vector loads are supported for SLM");
+ readOp, "Only 1D and 2D vector loads are supported for SLM");
AffineMap readMap = readOp.getPermutationMap();
if (!readMap.isMinorIdentity())
return rewriter.notifyMatchFailure(
@@ -700,10 +700,10 @@ struct TransferWriteLowering
// For shared local memory (address space 3), use create_mem_desc +
// store_matrix
if (isSharedMemory) {
- // Only support 2D case for now.
- if (vecTy.getRank() != 2)
+ // store_matrix supports 1D and 2D stores to SLM.
+ if (vecTy.getRank() != 1 && vecTy.getRank() != 2)
return rewriter.notifyMatchFailure(
- writeOp, "Only 2D vector stores are supported for SLM");
+ writeOp, "Only 1D and 2D vector stores are supported for SLM");
// Create mem_desc for SLM
auto memDescType =
xegpu::MemDescType::get(rewriter.getContext(), writeMemTy.getShape(),
diff --git a/mlir/test/Conversion/VectorToXeGPU/transfer-read-to-xegpu.mlir b/mlir/test/Conversion/VectorToXeGPU/transfer-read-to-xegpu.mlir
index f64bcc27940ea..c6793a2e5ca26 100644
--- a/mlir/test/Conversion/VectorToXeGPU/transfer-read-to-xegpu.mlir
+++ b/mlir/test/Conversion/VectorToXeGPU/transfer-read-to-xegpu.mlir
@@ -598,7 +598,7 @@ gpu.func @load_2D_vector_addrspace3(%source: memref<16x32xf32, 3>,
// -----
gpu.module @xevm_module {
-gpu.func @load_1D_vector_addrspace3_unsupported(%source: memref<32xf32, 3>,
+gpu.func @load_1D_vector_addrspace3(%source: memref<32xf32, 3>,
%offset: index) -> vector<8xf32> {
%c0 = arith.constant 0.0 : f32
%0 = vector.transfer_read %source[%offset], %c0
@@ -606,11 +606,19 @@ gpu.func @load_1D_vector_addrspace3_unsupported(%source: memref<32xf32, 3>,
gpu.return %0 : vector<8xf32>
}
-// LOAD-ND-LABEL: @load_1D_vector_addrspace3_unsupported
-// LOAD-ND: vector.transfer_read
+// LOAD-ND-LABEL: @load_1D_vector_addrspace3
+// LOAD-ND-SAME: %[[SOURCE:.+]]: memref<32xf32, 3>
+// LOAD-ND-SAME: %[[OFFSET:.+]]: index
+// LOAD-ND: %[[MEM_DESC:.+]] = xegpu.create_mem_desc %[[SOURCE]] : memref<32xf32, 3> -> !xegpu.mem_desc<32xf32>
+// LOAD-ND: %[[DATA:.+]] = xegpu.load_matrix %[[MEM_DESC]][%[[OFFSET]]] : !xegpu.mem_desc<32xf32>, index -> vector<8xf32>
+// LOAD-ND: gpu.return %[[DATA]] : vector<8xf32>
-// LOAD-GATHER-LABEL: @load_1D_vector_addrspace3_unsupported
-// LOAD-GATHER: vector.transfer_read
+// LOAD-GATHER-LABEL: @load_1D_vector_addrspace3
+// LOAD-GATHER-SAME: %[[SOURCE:.+]]: memref<32xf32, 3>
+// LOAD-GATHER-SAME: %[[OFFSET:.+]]: index
+// LOAD-GATHER: %[[MEM_DESC:.+]] = xegpu.create_mem_desc %[[SOURCE]] : memref<32xf32, 3> -> !xegpu.mem_desc<32xf32>
+// LOAD-GATHER: %[[DATA:.+]] = xegpu.load_matrix %[[MEM_DESC]][%[[OFFSET]]] : !xegpu.mem_desc<32xf32>, index -> vector<8xf32>
+// LOAD-GATHER: gpu.return %[[DATA]] : vector<8xf32>
}
@@ -642,10 +650,10 @@ gpu.func @load_2D_vector_alloca_promoted_to_slm(%offset: index)
// -----
// memref.alloca is unconditionally promoted to SLM (address space 3). A 1D
-// transfer_read on it cannot be lowered to xegpu.load_matrix (which requires
-// rank 2), so the transfer_read is left as-is on the SLM memref.
+// transfer_read on it is lowered to xegpu.load_matrix, which supports the
+// 1D SLM case.
gpu.module @xevm_module {
-gpu.func @load_1D_vector_alloca_promoted_unsupported(%offset: index)
+gpu.func @load_1D_vector_alloca_promoted_to_slm(%offset: index)
-> vector<8xf32> {
%buf = memref.alloca() : memref<16xf32>
%c0 = arith.constant 0.0 : f32
@@ -654,17 +662,15 @@ gpu.func @load_1D_vector_alloca_promoted_unsupported(%offset: index)
gpu.return %0 : vector<8xf32>
}
-// LOAD-ND-LABEL: @load_1D_vector_alloca_promoted_unsupported
-// LOAD-ND: memref.alloca() : memref<16xf32, 3>
-// LOAD-ND: vector.transfer_read
-// LOAD-ND-NOT: xegpu.create_mem_desc
-// LOAD-ND-NOT: xegpu.load_matrix
+// LOAD-ND-LABEL: @load_1D_vector_alloca_promoted_to_slm
+// LOAD-ND: %[[BUF:.+]] = memref.alloca() : memref<16xf32, 3>
+// LOAD-ND: %[[MEM_DESC:.+]] = xegpu.create_mem_desc %[[BUF]] : memref<16xf32, 3> -> !xegpu.mem_desc<16xf32>
+// LOAD-ND: xegpu.load_matrix %[[MEM_DESC]]
-// LOAD-GATHER-LABEL: @load_1D_vector_alloca_promoted_unsupported
-// LOAD-GATHER: memref.alloca() : memref<16xf32, 3>
-// LOAD-GATHER: vector.transfer_read
-// LOAD-GATHER-NOT: xegpu.create_mem_desc
-// LOAD-GATHER-NOT: xegpu.load_matrix
+// LOAD-GATHER-LABEL: @load_1D_vector_alloca_promoted_to_slm
+// LOAD-GATHER: %[[BUF:.+]] = memref.alloca() : memref<16xf32, 3>
+// LOAD-GATHER: %[[MEM_DESC:.+]] = xegpu.create_mem_desc %[[BUF]] : memref<16xf32, 3> -> !xegpu.mem_desc<16xf32>
+// LOAD-GATHER: xegpu.load_matrix %[[MEM_DESC]]
}
@@ -679,4 +685,4 @@ gpu.func @load_0D_memref_unsupported(%source: memref<f16>) -> vector<f16> {
// CHECK-LABEL: @load_0D_memref_unsupported
// CHECK: vector.transfer_read
-}
\ No newline at end of file
+}
diff --git a/mlir/test/Conversion/VectorToXeGPU/transfer-write-to-xegpu.mlir b/mlir/test/Conversion/VectorToXeGPU/transfer-write-to-xegpu.mlir
index a7cd3d7652d85..27a83922fab37 100644
--- a/mlir/test/Conversion/VectorToXeGPU/transfer-write-to-xegpu.mlir
+++ b/mlir/test/Conversion/VectorToXeGPU/transfer-write-to-xegpu.mlir
@@ -397,7 +397,7 @@ gpu.func @store_2D_vector_addrspace3(%vec: vector<8x16xf32>,
// -----
gpu.module @xevm_module {
-gpu.func @store_1D_vector_addrspace3_unsupported(%vec: vector<8xf32>,
+gpu.func @store_1D_vector_addrspace3(%vec: vector<8xf32>,
%source: memref<32xf32, 3>, %offset: index) {
vector.transfer_write %vec, %source[%offset]
{in_bounds = [true]}
@@ -405,10 +405,20 @@ gpu.func @store_1D_vector_addrspace3_unsupported(%vec: vector<8xf32>,
gpu.return
}
-// STORE-ND-LABEL: @store_1D_vector_addrspace3_unsupported
-// STORE-ND: vector.transfer_write
+// STORE-ND-LABEL: @store_1D_vector_addrspace3
+// STORE-ND-SAME: %[[VEC:.+]]: vector<8xf32>
+// STORE-ND-SAME: %[[SOURCE:.+]]: memref<32xf32, 3>
+// STORE-ND-SAME: %[[OFFSET:.+]]: index
+// STORE-ND: %[[MEM_DESC:.+]] = xegpu.create_mem_desc %[[SOURCE]] : memref<32xf32, 3> -> !xegpu.mem_desc<32xf32>
+// STORE-ND: xegpu.store_matrix %[[VEC]], %[[MEM_DESC]][%[[OFFSET]]] : vector<8xf32>, !xegpu.mem_desc<32xf32>, index
+// STORE-ND: gpu.return
-// STORE-SCATTER-LABEL: @store_1D_vector_addrspace3_unsupported
-// STORE-SCATTER: vector.transfer_write
+// STORE-SCATTER-LABEL: @store_1D_vector_addrspace3
+// STORE-SCATTER-SAME: %[[VEC:.+]]: vector<8xf32>
+// STORE-SCATTER-SAME: %[[SOURCE:.+]]: memref<32xf32, 3>
+// STORE-SCATTER-SAME: %[[OFFSET:.+]]: index
+// STORE-SCATTER: %[[MEM_DESC:.+]] = xegpu.create_mem_desc %[[SOURCE]] : memref<32xf32, 3> -> !xegpu.mem_desc<32xf32>
+// STORE-SCATTER: xegpu.store_matrix %[[VEC]], %[[MEM_DESC]][%[[OFFSET]]] : vector<8xf32>, !xegpu.mem_desc<32xf32>, index
+// STORE-SCATTER: gpu.return
}
More information about the Mlir-commits
mailing list