authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-02 08:59:14+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-05-12 17:07:49+02:00
logd4ca9804f8a546c45451a58c8bde20bc2299d4a6
tree886d117850b64b74b63c21ff2343f8dc8bcc9c78
parent61ae9a2f4547ec2fd0024e79addfa2d38b4c1239
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

riscv64: Handle writes to the zero register sensibly in result bookkeeping.


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

src/arch/riscv64/CodeGen.zig+8-1
......@@ -1769,8 +1769,15 @@ fn finishAirBookkeeping(func: *Func) void {
17691769fn finishAirResult(func: *Func, inst: Air.Inst.Index, result: MCValue) void {
17701770 if (func.liveness.isUnused(inst)) switch (result) {
17711771 .none, .dead, .unreach => {},
1772 else => unreachable, // Why didn't the result die?
1772 // Why didn't the result die?
1773 .register => |r| if (r != .zero) unreachable,
1774 else => unreachable,
17731775 } else {
1776 switch (result) {
1777 .register => |r| if (r == .zero) unreachable, // Why did we discard a used result?
1778 else => {},
1779 }
1780
17741781 tracking_log.debug("%{d} => {} (birth)", .{ inst, result });
17751782 func.inst_tracking.putAssumeCapacityNoClobber(inst, InstTracking.init(result));
17761783 // In some cases, an operand may be reused as the result.