commit 4e581427d1fee46cdcab088cb2c1d7ad51b06239 (tree)
parent b36ea592b86ef20473697ded24a27bb644941de8
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date: Thu, 9 Jan 2025 07:39:34 -0500
x86_64: fix miscomp where in use register is marked as free
Diffstat:
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/register_manager.zig b/src/register_manager.zig
@@ -352,15 +352,15 @@ pub fn RegisterManager(
) AllocateRegistersError!void {
log.debug("getReg {} for inst {?}", .{ regAtTrackedIndex(tracked_index), inst });
if (!self.isRegIndexFree(tracked_index)) {
- self.markRegIndexAllocated(tracked_index);
-
// Move the instruction that was previously there to a
// stack allocation.
- const spilled_inst = self.registers[tracked_index];
- if (inst) |tracked_inst| self.registers[tracked_index] = tracked_inst;
- try self.getFunction().spillInstruction(regAtTrackedIndex(tracked_index), spilled_inst);
- if (inst == null) self.freeRegIndex(tracked_index);
- } else self.getRegIndexAssumeFree(tracked_index, inst);
+ try self.getFunction().spillInstruction(
+ regAtTrackedIndex(tracked_index),
+ self.registers[tracked_index],
+ );
+ self.freeRegIndex(tracked_index);
+ }
+ self.getRegIndexAssumeFree(tracked_index, inst);
}
pub fn getReg(self: *Self, reg: Register, inst: ?Air.Inst.Index) AllocateRegistersError!void {
log.debug("getting reg: {}", .{reg});