authorgravatar for me@brianferri.devBrian Ferri <me@brianferri.dev> 2026-10-01 21:14:52+02:00
committergravatar for me@brianferri.devBrian Ferri <me@brianferri.dev> 2026-10-01 21:14:52+02:00
log495c65d5140a1907575b696f2a713dfedde5c047
tree3f9f0d23b3ecd4a5ef0b2e7e7ff31aa443282d50
parentfaa537cf9c732b19baa285df9915384bd55dbd2f
signature Signed by SSH key SHA256:tmUEGJn/zF+25GuUWrgw46/H3HO5tyY5DOfoj51gjV0

spirv: do not emit unused pointer types for variables


1 files changed, 21 insertions(+), 12 deletions(-)

src/codegen/spirv/CodeGen.zig+21-12
......@@ -1684,15 +1684,24 @@ fn constantPtr(cg: *CodeGen, ptr_val: Value) !Id {
16841684 return cg.derivePtr(ptr_val.typeOf(zcu).ptrAddressSpace(zcu), derivation);
16851685}
16861686
1687fn derivedPtrType(cg: *CodeGen, @"addrspace": std.lang.AddressSpace, derivation: Value.PointerDerivation) !Id {
1688 return cg.ptrType(
1689 try cg.pointeeType(@"addrspace", derivation.elem_ty, false),
1690 cg.storageClass(@"addrspace"),
1691 );
1692}
1693
16871694fn derivePtr(cg: *CodeGen, @"addrspace": std.lang.AddressSpace, derivation: Value.PointerDerivation) !Id {
16881695 const gpa = cg.gpa;
16891696 const zcu = cg.zcu;
16901697 const target = zcu.getTarget();
16911698
1692 const result_ty_id = try cg.ptrType(
1693 try cg.pointeeType(@"addrspace", derivation.elem_ty, false),
1694 cg.storageClass(@"addrspace"),
1695 );
1699 // A variable on Vulkan and OpenGL is used through its own pointer, so a `nav` resolves this only
1700 // where it is used; a type emitted and left unused stays in the module.
1701 const result_ty_id = switch (derivation.addr) {
1702 .nav => undefined,
1703 else => try cg.derivedPtrType(@"addrspace", derivation),
1704 };
16961705
16971706 switch (derivation.addr) {
16981707 .comptime_alloc, .comptime_field => unreachable,
......@@ -1727,10 +1736,10 @@ fn derivePtr(cg: *CodeGen, @"addrspace": std.lang.AddressSpace, derivation: Valu
17271736
17281737 if (ip.isFunctionType(nav_ty.toIntern())) {
17291738 if (is_extern) return try cg.resolveExternFn(nav_index);
1730 return try cg.constUndef(result_ty_id);
1739 return try cg.constUndef(try cg.derivedPtrType(@"addrspace", derivation));
17311740 }
17321741 if (!nav_ty.hasRuntimeBits(zcu) and nav_ty.zigTypeTag(zcu) != .spirv) {
1733 return cg.constUndef(result_ty_id);
1742 return cg.constUndef(try cg.derivedPtrType(@"addrspace", derivation));
17341743 }
17351744 if (!is_extern) {
17361745 return cg.todo("pointer to constant '{f}'", .{nav.fqn.fmt(ip)});
......@@ -1739,23 +1748,23 @@ fn derivePtr(cg: *CodeGen, @"addrspace": std.lang.AddressSpace, derivation: Valu
17391748 const as = nav.resolved.?.@"addrspace";
17401749 assert(as != .generic);
17411750
1742 const storage_class = cg.storageClass(as);
17431751 const var_id = try cg.resolveNav(nav_index);
1744 const nav_ty_id = try cg.resolveType(nav_ty, .indirect);
1745 const decl_ptr_ty_id = try cg.ptrType(nav_ty_id, storage_class);
17461752 if (cg.needsLayout(as, nav_ty)) {
17471753 try cg.block_var_ids.put(gpa, var_id, {});
17481754 }
1749
1750 if (decl_ptr_ty_id == result_ty_id) return var_id;
17511755 switch (target.os.tag) {
17521756 .vulkan, .opengl => return var_id,
17531757 else => {},
17541758 }
17551759
1760 const nav_ty_id = try cg.resolveType(nav_ty, .indirect);
1761 const decl_ptr_ty_id = try cg.ptrType(nav_ty_id, cg.storageClass(as));
1762 const nav_result_ty_id = try cg.derivedPtrType(@"addrspace", derivation);
1763 if (decl_ptr_ty_id == nav_result_ty_id) return var_id;
1764
17561765 const casted_ptr_id = cg.allocId();
17571766 try cg.body.emit(gpa, .OpBitcast, .{
1758 .id_result_type = result_ty_id,
1767 .id_result_type = nav_result_ty_id,
17591768 .id_result = casted_ptr_id,
17601769 .operand = var_id,
17611770 });