authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-05 03:30:17-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-05 06:08:06-05:00
log803ea101078e8d36138d8c53f10cdeb32efaaa14
tree6733e63eaccf6d26741aa282f30fba396f7a1b44
parente9a6197a8ea38c228e2683d82cfbdbad8e7d912a

x86_64: fix tracking during `br`


1 files changed, 11 insertions(+), 10 deletions(-)

src/arch/x86_64/CodeGen.zig+11-10
......@@ -585,7 +585,7 @@ const InstTracking = struct {
585585 tracking_log.debug("%{d} => {} (spilled)", .{ inst, self.* });
586586 }
587587
588 fn verifyMaterialize(self: *InstTracking, target: InstTracking) void {
588 fn verifyMaterialize(self: InstTracking, target: InstTracking) void {
589589 switch (self.long) {
590590 .none,
591591 .unreach,
......@@ -634,7 +634,7 @@ const InstTracking = struct {
634634 }
635635
636636 fn materializeUnsafe(
637 self: *InstTracking,
637 self: InstTracking,
638638 function: *Self,
639639 inst: Air.Inst.Index,
640640 target: InstTracking,
......@@ -688,7 +688,7 @@ const InstTracking = struct {
688688 }
689689
690690 fn liveOut(self: *InstTracking, function: *Self, inst: Air.Inst.Index) void {
691 for (self.short.getRegs()) |reg| {
691 for (self.getRegs()) |reg| {
692692 if (function.register_manager.isRegFree(reg)) {
693693 tracking_log.debug("%{d} => {} (live-out)", .{ inst, self.* });
694694 continue;
......@@ -701,7 +701,7 @@ const InstTracking = struct {
701701 // Disable death.
702702 var found_reg = false;
703703 var remaining_reg: Register = .none;
704 for (tracking.short.getRegs()) |tracked_reg| if (tracked_reg.id() == reg.id()) {
704 for (tracking.getRegs()) |tracked_reg| if (tracked_reg.id() == reg.id()) {
705705 assert(!found_reg);
706706 found_reg = true;
707707 } else {
......@@ -11991,7 +11991,6 @@ fn performReloc(self: *Self, reloc: Mir.Inst.Index) !void {
1199111991fn airBr(self: *Self, inst: Air.Inst.Index) !void {
1199211992 const mod = self.bin_file.options.module.?;
1199311993 const br = self.air.instructions.items(.data)[inst].br;
11994 const src_mcv = try self.resolveInst(br.operand);
1199511994
1199611995 const block_ty = self.typeOfIndex(br.block_inst);
1199711996 const block_unused =
......@@ -12002,15 +12001,17 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void {
1200212001 const block_result = result: {
1200312002 if (block_unused) break :result .none;
1200412003
12004 if (!first_br) try self.getValue(block_tracking.short, null);
12005 const src_mcv = try self.resolveInst(br.operand);
12006
1200512007 if (self.reuseOperandAdvanced(inst, br.operand, 0, src_mcv, br.block_inst)) {
1200612008 if (first_br) break :result src_mcv;
1200712009
12008 for (block_tracking.getRegs()) |block_reg|
12009 try self.register_manager.getReg(block_reg, br.block_inst);
12010 try self.getValue(block_tracking.short, br.block_inst);
1201012011 // .long = .none to avoid merging operand and block result stack frames.
12011 var current_tracking = InstTracking{ .long = .none, .short = src_mcv };
12012 const current_tracking: InstTracking = .{ .long = .none, .short = src_mcv };
1201212013 try current_tracking.materializeUnsafe(self, br.block_inst, block_tracking.*);
12013 for (src_mcv.getRegs()) |src_reg| self.register_manager.freeReg(src_reg);
12014 for (current_tracking.getRegs()) |src_reg| self.register_manager.freeReg(src_reg);
1201412015 break :result block_tracking.short;
1201512016 }
1201612017
......@@ -12018,7 +12019,7 @@ fn airBr(self: *Self, inst: Air.Inst.Index) !void {
1201812019 try self.getValue(block_tracking.short, br.block_inst);
1201912020 break :dst block_tracking.short;
1202012021 };
12021 try self.genCopy(block_ty, dst_mcv, src_mcv);
12022 try self.genCopy(block_ty, dst_mcv, try self.resolveInst(br.operand));
1202212023 break :result dst_mcv;
1202312024 };
1202412025