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

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Oct 14 23:20:14 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Alexander Shaposhnikov (alexander-shaposhnikov)

<details>
<summary>Changes</summary>

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.

---
Full diff: https://github.com/llvm/llvm-project/pull/232192.diff


3 Files Affected:

- (modified) mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp (+1) 
- (modified) mlir/lib/Target/SPIRV/Serialization/Serializer.cpp (+1) 
- (modified) mlir/test/Target/SPIRV/decorations.mlir (+14) 


``````````diff
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
+  }
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/232192


More information about the Mlir-commits mailing list