[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