From 968f5211d2c64f01c02d416a9ca197b1f43dfc2a Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 24 Oct 2025 13:50:11 +0200 Subject: codegen fixes, propagate terminate --- ir/abi0.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'ir/abi0.c') diff --git a/ir/abi0.c b/ir/abi0.c index 9e30ab7..69ab7f0 100644 --- a/ir/abi0.c +++ b/ir/abi0.c @@ -249,7 +249,7 @@ abi0_call(struct function *fn, struct instr *ins, struct block *blk, int *curi) } for (int i = 0; i < nret; ++i) { struct instr store = {0}; - int iref; + int iref, iuser; /* XXX this can generate unaligned stores */ switch (call->abiret[i].ty.cls) { default: assert(0); @@ -264,13 +264,15 @@ abi0_call(struct function *fn, struct instr *ins, struct block *blk, int *curi) store.l = insertinstr(blk, ++*curi, addr); } store.r = r[i]; - insertinstr(blk, ++*curi, store); + iuser = insertinstr(blk, ++*curi, store).i; + if (i > 0) iuser = store.l.i; iref = retmem.i; if (instrnuse[iref] > 1) { - /* make store the first use */ - struct use tmp = instruse[iref][instrnuse[iref - 1]]; - for (int i = instrnuse[iref] - 1; i > 0; --i) - instruse[iref][i] = instruse[iref][i-1]; + /* make this the first use of that temp */ + int last = instrnuse[iref] - 1; + struct use tmp = instruse[iref][last]; + assert(tmp.blk == blk && tmp.u == iuser); + memmove(&instruse[iref][last], &instruse[iref][0], (sizeof tmp)*(last)); instruse[iref][0] = tmp; } } -- cgit v1.2.3