zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Msrc/register_manager.zig | 14+++++++-------
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});