From ed1617dd20cd5bf8618565472e898da8300f832d Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Tue, 15 Sep 2026 00:08:50 -0400 Subject: [PATCH] x86_64: avoid emitting duplicate materialization The earlier duplicates make assumptions that are not true yet. Close #36819 --- src/codegen/x86_64/CodeGen.zig | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/codegen/x86_64/CodeGen.zig b/src/codegen/x86_64/CodeGen.zig index 5b06cd9eaaa85c30538d19af5304383836b39e0c..62c3c1a41bc51e3a1fdb85b38309fafbd3d28412 100644 --- a/src/codegen/x86_64/CodeGen.zig +++ b/src/codegen/x86_64/CodeGen.zig @@ -821,7 +821,8 @@ const InstTracking = struct { target: InstTracking, ) !void { const ty = function.typeOfIndex(inst); - if ((self.long == .none or self.long == .reserved_frame) and target.long == .load_frame) + if ((self.long == .none or self.long == .reserved_frame) and + target.long == .load_frame and target.short != .load_frame) try function.genCopy(ty, target.long, self.short, .{}); try function.genCopy(ty, target.short, self.short, .{}); } @@ -174277,8 +174278,9 @@ fn restoreState(self: *CodeGen, state: State, deaths: []const Air.Inst.Index, co if (opts.emit_instructions and current_maybe_inst != target_maybe_inst) { if (current_maybe_inst) |current_inst| try self.inst_tracking.getPtr(current_inst).?.spill(self, current_inst); - if (target_maybe_inst) |target_inst| - try self.inst_tracking.getPtr(target_inst).?.materialize(self, target_inst, reg_tracking); + if (target_maybe_inst) |target_inst| for (reg_tracking.getRegs()) |source_reg| { + if (RegisterManager.indexOfRegIntoTracked(source_reg).? > reg_index) break; + } else try self.inst_tracking.getPtr(target_inst).?.materialize(self, target_inst, reg_tracking); } if (opts.update_tracking) { if (current_maybe_inst) |current_inst| { -- 2.54.0