diff options
| -rw-r--r-- | ir/abi0.c | 9 | ||||
| -rw-r--r-- | ir/cfg.c | 9 |
2 files changed, 14 insertions, 4 deletions
@@ -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); } } @@ -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) { |