authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2026-09-15 00:08:50-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-09-17 02:15:39+02:00
loged1617dd20cd5bf8618565472e898da8300f832d
tree6f24146e6bac6c55c27ec8a475bdded0931c1d12
parentd8147ba476217797d600b7e5f46f0a67a5b96188

x86_64: avoid emitting duplicate materialization

The earlier duplicates make assumptions that are not true yet. Close #36819

1 files changed, 5 insertions(+), 3 deletions(-)

src/codegen/x86_64/CodeGen.zig+5-3
......@@ -821,7 +821,8 @@ const InstTracking = struct {
821821 target: InstTracking,
822822 ) !void {
823823 const ty = function.typeOfIndex(inst);
824 if ((self.long == .none or self.long == .reserved_frame) and target.long == .load_frame)
824 if ((self.long == .none or self.long == .reserved_frame) and
825 target.long == .load_frame and target.short != .load_frame)
825826 try function.genCopy(ty, target.long, self.short, .{});
826827 try function.genCopy(ty, target.short, self.short, .{});
827828 }
......@@ -174277,8 +174278,9 @@ fn restoreState(self: *CodeGen, state: State, deaths: []const Air.Inst.Index, co
174277174278 if (opts.emit_instructions and current_maybe_inst != target_maybe_inst) {
174278174279 if (current_maybe_inst) |current_inst|
174279174280 try self.inst_tracking.getPtr(current_inst).?.spill(self, current_inst);
174280 if (target_maybe_inst) |target_inst|
174281 try self.inst_tracking.getPtr(target_inst).?.materialize(self, target_inst, reg_tracking);
174281 if (target_maybe_inst) |target_inst| for (reg_tracking.getRegs()) |source_reg| {
174282 if (RegisterManager.indexOfRegIntoTracked(source_reg).? > reg_index) break;
174283 } else try self.inst_tracking.getPtr(target_inst).?.materialize(self, target_inst, reg_tracking);
174282174284 }
174283174285 if (opts.update_tracking) {
174284174286 if (current_maybe_inst) |current_inst| {