authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-14 22:32:00-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-15 01:04:21-04:00
log05b12e677939effa9da147008071908a2a93fe35
treea69dba305e556a4e469a247a514964503f98440d
parent238615984064f52b6ff31b5750824a9c764fdb15

x86_64: handle duplicate prong deaths


4 files changed, 6 insertions(+), 11 deletions(-)

src/arch/x86_64/CodeGen.zig+6-7
......@@ -1037,9 +1037,9 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
10371037fn processDeath(self: *Self, inst: Air.Inst.Index) void {
10381038 const air_tags = self.air.instructions.items(.tag);
10391039 if (air_tags[inst] == .constant) return; // Constants are immortal.
1040 const prev_value = self.getResolvedInstValue(inst) orelse return;
10401041 log.debug("%{d} => {}", .{ inst, MCValue.dead });
10411042 // When editing this function, note that the logic must synchronize with `reuseOperand`.
1042 const prev_value = self.getResolvedInstValue(inst);
10431043 const branch = &self.branch_stack.items[self.branch_stack.items.len - 1];
10441044 branch.inst_table.putAssumeCapacity(inst, .dead);
10451045 switch (prev_value) {
......@@ -1225,7 +1225,7 @@ fn revertState(self: *Self, state: State) void {
12251225pub fn spillInstruction(self: *Self, reg: Register, inst: Air.Inst.Index) !void {
12261226 const stack_mcv = try self.allocRegOrMem(inst, false);
12271227 log.debug("spilling %{d} to stack mcv {any}", .{ inst, stack_mcv });
1228 const reg_mcv = self.getResolvedInstValue(inst);
1228 const reg_mcv = self.getResolvedInstValue(inst).?;
12291229 switch (reg_mcv) {
12301230 .register => |other| {
12311231 assert(reg.to64() == other.to64());
......@@ -1242,7 +1242,7 @@ pub fn spillInstruction(self: *Self, reg: Register, inst: Air.Inst.Index) !void
12421242
12431243pub fn spillEflagsIfOccupied(self: *Self) !void {
12441244 if (self.eflags_inst) |inst_to_save| {
1245 const mcv = self.getResolvedInstValue(inst_to_save);
1245 const mcv = self.getResolvedInstValue(inst_to_save).?;
12461246 const new_mcv = switch (mcv) {
12471247 .register_overflow => try self.allocRegOrMem(inst_to_save, false),
12481248 .eflags => try self.allocRegOrMem(inst_to_save, true),
......@@ -6315,18 +6315,17 @@ fn resolveInst(self: *Self, inst: Air.Inst.Ref) InnerError!MCValue {
63156315 return gop.value_ptr.*;
63166316 },
63176317 .const_ty => unreachable,
6318 else => return self.getResolvedInstValue(inst_index),
6318 else => return self.getResolvedInstValue(inst_index).?,
63196319 }
63206320}
63216321
6322fn getResolvedInstValue(self: *Self, inst: Air.Inst.Index) MCValue {
6322fn getResolvedInstValue(self: *Self, inst: Air.Inst.Index) ?MCValue {
63236323 // Treat each stack item as a "layer" on top of the previous one.
63246324 var i: usize = self.branch_stack.items.len;
63256325 while (true) {
63266326 i -= 1;
63276327 if (self.branch_stack.items[i].inst_table.get(inst)) |mcv| {
6328 assert(mcv != .dead);
6329 return mcv;
6328 return if (mcv != .dead) mcv else null;
63306329 }
63316330 }
63326331}
test/behavior/inline_switch.zig-1
......@@ -46,7 +46,6 @@ const U = union(E) { a: void, b: u2, c: u3, d: u4 };
4646test "inline switch unions" {
4747 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
4848 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
49 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
5049 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
5150
5251 var x: U = .a;
test/behavior/union.zig-2
......@@ -214,7 +214,6 @@ const Payload = union(Letter) {
214214};
215215
216216test "union with specified enum tag" {
217 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
218217 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
219218 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
220219 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -224,7 +223,6 @@ test "union with specified enum tag" {
224223}
225224
226225test "packed union generates correctly aligned type" {
227 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
228226 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
229227 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
230228 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/union_with_members.zig-1
......@@ -18,7 +18,6 @@ const ET = union(enum) {
1818
1919test "enum with members" {
2020 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
21 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2221 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2322 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2423 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO