authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-18 20:47:00-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-18 21:02:29-04:00
log47405b1a1c29b8a907997af18291eb6eb1cf3e02
tree8a9b71f779eb94d6de3ef324d23bc82f5c4d9c2d
parent79bdd2bd633d4817da07e20026756698514d5d7e

x86_64: fix `@bitCast` when the operand dies


1 files changed, 12 insertions(+), 8 deletions(-)

src/arch/x86_64/CodeGen.zig+12-8
......@@ -10154,18 +10154,22 @@ fn airBitCast(self: *Self, inst: Air.Inst.Index) !void {
1015410154 const dst_rc = regClassForType(dst_ty);
1015510155 const src_rc = regClassForType(src_ty);
1015610156 const src_mcv = try self.resolveInst(ty_op.operand);
10157 if (dst_rc.supersetOf(src_rc) and self.reuseOperand(inst, ty_op.operand, 0, src_mcv))
10158 break :result src_mcv;
1015910157
1016010158 const src_lock = if (src_mcv.getReg()) |reg| self.register_manager.lockReg(reg) else null;
1016110159 defer if (src_lock) |lock| self.register_manager.unlockReg(lock);
1016210160
10163 const dst_mcv = try self.allocRegOrMem(inst, true);
10164 try self.genCopy(
10165 if (!dst_mcv.isMemory() or src_mcv.isMemory()) dst_ty else src_ty,
10166 dst_mcv,
10167 src_mcv,
10168 );
10161 const dst_mcv = if (dst_rc.supersetOf(src_rc) and
10162 self.reuseOperand(inst, ty_op.operand, 0, src_mcv))
10163 src_mcv
10164 else dst: {
10165 const dst_mcv = try self.allocRegOrMem(inst, true);
10166 try self.genCopy(
10167 if (!dst_mcv.isMemory() or src_mcv.isMemory()) dst_ty else src_ty,
10168 dst_mcv,
10169 src_mcv,
10170 );
10171 break :dst dst_mcv;
10172 };
1016910173
1017010174 const dst_signedness =
1017110175 if (dst_ty.isAbiInt()) dst_ty.intInfo(self.target.*).signedness else .unsigned;