| ... | @@ -1247,7 +1247,6 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -1247,7 +1247,6 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { |
| 1247 | else => return self.fail("TODO slice_elem_val when slice is {}", .{slice_mcv}), | 1247 | else => return self.fail("TODO slice_elem_val when slice is {}", .{slice_mcv}), |
| 1248 | }; | 1248 | }; |
| 1249 | self.register_manager.freezeRegs(&.{base_mcv.register}); | 1249 | self.register_manager.freezeRegs(&.{base_mcv.register}); |
| 1250 | defer self.register_manager.unfreezeRegs(&.{base_mcv.register}); | | |
| 1251 | | 1250 | |
| 1252 | switch (elem_size) { | 1251 | switch (elem_size) { |
| 1253 | 1, 4 => { | 1252 | 1, 4 => { |
| ... | @@ -1283,6 +1282,8 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -1283,6 +1282,8 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { |
| 1283 | } }, | 1282 | } }, |
| 1284 | }); | 1283 | }); |
| 1285 | | 1284 | |
| | 1285 | self.register_manager.unfreezeRegs(&.{base_mcv.register}); |
| | 1286 | |
| 1286 | break :result dst_mcv; | 1287 | break :result dst_mcv; |
| 1287 | }, | 1288 | }, |
| 1288 | else => { | 1289 | else => { |
| ... | @@ -1291,7 +1292,6 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -1291,7 +1292,6 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { |
| 1291 | const offset_mcv = try self.genArmMulConstant(bin_op.rhs, @intCast(u32, elem_size)); | 1292 | const offset_mcv = try self.genArmMulConstant(bin_op.rhs, @intCast(u32, elem_size)); |
| 1292 | assert(offset_mcv == .register); // result of multiplication should always be register | 1293 | assert(offset_mcv == .register); // result of multiplication should always be register |
| 1293 | self.register_manager.freezeRegs(&.{offset_mcv.register}); | 1294 | self.register_manager.freezeRegs(&.{offset_mcv.register}); |
| 1294 | defer self.register_manager.unfreezeRegs(&.{offset_mcv.register}); | | |
| 1295 | | 1295 | |
| 1296 | const addr_reg = try self.register_manager.allocReg(null); | 1296 | const addr_reg = try self.register_manager.allocReg(null); |
| 1297 | self.register_manager.freezeRegs(&.{addr_reg}); | 1297 | self.register_manager.freezeRegs(&.{addr_reg}); |
| ... | @@ -1299,11 +1299,9 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -1299,11 +1299,9 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { |
| 1299 | | 1299 | |
| 1300 | try self.genArmBinOpCode(addr_reg, base_mcv, offset_mcv, false, .add, .unsigned); | 1300 | try self.genArmBinOpCode(addr_reg, base_mcv, offset_mcv, false, .add, .unsigned); |
| 1301 | | 1301 | |
| 1302 | // I know we will unfreeze these registers at the end of | 1302 | // At this point in time, neither the base register |
| 1303 | // the scope of :result. However, at this point in time, | 1303 | // nor the offset register contains any valuable data |
| 1304 | // neither the base register nor the offset register | 1304 | // anymore. |
| 1305 | // contains any valuable data anymore. In order to reduce | | |
| 1306 | // register pressure, unfreeze them prematurely | | |
| 1307 | self.register_manager.unfreezeRegs(&.{ base_mcv.register, offset_mcv.register }); | 1305 | self.register_manager.unfreezeRegs(&.{ base_mcv.register, offset_mcv.register }); |
| 1308 | | 1306 | |
| 1309 | try self.load(dst_mcv, .{ .register = addr_reg }, slice_ptr_field_type); | 1307 | try self.load(dst_mcv, .{ .register = addr_reg }, slice_ptr_field_type); |