[Mlir-commits] [mlir] [mlir][SPIR-V] Support CPacked decorations in binary round trips (PR #232192)

Alexander Shaposhnikov llvmlistbot at llvm.org
Wed Oct 14 23:19:35 PDT 2026


https://github.com/alexander-shaposhnikov created https://github.com/llvm/llvm-project/pull/232192

The SPIR-V dialect already represents CPacked struct types, but binary serialization and deserialization reject the decoration. Handle CPacked as a unit decoration in both directions so packed structs survive binary round trips.

Add round-trip coverage for literal and identified packed structs.

>From 2374ab45035940449ddd96d729c16be67ec5cad6 Mon Sep 17 00:00:00 2001
From: Alexander Shaposhnikov <alexander.v.shaposhnikov at gmail.com>
Date: Wed, 14 Oct 2026 23:18:55 -0700
Subject: [PATCH] [mlir][SPIR-V] Support CPacked decorations in binary round
 trips

The SPIR-V dialect already represents CPacked struct types, but binary
serialization and deserialization reject the decoration. Handle CPacked
as a unit decoration in both directions so packed structs survive binary
round trips.

Add round-trip coverage for literal and identified packed structs.
---
 .../Target/SPIRV/Deserialization/Deserializer.cpp  |  1 +
 mlir/lib/Target/SPIRV/Serialization/Serializer.cpp |  1 +
 mlir/test/Target/SPIRV/decorations.mlir            | 14 ++++++++++++++
 3 files changed, 16 insertions(+)

diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
index 1cdc5686adfeb..5813a8961e5e6 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
@@ -370,6 +370,7 @@ LogicalResult spirv::Deserializer::processDecoration(ArrayRef<uint32_t> words) {
   case spirv::Decoration::AliasedPointer:
   case spirv::Decoration::Block:
   case spirv::Decoration::BufferBlock:
+  case spirv::Decoration::CPacked:
   case spirv::Decoration::Flat:
   case spirv::Decoration::NonReadable:
   case spirv::Decoration::NonWritable:
diff --git a/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp b/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp
index 44a96e9037963..e92ef88ed6437 100644
--- a/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp
+++ b/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp
@@ -420,6 +420,7 @@ LogicalResult Serializer::processDecorationAttr(Location loc, uint32_t resultID,
   case spirv::Decoration::Constant:
   case spirv::Decoration::Block:
   case spirv::Decoration::BufferBlock:
+  case spirv::Decoration::CPacked:
   case spirv::Decoration::Invariant:
   case spirv::Decoration::Patch:
   case spirv::Decoration::Coherent:
diff --git a/mlir/test/Target/SPIRV/decorations.mlir b/mlir/test/Target/SPIRV/decorations.mlir
index 2d3f256715caa..4be10a2a07b2d 100644
--- a/mlir/test/Target/SPIRV/decorations.mlir
+++ b/mlir/test/Target/SPIRV/decorations.mlir
@@ -225,3 +225,17 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {
     spirv.Return
   }
 }
+
+// -----
+
+spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, Int8, Int64, Linkage], []> {
+  // CHECK: spirv.func @cpacked_struct(%{{.*}}: !spirv.ptr<!spirv.struct<(i8, i64, i32), CPacked>, CrossWorkgroup>)
+  spirv.func @cpacked_struct(%arg0: !spirv.ptr<!spirv.struct<(i8, i64, i32), CPacked>, CrossWorkgroup>) "None" {
+    spirv.Return
+  }
+
+  // CHECK: spirv.func @cpacked_identified_struct(%{{.*}}: !spirv.ptr<!spirv.struct<packed, (i8, i64, i32), CPacked>, CrossWorkgroup>)
+  spirv.func @cpacked_identified_struct(%arg0: !spirv.ptr<!spirv.struct<packed, (i8, i64, i32), CPacked>, CrossWorkgroup>) "None" {
+    spirv.Return
+  }
+}



More information about the Mlir-commits mailing list