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-14 05:43:13+02:00
log199782edd16ca1fe08cee57ee2219c0a0c385fdc
tree69768f229befa63df7ec3c2a15fa343e09d1e9b4
parentbf21e4f72528e0cf5bfcbc95172f641b9d5b53e8
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
...@@ -1768,8 +1768,15 @@ fn finishAirBookkeeping(func: *Func) void {...@@ -1768,8 +1768,15 @@ fn finishAirBookkeeping(func: *Func) void {
1768fn finishAirResult(func: *Func, inst: Air.Inst.Index, result: MCValue) void {1768fn finishAirResult(func: *Func, inst: Air.Inst.Index, result: MCValue) void {
1769 if (func.liveness.isUnused(inst)) switch (result) {1769 if (func.liveness.isUnused(inst)) switch (result) {
1770 .none, .dead, .unreach => {},1770 .none, .dead, .unreach => {},
1771 else => unreachable, // Why didn't the result die?1771 // Why didn't the result die?
1772 .register => |r| if (r != .zero) unreachable,
1773 else => unreachable,
1772 } else {1774 } else {
1775 switch (result) {
1776 .register => |r| if (r == .zero) unreachable, // Why did we discard a used result?
1777 else => {},
1778 }
1779
1773 tracking_log.debug("%{d} => {} (birth)", .{ inst, result });1780 tracking_log.debug("%{d} => {} (birth)", .{ inst, result });
1774 func.inst_tracking.putAssumeCapacityNoClobber(inst, InstTracking.init(result));1781 func.inst_tracking.putAssumeCapacityNoClobber(inst, InstTracking.init(result));
1775 // In some cases, an operand may be reused as the result.1782 // In some cases, an operand may be reused as the result.