From 67d27dbe631d1292be363f4121217d66e2d7fd0f Mon Sep 17 00:00:00 2001 From: Luuk de Gram Date: Sat, 6 May 2023 17:46:51 +0200 Subject: [PATCH] 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 --- src/arch/wasm/CodeGen.zig | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index 799c4a40a2e983d7ceccefd84e0549ff5730a4ed..c2d2ffd8e40cdb9fe7c36818415c1655a0a4b58d 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -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, &.{}); } -- 2.54.0