authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-02-20 12:13:14+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-02-20 12:13:14+01:00
log528c43233f0f566930efc7fc53c4f001dea4dfda
treedb8883272f2d12bc6c6e5a88d41b28ddb1e01670
parent59a9373c71854ff79b22d3ea154cc3e06c130cc1

arm: alloc new mcv in bitcast if cannot reuse operand


3 files changed, 23 insertions(+), 2 deletions(-)

src/arch/arm/CodeGen.zig+21-2
......@@ -2765,7 +2765,9 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
27652765
27662766 switch (value) {
27672767 .dead => unreachable,
2768 .undef => unreachable,
2768 .undef => {
2769 try self.genSetReg(value_ty, addr_reg, value);
2770 },
27692771 .register => |value_reg| {
27702772 try self.genStrRegister(value_reg, addr_reg, value_ty);
27712773 },
......@@ -5816,7 +5818,24 @@ fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void {
58165818
58175819fn airBitCast(self: *Self, inst: Air.Inst.Index) !void {
58185820 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
5819 const result = try self.resolveInst(ty_op.operand);
5821 const result = if (self.liveness.isUnused(inst)) .dead else result: {
5822 const operand = try self.resolveInst(ty_op.operand);
5823 if (self.reuseOperand(inst, ty_op.operand, 0, operand)) break :result operand;
5824
5825 const operand_lock = switch (operand) {
5826 .register,
5827 .register_c_flag,
5828 .register_v_flag,
5829 => |reg| self.register_manager.lockReg(reg),
5830 else => null,
5831 };
5832 defer if (operand_lock) |lock| self.register_manager.unlockReg(lock);
5833
5834 const dest_ty = self.air.typeOfIndex(inst);
5835 const dest = try self.allocRegOrMem(dest_ty, true, inst);
5836 try self.setRegOrMem(dest_ty, dest, operand);
5837 break :result dest;
5838 };
58205839 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
58215840}
58225841
test/behavior/const_slice_child.zig+1
......@@ -9,6 +9,7 @@ var argv: [*]const [*]const u8 = undefined;
99test "const slice child" {
1010 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1111 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1213 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1314
1415 const strs = [_][*]const u8{ "one", "two", "three" };
test/behavior/eval.zig+1
......@@ -1338,6 +1338,7 @@ test "lazy sizeof is resolved in division" {
13381338
13391339test "lazy value is resolved as slice operand" {
13401340 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1341 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13411342 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13421343
13431344 const A = struct { a: u32 };