From 65d56cb113ebf09664bbade47b1c4c2e960ba336 Mon Sep 17 00:00:00 2001 From: lemon Date: Sun, 4 Jan 2026 14:28:42 +0100 Subject: ir bugfixes --- ir/abi0.c | 9 +++++++-- ir/cfg.c | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) (limited to 'ir') diff --git a/ir/abi0.c b/ir/abi0.c index d688e03..a3687d9 100644 --- a/ir/abi0.c +++ b/ir/abi0.c @@ -425,8 +425,10 @@ abi0(struct function *fn) union ref r[2]; int curi = blk->ins.n; load2regs(r, mkirtype(fn->retty), blk->jmp.arg[0], fn->nabiret, fn->abiret, r2off, blk, &curi); - for (int i = 0; i < fn->nabiret; ++i) + for (int i = 0; i < fn->nabiret; ++i) { blk->jmp.arg[i] = r[i]; + adduse(blk, USERJUMP, r[i]); + } } else { /* aggregate return (arg[0] is pointer to return value) */ if (rvovar == -1) { @@ -436,7 +438,10 @@ abi0(struct function *fn) insertinstr(blk, blk->ins.n, mkarginstr(typ, blk->jmp.arg[0])); insertinstr(blk, blk->ins.n, mkintrin(INstructcopy, 0, 2)); } else assert(blk->jmp.arg[0].bits == mkref(RTMP, rvovar).bits); - if (fn->abiret[0].ty.cls) blk->jmp.arg[0] = rvovar == -1 ? sret : mkref(RTMP, rvovar); + if (fn->abiret[0].ty.cls) { + blk->jmp.arg[0] = rvovar == -1 ? sret : mkref(RTMP, rvovar); + adduse(blk, USERJUMP, blk->jmp.arg[0]); + } else memset(blk->jmp.arg, 0, sizeof blk->jmp.arg); } } diff --git a/ir/cfg.c b/ir/cfg.c index 671722d..58e1625 100644 --- a/ir/cfg.c +++ b/ir/cfg.c @@ -68,8 +68,13 @@ filldom(struct function *fn) changed = 0; blk = fn->entry->lnext; do { - struct block *new = blkpred(blk, 0); - for (int i = 1; i < blk->npred; ++i) { + int j; + struct block *new = NULL; + for (j = 0; j < blk->npred; ++j) + if ((new = blkpred(blk, j))->id < blk->id) break; + assert(new); + for (int i = 0; i < blk->npred; ++i) { + if (i == j) continue; struct block *p = blkpred(blk, i); if (p->idom) { /* new = intersect(p, new) */ while (p != new) { -- cgit v1.2.3