diff options
| author | 2026-03-25 17:20:20 +0100 | |
|---|---|---|
| committer | 2026-03-25 17:20:20 +0100 | |
| commit | f38a3f2e78bc3fff37ab2107d448865f5b67a4d8 (patch) | |
| tree | cc7ba23af9dc178e2994e7805dd041304a6a7911 | |
| parent | 79d6ac719042371d255ed1cf412e3232d13d1e56 (diff) | |
abi: fix use bug preventing mem2reg optimization of struct return
| -rw-r--r-- | src/ir.c | 8 | ||||
| -rw-r--r-- | src/ir_abi0.c | 1 |
2 files changed, 5 insertions, 4 deletions
@@ -450,8 +450,8 @@ filluses(Function *fn) } for (int i = 0; i < blk->ins.n; ++i) { int ins = blk->ins.p[i]; - adduse(blk, ins, instrtab[ins].l); - adduse(blk, ins, instrtab[ins].r); + for (int i = 0; i < opnoper[instrtab[ins].op]; ++i) + adduse(blk, ins, instrtab[ins].oper[i]); } adduse(blk, USERJUMP, blk->jmp.arg[0]); adduse(blk, USERJUMP, blk->jmp.arg[1]); @@ -466,8 +466,8 @@ newinstr(Block *at, Instr ins) int new = allocinstr(); instrtab[new] = ins; if (at) { - adduse(at, new, ins.l); - adduse(at, new, ins.r); + for (int i = 0; i < opnoper[ins.op]; ++i) + adduse(at, new, ins.oper[i]); } return new; } diff --git a/src/ir_abi0.c b/src/ir_abi0.c index 8722438..dd8bc40 100644 --- a/src/ir_abi0.c +++ b/src/ir_abi0.c @@ -428,6 +428,7 @@ abi0(Function *fn) if (isagg(fn->retty) && blk->jmp.t == Jret && blk->jmp.arg[0].bits) { assert(!blk->jmp.arg[1].bits); if (fn->nabiret) { /* aggregate return in register(s) */ + deluse(blk, USERJUMP, blk->jmp.arg[0]); Ref r[2]; int curi = blk->ins.n; load2regs(r, mkirtype(fn->retty), blk->jmp.arg[0], fn->nabiret, fn->abiret, r2off, blk, &curi); |