authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-28 18:32:51-07:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-09-02 22:30:48+02:00
log61f447523350a467fde242b846ed27b084ed1f50
treea3171036a6fb2806bc5ed9d20bdc0d20484557c5
parentcbc3c0dc594341faddb8841fb466254f2f6f3b35
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

LLVM backend:fix align 1 sret parameter load returned

closes #25067

2 files changed, 19 insertions(+), 0 deletions(-)

src/codegen/llvm.zig+1
......@@ -9761,6 +9761,7 @@ pub const FuncGen = struct {
97619761 const ptr = try fg.resolveInst(ty_op.operand);
97629762
97639763 elide: {
9764 if (ptr_info.flags.alignment != .none) break :elide;
97649765 if (!isByRef(Type.fromInterned(ptr_info.child), zcu)) break :elide;
97659766 if (!canElideLoad(fg, body_tail)) break :elide;
97669767 return ptr;
test/behavior/struct.zig+18
......@@ -2136,3 +2136,21 @@ test "field access through mem ptr arg" {
21362136 &.{ .field = 0x0ced271f },
21372137 ) == 0x0ced271f);
21382138}
2139
2140test "align 1 struct parameter dereferenced and returned" {
2141 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
2142
2143 const S = extern struct {
2144 a: u32,
2145
2146 fn gimme(p: *align(1) @This()) @This() {
2147 return p.*;
2148 }
2149 };
2150 var buffer: [5]u8 align(4) = .{ 1, 2, 3, 4, 5 };
2151 const s = S.gimme(@ptrCast(buffer[1..]));
2152 switch (native_endian) {
2153 .big => try expect(s.a == 0x02030405),
2154 .little => try expect(s.a == 0x05040302),
2155 }
2156}