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