authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-02-20 10:51:36+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-02-20 10:52:34+01:00
log59a9373c71854ff79b22d3ea154cc3e06c130cc1
treed62f6a5f2549504023f7bac5b95a4cd86d43c4e2
parent87d358024fe14973f6f5276dd4e29a1fc1cee10d

aarch64: alloc new mcv in bitcast if cannot reuse operand


1 files changed, 19 insertions(+), 2 deletions(-)

src/arch/aarch64/CodeGen.zig+19-2
...@@ -3958,7 +3958,9 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type...@@ -3958,7 +3958,9 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
39583958
3959 switch (value) {3959 switch (value) {
3960 .dead => unreachable,3960 .dead => unreachable,
3961 .undef => unreachable,3961 .undef => {
3962 try self.genSetReg(value_ty, addr_reg, value);
3963 },
3962 .register => |value_reg| {3964 .register => |value_reg| {
3963 log.debug("store: register {} to {}", .{ value_reg, addr_reg });3965 log.debug("store: register {} to {}", .{ value_reg, addr_reg });
3964 try self.genStrRegister(value_reg, addr_reg, value_ty);3966 try self.genStrRegister(value_reg, addr_reg, value_ty);
...@@ -5870,7 +5872,22 @@ fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void {...@@ -5870,7 +5872,22 @@ fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void {
58705872
5871fn airBitCast(self: *Self, inst: Air.Inst.Index) !void {5873fn airBitCast(self: *Self, inst: Air.Inst.Index) !void {
5872 const ty_op = self.air.instructions.items(.data)[inst].ty_op;5874 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
5873 const result = try self.resolveInst(ty_op.operand);5875 const result = if (self.liveness.isUnused(inst)) .dead else result: {
5876 const operand = try self.resolveInst(ty_op.operand);
5877 if (self.reuseOperand(inst, ty_op.operand, 0, operand)) break :result operand;
5878
5879 const operand_lock = switch (operand) {
5880 .register => |reg| self.register_manager.lockReg(reg),
5881 .register_with_overflow => |rwo| self.register_manager.lockReg(rwo.reg),
5882 else => null,
5883 };
5884 defer if (operand_lock) |lock| self.register_manager.unlockReg(lock);
5885
5886 const dest_ty = self.air.typeOfIndex(inst);
5887 const dest = try self.allocRegOrMem(dest_ty, true, inst);
5888 try self.setRegOrMem(dest_ty, dest, operand);
5889 break :result dest;
5890 };
5874 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });5891 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
5875}5892}
58765893