[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