[Mlir-commits] [mlir] [MLIR][XeGPU] Update WG integration tests to strict property syntax (PR #222457)
Sang Ik Lee
llvmlistbot at llvm.org
Wed Sep 9 14:57:28 PDT 2026
https://github.com/silee2 created https://github.com/llvm/llvm-project/pull/222457
XeGPU enabled strict properties in its assembly format (b73a8b8d8c17), so inherent attributes such as the `layout`/`layout_*` operands of load_nd, store_nd, prefetch_nd, dpas and dpas_mx must be spelled in a prop-dict (`<{...}>`) instead of the discardable attr-dict (`{...}`). Several workgroup level integration tests were missed by that update and now fail to parse.
>From 5c0308ae37304ef1ae9d734e4429c9e890419679 Mon Sep 17 00:00:00 2001
From: "Lee, Sang Ik" <sang.ik.lee at intel.com>
Date: Wed, 9 Sep 2026 21:55:36 +0000
Subject: [PATCH] [MLIR][XeGPU] Update WG integration tests to strict property
syntax
XeGPU enabled strict properties in its assembly format (b73a8b8d8c17), so
inherent attributes such as the `layout`/`layout_*` operands of load_nd,
store_nd, prefetch_nd, dpas and dpas_mx must be spelled in a prop-dict
(`<{...}>`) instead of the discardable attr-dict (`{...}`). Several workgroup
level integration tests were missed by that update and now fail to parse.
Spell the properties with angle brackets, matching WG/simple_gemm.mlir.
---
.../Dialect/XeGPU/WG/simple_3d_gemm.mlir | 26 +++++++++----------
.../Dialect/XeGPU/WG/simple_3d_mxfp_gemm.mlir | 16 ++++++------
.../Dialect/XeGPU/WG/simple_mxfp_gemm.mlir | 16 ++++++------
.../WG/simple_mxfp_gemm_quantizeA_F4.mlir | 14 +++++-----
4 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_gemm.mlir b/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_gemm.mlir
index e82f586c57527..d608dca43fc50 100644
--- a/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_gemm.mlir
+++ b/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_gemm.mlir
@@ -22,34 +22,34 @@ gpu.module @test_kernel {
%m = arith.muli %block_id_x, %c64 : index
%n = arith.muli %block_id_y, %c64 : index
%c_tdesc = xegpu.create_nd_tdesc %C : memref<4x64x64xf32> -> !xegpu.tensor_desc<4x64x64xf32, #c>
- %c_init_value = xegpu.load_nd %c_tdesc[%block_id_z, %m, %n] {layout = #c} : !xegpu.tensor_desc<4x64x64xf32, #c> -> vector<4x64x64xf32>
+ %c_init_value = xegpu.load_nd %c_tdesc[%block_id_z, %m, %n] <{layout = #c}> : !xegpu.tensor_desc<4x64x64xf32, #c> -> vector<4x64x64xf32>
%a_tdesc = xegpu.create_nd_tdesc %A : memref<4x64x256xf16> -> !xegpu.tensor_desc<4x64x32xf16, #a>
%b_tdesc = xegpu.create_nd_tdesc %B : memref<4x256x64xf16> -> !xegpu.tensor_desc<4x32x64xf16, #b>
// Prefetch A 3 times.
%a_prefetch_tdesc = xegpu.create_nd_tdesc %A : memref<4x64x256xf16> -> !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
- xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %c0] {layout = #a_prefetch} : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
- xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %c32] {layout = #a_prefetch} : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
- xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %c64] {layout = #a_prefetch} : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
+ xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %c0] <{layout = #a_prefetch}> : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
+ xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %c32] <{layout = #a_prefetch}> : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
+ xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %c64] <{layout = #a_prefetch}> : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
// Prefetch B 3 times.
%b_prefetch_tdesc = xegpu.create_nd_tdesc %B : memref<4x256x64xf16> -> !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
- xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %c0, %n] {layout = #b_prefetch} : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
- xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %c32, %n] {layout = #b_prefetch} : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
- xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %c64, %n] {layout = #b_prefetch} : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
+ xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %c0, %n] <{layout = #b_prefetch}> : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
+ xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %c32, %n] <{layout = #b_prefetch}> : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
+ xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %c64, %n] <{layout = #b_prefetch}> : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
%out = scf.for %k = %c0 to %c256 step %c32
iter_args(%c_value = %c_init_value)
-> (vector<4x64x64xf32>) {
- %a_value = xegpu.load_nd %a_tdesc[%block_id_z, %m, %k] {layout = #a} : !xegpu.tensor_desc<4x64x32xf16, #a> -> vector<4x64x32xf16>
- %b_value = xegpu.load_nd %b_tdesc[%block_id_z, %k, %n] {layout = #b} : !xegpu.tensor_desc<4x32x64xf16, #b> -> vector<4x32x64xf16>
+ %a_value = xegpu.load_nd %a_tdesc[%block_id_z, %m, %k] <{layout = #a}> : !xegpu.tensor_desc<4x64x32xf16, #a> -> vector<4x64x32xf16>
+ %b_value = xegpu.load_nd %b_tdesc[%block_id_z, %k, %n] <{layout = #b}> : !xegpu.tensor_desc<4x32x64xf16, #b> -> vector<4x32x64xf16>
// Prefetch next tiles.
%prefetch_offset = arith.addi %k, %c96 : index
- xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %prefetch_offset] {layout = #a_prefetch} : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
- xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %prefetch_offset, %n] {layout = #b_prefetch} : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
- %c_new_value = xegpu.dpas %a_value, %b_value, %c_value {layout_a = #a, layout_b = #b, layout_cd = #c}
+ xegpu.prefetch_nd %a_prefetch_tdesc[%block_id_z, %m, %prefetch_offset] <{layout = #a_prefetch}> : !xegpu.tensor_desc<4x64x32xf16, #a_prefetch>
+ xegpu.prefetch_nd %b_prefetch_tdesc[%block_id_z, %prefetch_offset, %n] <{layout = #b_prefetch}> : !xegpu.tensor_desc<4x32x64xf16, #b_prefetch>
+ %c_new_value = xegpu.dpas %a_value, %b_value, %c_value <{layout_a = #a, layout_b = #b, layout_cd = #c}>
: vector<4x64x32xf16>, vector<4x32x64xf16>, vector<4x64x64xf32> -> vector<4x64x64xf32>
scf.yield %c_new_value : vector<4x64x64xf32>
}
- xegpu.store_nd %out, %c_tdesc[%block_id_z, %m, %n] {layout = #c} : vector<4x64x64xf32>, !xegpu.tensor_desc<4x64x64xf32, #c>
+ xegpu.store_nd %out, %c_tdesc[%block_id_z, %m, %n] <{layout = #c}> : vector<4x64x64xf32>, !xegpu.tensor_desc<4x64x64xf32, #c>
gpu.return
}
}
diff --git a/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_mxfp_gemm.mlir b/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_mxfp_gemm.mlir
index f8bcaeac67d08..8c69b6b63348e 100644
--- a/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_mxfp_gemm.mlir
+++ b/mlir/test/Integration/Dialect/XeGPU/WG/simple_3d_mxfp_gemm.mlir
@@ -32,32 +32,32 @@ gpu.module @test {
%n = arith.muli %block_id_y, %c128 : index
%a_tdesc = xegpu.create_nd_tdesc %arg0 : memref<4x128x512xf4E2M1FN> -> !xegpu.tensor_desc<4x128x512xf4E2M1FN>
- %a = xegpu.load_nd %a_tdesc[%block_id_z, %m, %c0] {layout = #a} : !xegpu.tensor_desc<4x128x512xf4E2M1FN> -> vector<4x128x512xf4E2M1FN>
+ %a = xegpu.load_nd %a_tdesc[%block_id_z, %m, %c0] <{layout = #a}> : !xegpu.tensor_desc<4x128x512xf4E2M1FN> -> vector<4x128x512xf4E2M1FN>
%b_tdesc = xegpu.create_nd_tdesc %arg1 : memref<4x512x128xf4E2M1FN> -> !xegpu.tensor_desc<4x512x128xf4E2M1FN>
- %b = xegpu.load_nd %b_tdesc[%block_id_z, %c0, %n] {layout = #b} : !xegpu.tensor_desc<4x512x128xf4E2M1FN> -> vector<4x512x128xf4E2M1FN>
+ %b = xegpu.load_nd %b_tdesc[%block_id_z, %c0, %n] <{layout = #b}> : !xegpu.tensor_desc<4x512x128xf4E2M1FN> -> vector<4x512x128xf4E2M1FN>
%cd_tdesc = xegpu.create_nd_tdesc %arg4 : memref<4x128x128xf32> -> !xegpu.tensor_desc<4x128x128xf32, #c>
- %c = xegpu.load_nd %cd_tdesc[%block_id_z, %m, %n] {layout = #c} : !xegpu.tensor_desc<4x128x128xf32, #c> -> vector<4x128x128xf32>
+ %c = xegpu.load_nd %cd_tdesc[%block_id_z, %m, %n] <{layout = #c}> : !xegpu.tensor_desc<4x128x128xf32, #c> -> vector<4x128x128xf32>
%a_scale_tdesc = xegpu.create_nd_tdesc %arg2 : memref<4x128x16xf8E8M0FNU> -> !xegpu.tensor_desc<4x128x16xf8E8M0FNU>
- %scale_a = xegpu.load_nd %a_scale_tdesc[%block_id_z, %m, %c0] {layout = #a_scale_load} : !xegpu.tensor_desc<4x128x16xf8E8M0FNU> -> vector<4x128x16xf8E8M0FNU>
+ %scale_a = xegpu.load_nd %a_scale_tdesc[%block_id_z, %m, %c0] <{layout = #a_scale_load}> : !xegpu.tensor_desc<4x128x16xf8E8M0FNU> -> vector<4x128x16xf8E8M0FNU>
%b_scale_tdesc = xegpu.create_nd_tdesc %arg3 : memref<4x16x128xf8E8M0FNU> -> !xegpu.tensor_desc<4x16x128xf8E8M0FNU>
- %scale_b = xegpu.load_nd %b_scale_tdesc[%block_id_z, %c0, %n] {layout = #b_scale_load} : !xegpu.tensor_desc<4x16x128xf8E8M0FNU> -> vector<4x16x128xf8E8M0FNU>
+ %scale_b = xegpu.load_nd %b_scale_tdesc[%block_id_z, %c0, %n] <{layout = #b_scale_load}> : !xegpu.tensor_desc<4x16x128xf8E8M0FNU> -> vector<4x16x128xf8E8M0FNU>
%d = xegpu.dpas_mx %a, %b, %c scale_a = %scale_a scale_b = %scale_b
- {layout_a = #a,
+ <{layout_a = #a,
layout_b = #b,
layout_cd = #c,
layout_a_scale = #a_scale,
- layout_b_scale = #b_scale}
+ layout_b_scale = #b_scale}>
: (vector<4x128x512xf4E2M1FN>, vector<4x512x128xf4E2M1FN>,
vector<4x128x128xf32>,
vector<4x128x16xf8E8M0FNU>, vector<4x16x128xf8E8M0FNU>)
-> vector<4x128x128xf32>
- xegpu.store_nd %d, %cd_tdesc[%block_id_z, %m, %n] {layout = #c} : vector<4x128x128xf32>, !xegpu.tensor_desc<4x128x128xf32, #c>
+ xegpu.store_nd %d, %cd_tdesc[%block_id_z, %m, %n] <{layout = #c}> : vector<4x128x128xf32>, !xegpu.tensor_desc<4x128x128xf32, #c>
gpu.return
}
}
diff --git a/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm.mlir b/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm.mlir
index 3393b723d6721..38779844e9bd3 100644
--- a/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm.mlir
+++ b/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm.mlir
@@ -43,13 +43,13 @@ module @gemm attributes {gpu.container_module} {
// Load initial C
%cd_tdesc = xegpu.create_nd_tdesc %arg4 : memref<256x256xf32> -> !xegpu.tensor_desc<32x32xf32, #c>
- %c_init = xegpu.load_nd %cd_tdesc[%m, %n] {layout = #c}: !xegpu.tensor_desc<32x32xf32, #c> -> vector<32x32xf32>
+ %c_init = xegpu.load_nd %cd_tdesc[%m, %n] <{layout = #c}>: !xegpu.tensor_desc<32x32xf32, #c> -> vector<32x32xf32>
%res:3 = scf.for %k = %c0 to %kbound step %kstep
iter_args(%c_partial = %c_init, %kb = %c0, %kscale = %c0) -> (vector<32x32xf32>, index, index) {
// load_nd with offset
- %a = xegpu.load_nd %a_tdesc[%m, %k] {layout = #a}: !xegpu.tensor_desc<32x1024xf4E2M1FN> -> vector<32x1024xf4E2M1FN>
- %bp = xegpu.load_nd %bp_tdesc[%kb, %n] {layout = #b_packed}: !xegpu.tensor_desc<512x32xi8> -> vector<512x32xi8>
+ %a = xegpu.load_nd %a_tdesc[%m, %k] <{layout = #a}>: !xegpu.tensor_desc<32x1024xf4E2M1FN> -> vector<32x1024xf4E2M1FN>
+ %bp = xegpu.load_nd %bp_tdesc[%kb, %n] <{layout = #b_packed}>: !xegpu.tensor_desc<512x32xi8> -> vector<512x32xi8>
// Bitcast to fp4: 512x32 uint8 -> 512x64 fp4 (each uint8 holds 2 fp4 values)
%b_bitcast = vector.bitcast %bp : vector<512x32xi8> to vector<512x64xf4E2M1FN>
@@ -66,15 +66,15 @@ module @gemm attributes {gpu.container_module} {
%b_interleaved = vector.interleave %b_even_t, %b_odd_t : vector<32x512xf4E2M1FN> -> vector<32x1024xf4E2M1FN>
%b = vector.transpose %b_interleaved, [1, 0] : vector<32x1024xf4E2M1FN> to vector<1024x32xf4E2M1FN>
- %scale_a = xegpu.load_nd %a_scale_tdesc[%m, %kscale] {layout = #a_scale}: !xegpu.tensor_desc<32x32xf8E8M0FNU> -> vector<32x32xf8E8M0FNU>
+ %scale_a = xegpu.load_nd %a_scale_tdesc[%m, %kscale] <{layout = #a_scale}>: !xegpu.tensor_desc<32x32xf8E8M0FNU> -> vector<32x32xf8E8M0FNU>
- %scale_b = xegpu.load_nd %b_scale_tdesc[%kscale, %n] {layout = #b_scale}: !xegpu.tensor_desc<32x32xf8E8M0FNU> -> vector<32x32xf8E8M0FNU>
+ %scale_b = xegpu.load_nd %b_scale_tdesc[%kscale, %n] <{layout = #b_scale}>: !xegpu.tensor_desc<32x32xf8E8M0FNU> -> vector<32x32xf8E8M0FNU>
%new_c_partial = xegpu.dpas_mx %a, %b, %c_partial scale_a = %scale_a scale_b = %scale_b
- {layout_a = #a,
+ <{layout_a = #a,
layout_b = #b,
layout_cd = #c,
layout_a_scale = #dpas_a_scale,
- layout_b_scale = #dpas_b_scale}
+ layout_b_scale = #dpas_b_scale}>
: (vector<32x1024xf4E2M1FN>, vector<1024x32xf4E2M1FN>,
vector<32x32xf32>,
vector<32x32xf8E8M0FNU>, vector<32x32xf8E8M0FNU>)
@@ -88,7 +88,7 @@ module @gemm attributes {gpu.container_module} {
}
// store_nd with offset
- xegpu.store_nd %res#0, %cd_tdesc[%m, %n] {layout = #c} : vector<32x32xf32>, !xegpu.tensor_desc<32x32xf32, #c>
+ xegpu.store_nd %res#0, %cd_tdesc[%m, %n] <{layout = #c}> : vector<32x32xf32>, !xegpu.tensor_desc<32x32xf32, #c>
gpu.return
}
}
diff --git a/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm_quantizeA_F4.mlir b/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm_quantizeA_F4.mlir
index 87603594db5bf..f971ebc45cd0a 100644
--- a/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm_quantizeA_F4.mlir
+++ b/mlir/test/Integration/Dialect/XeGPU/WG/simple_mxfp_gemm_quantizeA_F4.mlir
@@ -47,12 +47,12 @@ module @gemm attributes {gpu.container_module} {
// Load initial C
%cd_tdesc = xegpu.create_nd_tdesc %arg4 : memref<256x256xf32> -> !xegpu.tensor_desc<32x32xf32, #c>
- %c_init = xegpu.load_nd %cd_tdesc[%m, %n] {layout = #c}: !xegpu.tensor_desc<32x32xf32, #c> -> vector<32x32xf32>
+ %c_init = xegpu.load_nd %cd_tdesc[%m, %n] <{layout = #c}>: !xegpu.tensor_desc<32x32xf32, #c> -> vector<32x32xf32>
%res:3 = scf.for %k = %c0 to %kbound step %kstep
iter_args(%c_partial = %c_init, %kb = %c0, %kscale = %c0) -> (vector<32x32xf32>, index, index) {
// -------- Load A (bf16) --------
- %a_bf16 = xegpu.load_nd %a_tdesc[%m, %k] {layout = #a_ld}: !xegpu.tensor_desc<32x1024xbf16> -> vector<32x1024xbf16>
+ %a_bf16 = xegpu.load_nd %a_tdesc[%m, %k] <{layout = #a_ld}>: !xegpu.tensor_desc<32x1024xbf16> -> vector<32x1024xbf16>
// -------- Quantize A: bf16 -> fp4 + f8E8M0 scale (block_size=32 along K) --------
// 1) abs and reduce-max per block of 32 along K dim using vector ops.
@@ -90,7 +90,7 @@ module @gemm attributes {gpu.container_module} {
%a = arith.scaling_truncf %a_bf16, %a_scale_full
: vector<32x1024xbf16>, vector<32x1024xf8E8M0FNU> to vector<32x1024xf4E2M1FN>
- %bp = xegpu.load_nd %bp_tdesc[%kb, %n] {layout = #b_packed}: !xegpu.tensor_desc<512x32xi8> -> vector<512x32xi8>
+ %bp = xegpu.load_nd %bp_tdesc[%kb, %n] <{layout = #b_packed}>: !xegpu.tensor_desc<512x32xi8> -> vector<512x32xi8>
// Bitcast to fp4: 512x32 uint8 -> 512x64 fp4 (each uint8 holds 2 fp4 values)
%b_bitcast = vector.bitcast %bp : vector<512x32xi8> to vector<512x64xf4E2M1FN>
@@ -108,13 +108,13 @@ module @gemm attributes {gpu.container_module} {
%b = vector.transpose %b_interleaved, [1, 0] : vector<32x1024xf4E2M1FN> to vector<1024x32xf4E2M1FN>
- %scale_b = xegpu.load_nd %b_scale_tdesc[%kscale, %n] {layout = #b_scale}: !xegpu.tensor_desc<32x32xf8E8M0FNU> -> vector<32x32xf8E8M0FNU>
+ %scale_b = xegpu.load_nd %b_scale_tdesc[%kscale, %n] <{layout = #b_scale}>: !xegpu.tensor_desc<32x32xf8E8M0FNU> -> vector<32x32xf8E8M0FNU>
%new_c_partial = xegpu.dpas_mx %a, %b, %c_partial scale_a = %a_scale scale_b = %scale_b
- {layout_a = #a,
+ <{layout_a = #a,
layout_b = #b,
layout_cd = #c,
layout_a_scale = #dpas_a_scale,
- layout_b_scale = #dpas_b_scale}
+ layout_b_scale = #dpas_b_scale}>
: (vector<32x1024xf4E2M1FN>, vector<1024x32xf4E2M1FN>,
vector<32x32xf32>,
vector<32x32xf8E8M0FNU>, vector<32x32xf8E8M0FNU>)
@@ -128,7 +128,7 @@ module @gemm attributes {gpu.container_module} {
}
// store_nd with offset
- xegpu.store_nd %res#0, %cd_tdesc[%m, %n] {layout = #c} : vector<32x32xf32>, !xegpu.tensor_desc<32x32xf32, #c>
+ xegpu.store_nd %res#0, %cd_tdesc[%m, %n] <{layout = #c}> : vector<32x32xf32>, !xegpu.tensor_desc<32x32xf32, #c>
gpu.return
}
}
More information about the Mlir-commits
mailing list