authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-09 07:39:34-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-10 06:10:15-05:00
log4e581427d1fee46cdcab088cb2c1d7ad51b06239
treee6141cafd3b14ad486e55e5dd5dd4213d979badc
parentb36ea592b86ef20473697ded24a27bb644941de8

x86_64: fix miscomp where in use register is marked as free


1 files changed, 7 insertions(+), 7 deletions(-)

src/register_manager.zig+7-7
...@@ -352,15 +352,15 @@ pub fn RegisterManager(...@@ -352,15 +352,15 @@ pub fn RegisterManager(
352 ) AllocateRegistersError!void {352 ) AllocateRegistersError!void {
353 log.debug("getReg {} for inst {?}", .{ regAtTrackedIndex(tracked_index), inst });353 log.debug("getReg {} for inst {?}", .{ regAtTrackedIndex(tracked_index), inst });
354 if (!self.isRegIndexFree(tracked_index)) {354 if (!self.isRegIndexFree(tracked_index)) {
355 self.markRegIndexAllocated(tracked_index);
356
357 // Move the instruction that was previously there to a355 // Move the instruction that was previously there to a
358 // stack allocation.356 // stack allocation.
359 const spilled_inst = self.registers[tracked_index];357 try self.getFunction().spillInstruction(
360 if (inst) |tracked_inst| self.registers[tracked_index] = tracked_inst;358 regAtTrackedIndex(tracked_index),
361 try self.getFunction().spillInstruction(regAtTrackedIndex(tracked_index), spilled_inst);359 self.registers[tracked_index],
362 if (inst == null) self.freeRegIndex(tracked_index);360 );
363 } else self.getRegIndexAssumeFree(tracked_index, inst);361 self.freeRegIndex(tracked_index);
362 }
363 self.getRegIndexAssumeFree(tracked_index, inst);
364 }364 }
365 pub fn getReg(self: *Self, reg: Register, inst: ?Air.Inst.Index) AllocateRegistersError!void {365 pub fn getReg(self: *Self, reg: Register, inst: ?Air.Inst.Index) AllocateRegistersError!void {
366 log.debug("getting reg: {}", .{reg});366 log.debug("getting reg: {}", .{reg});