| ... | @@ -148,18 +148,19 @@ pub fn RegisterManager( | ... | @@ -148,18 +148,19 @@ pub fn RegisterManager( |
| 148 | ) ?[count]Register { | 148 | ) ?[count]Register { |
| 149 | comptime assert(count > 0 and count <= tracked_registers.len); | 149 | comptime assert(count > 0 and count <= tracked_registers.len); |
| 150 | | 150 | |
| 151 | const free_registers = @popCount(FreeRegInt, self.free_registers); | 151 | const free_and_not_frozen_registers = self.free_registers & ~self.frozen_registers; |
| 152 | if (free_registers < count) return null; | 152 | const free_and_not_frozen_registers_count = @popCount(FreeRegInt, free_and_not_frozen_registers); |
| | 153 | if (free_and_not_frozen_registers_count < count) return null; |
| 153 | | 154 | |
| 154 | var regs: [count]Register = undefined; | 155 | var regs: [count]Register = undefined; |
| 155 | var i: usize = 0; | 156 | var i: usize = 0; |
| 156 | for (tracked_registers) |reg| { | 157 | for (tracked_registers) |reg| { |
| 157 | if (i >= count) break; | 158 | if (i >= count) break; |
| 158 | if (self.isRegFrozen(reg)) continue; | 159 | if (self.isRegFrozen(reg)) continue; |
| 159 | if (self.isRegFree(reg)) { | 160 | if (!self.isRegFree(reg)) continue; |
| 160 | regs[i] = reg; | 161 | |
| 161 | i += 1; | 162 | regs[i] = reg; |
| 162 | } | 163 | i += 1; |
| 163 | } | 164 | } |
| 164 | assert(i == count); | 165 | assert(i == count); |
| 165 | | 166 | |
| ... | @@ -193,7 +194,8 @@ pub fn RegisterManager( | ... | @@ -193,7 +194,8 @@ pub fn RegisterManager( |
| 193 | insts: [count]?Air.Inst.Index, | 194 | insts: [count]?Air.Inst.Index, |
| 194 | ) AllocateRegistersError![count]Register { | 195 | ) AllocateRegistersError![count]Register { |
| 195 | comptime assert(count > 0 and count <= tracked_registers.len); | 196 | comptime assert(count > 0 and count <= tracked_registers.len); |
| 196 | if (count > tracked_registers.len - @popCount(FreeRegInt, self.frozen_registers)) return error.OutOfRegisters; | 197 | const frozen_registers_count = @popCount(FreeRegInt, self.frozen_registers); |
| | 198 | if (count > tracked_registers.len - frozen_registers_count) return error.OutOfRegisters; |
| 197 | | 199 | |
| 198 | const result = self.tryAllocRegs(count, insts) orelse blk: { | 200 | const result = self.tryAllocRegs(count, insts) orelse blk: { |
| 199 | // We'll take over the first count registers. Spill | 201 | // We'll take over the first count registers. Spill |