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 {
69016901 const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, .function);
69026902 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
69046908 const field_ty_id = try cg.resolveType(field_ty, .indirect);
69056909 const active_pl_ptr_ty_id = try cg.ptrType(field_ty_id, .function);
69066910 const active_pl_ptr_id = cg.allocId();
......@@ -7013,6 +7017,12 @@ fn structFieldPtr(
70137017 }
70147018
70157019 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
70167026 const layout_payload_ty_id = try cg.resolveType(layout.payload_ty, .indirect);
70177027 const pl_ptr_ty_id = try cg.ptrType(layout_payload_ty_id, storage_class);
70187028 const pl_ptr_id = blk: {