aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-01-04 14:28:42 +0100
committerlemon <lsof@mailbox.org>2026-01-04 14:28:42 +0100
commit65d56cb113ebf09664bbade47b1c4c2e960ba336 (patch)
treed72259647097bcaea0915a57f6433eb0d9d48a7b /ir
parentb826bf418330b9b13a26195ee541e9e7fd9e77ac (diff)
ir bugfixes
Diffstat (limited to 'ir')
-rw-r--r--ir/abi0.c9
-rw-r--r--ir/cfg.c9
2 files changed, 14 insertions, 4 deletions
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) {