From 16c4ed275d0254ce7ba0bd1daa60f9ec4b39e316 Mon Sep 17 00:00:00 2001 From: Ali Cheraghi Date: Sun, 5 Jul 2026 10:24:01 +0330 Subject: [PATCH] spirv: skip pointer OpBitcast on union field access when types match --- src/codegen/spirv/CodeGen.zig | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/codegen/spirv/CodeGen.zig b/src/codegen/spirv/CodeGen.zig index de830baf765ea5fc1a86ce1c69c73af863bc78f3..755fc378d5073c5bca5290c4de86c3bebdfab791 100644 --- a/src/codegen/spirv/CodeGen.zig +++ b/src/codegen/spirv/CodeGen.zig @@ -6901,6 +6901,10 @@ fn airAggFieldVal(cg: *CodeGen, inst: Air.Inst.Index) !?Id { const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, .function); const pl_ptr_id = try cg.accessChain(pl_ptr_ty_id, tmp_id, &.{layout.payload_index}); + if (field_ty.toIntern() == layout.payload_ty.toIntern()) { + return try cg.load(field_ty, pl_ptr_id, .{}); + } + const field_ty_id = try cg.resolveType(field_ty, .indirect); const active_pl_ptr_ty_id = try cg.ptrType(field_ty_id, .function); const active_pl_ptr_id = cg.allocId(); @@ -7013,6 +7017,12 @@ fn structFieldPtr( } const storage_class = cg.storageClass(object_ptr_ty.ptrAddressSpace(zcu)); + const field_ty = result_ptr_ty.childType(zcu); + if (field_ty.toIntern() == layout.payload_ty.toIntern()) { + if (object_ty.containerLayout(zcu) == .@"packed") return object_ptr; + return try cg.accessChain(result_ty_id, object_ptr, &.{layout.payload_index}); + } + const layout_payload_ty_id = try cg.resolveType(layout.payload_ty, .indirect); const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, storage_class); const pl_ptr_id = blk: { -- 2.54.0