From 6daa37ded905431f3a25508a42590031b0905ab9 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sat, 31 May 2025 23:39:35 -0400 Subject: [PATCH] x86_64: fix packed struct equality Closes #22990 --- src/arch/x86_64/CodeGen.zig | 20 ++++++++++++++++++-- test/behavior/packed-struct.zig | 11 +++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 2f12399457..392f9089a7 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -77309,11 +77309,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, } }, - .int => res[0] = ops[0].cmpInts(cmp_op, &ops[1], cg) catch |err| break :err err, + .int => { + switch (ty.zigTypeTag(zcu)) { + else => {}, + .@"struct", .@"union" => { + assert(ty.containerLayout(zcu) == .@"packed"); + for (&ops) |*op| op.wrapInt(cg) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} wrap {} {}", .{ + @tagName(air_tag), + ty.fmt(pt), + op.tracking(cg), + }), + else => |e| return e, + }; + }, + } + res[0] = ops[0].cmpInts(cmp_op, &ops[1], cg) catch |err| break :err err; + }, }) catch |err| switch (err) { error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ @tagName(air_tag), - cg.typeOf(bin_op.lhs).fmt(pt), + ty.fmt(pt), ops[0].tracking(cg), ops[1].tracking(cg), }), diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig index be4a73be4f..779157e917 100644 --- a/test/behavior/packed-struct.zig +++ b/test/behavior/packed-struct.zig @@ -1307,6 +1307,17 @@ test "packed struct equality" { comptime try S.doTest(x, y); } +test "packed struct equality ignores padding bits" { + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = packed struct { b: bool }; + var s: S = undefined; + s.b = true; + try std.testing.expect(s != S{ .b = false }); + try std.testing.expect(s == S{ .b = true }); +} + test "packed struct with signed field" { var s: packed struct { a: i2,