authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2026-07-05 10:24:01+03:30
committergravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2026-07-05 10:24:01+03:30
log16c4ed275d0254ce7ba0bd1daa60f9ec4b39e316
tree228da9eab84294c5fa0872e64fcec442c452aff5
parent501b43a75b09d0ac6e25936036316612feb2d40b

spirv: skip pointer OpBitcast on union field access when types match


1 files changed, 10 insertions(+), 0 deletions(-)

src/codegen/spirv/CodeGen.zig+10
...@@ -6901,6 +6901,10 @@ fn airAggFieldVal(cg: *CodeGen, inst: Air.Inst.Index) !?Id {...@@ -6901,6 +6901,10 @@ fn airAggFieldVal(cg: *CodeGen, inst: Air.Inst.Index) !?Id {
6901 const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, .function);6901 const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, .function);
6902 const pl_ptr_id = try cg.accessChain(pl_ptr_ty_id, tmp_id, &.{layout.payload_index});6902 const pl_ptr_id = try cg.accessChain(pl_ptr_ty_id, tmp_id, &.{layout.payload_index});
69036903
6904 if (field_ty.toIntern() == layout.payload_ty.toIntern()) {
6905 return try cg.load(field_ty, pl_ptr_id, .{});
6906 }
6907
6904 const field_ty_id = try cg.resolveType(field_ty, .indirect);6908 const field_ty_id = try cg.resolveType(field_ty, .indirect);
6905 const active_pl_ptr_ty_id = try cg.ptrType(field_ty_id, .function);6909 const active_pl_ptr_ty_id = try cg.ptrType(field_ty_id, .function);
6906 const active_pl_ptr_id = cg.allocId();6910 const active_pl_ptr_id = cg.allocId();
...@@ -7013,6 +7017,12 @@ fn structFieldPtr(...@@ -7013,6 +7017,12 @@ fn structFieldPtr(
7013 }7017 }
70147018
7015 const storage_class = cg.storageClass(object_ptr_ty.ptrAddressSpace(zcu));7019 const storage_class = cg.storageClass(object_ptr_ty.ptrAddressSpace(zcu));
7020 const field_ty = result_ptr_ty.childType(zcu);
7021 if (field_ty.toIntern() == layout.payload_ty.toIntern()) {
7022 if (object_ty.containerLayout(zcu) == .@"packed") return object_ptr;
7023 return try cg.accessChain(result_ty_id, object_ptr, &.{layout.payload_index});
7024 }
7025
7016 const layout_payload_ty_id = try cg.resolveType(layout.payload_ty, .indirect);7026 const layout_payload_ty_id = try cg.resolveType(layout.payload_ty, .indirect);
7017 const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, storage_class);7027 const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, storage_class);
7018 const pl_ptr_id = blk: {7028 const pl_ptr_id = blk: {