wasm: fix liveness bugs

Make sure to increase the reference count for `intcast` when the
operand doesn't require any casting of the respective WebAssembly type.

Function arguments have a reserved slot, and therefore cannot be
re-used arbitrarily
This commit is contained in:
Luuk de Gram 2023-05-06 17:46:51 +02:00
parent e20976b7f2
commit 67d27dbe63
No known key found for this signature in database
GPG Key ID: A8CFE58E4DC7D664

View File

@ -881,6 +881,9 @@ fn processDeath(func: *CodeGen, ref: Air.Inst.Ref) void {
const value = func.currentBranch().values.getPtr(ref) orelse return;
if (value.* != .local) return;
log.debug("Decreasing reference for ref: %{?d}\n", .{Air.refToIndex(ref)});
if (value.local.value < func.arg_index) {
return; // function arguments can never be re-used
}
value.local.references -= 1; // if this panics, a call to `reuseOperand` was forgotten by the developer
if (value.local.references == 0) {
value.free(func);
@ -4021,7 +4024,13 @@ fn airIntcast(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
return func.fail("todo Wasm intcast for bitsize > 128", .{});
}
const result = try (try func.intcast(operand, operand_ty, ty)).toLocal(func, ty);
const op_bits = toWasmBits(@intCast(u16, ty.bitSize(func.target))).?;
const wanted_bits = toWasmBits(@intCast(u16, ty.bitSize(func.target))).?;
const result = if (op_bits == wanted_bits)
func.reuseOperand(ty_op.operand, operand)
else
try (try func.intcast(operand, operand_ty, ty)).toLocal(func, ty);
func.finishAir(inst, result, &.{});
}