commit 199782edd16ca1fe08cee57ee2219c0a0c385fdc (tree)
parent bf21e4f72528e0cf5bfcbc95172f641b9d5b53e8
Author: Alex Rønne Petersen <alex@alexrp.com>
Date: Sat, 2 Nov 2024 08:59:14 +0100
riscv64: Handle writes to the zero register sensibly in result bookkeeping.
Diffstat:
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig
@@ -1768,8 +1768,15 @@ fn finishAirBookkeeping(func: *Func) void {
fn finishAirResult(func: *Func, inst: Air.Inst.Index, result: MCValue) void {
if (func.liveness.isUnused(inst)) switch (result) {
.none, .dead, .unreach => {},
- else => unreachable, // Why didn't the result die?
+ // Why didn't the result die?
+ .register => |r| if (r != .zero) unreachable,
+ else => unreachable,
} else {
+ switch (result) {
+ .register => |r| if (r == .zero) unreachable, // Why did we discard a used result?
+ else => {},
+ }
+
tracking_log.debug("%{d} => {} (birth)", .{ inst, result });
func.inst_tracking.putAssumeCapacityNoClobber(inst, InstTracking.init(result));
// In some cases, an operand may be reused as the result.