From 02d7b9d8c67b12f2e105ee56399a1fc633bcbe0f Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 24 Jun 2023 22:19:14 +0200 Subject: fix replcuses --- intrin.c | 4 ++-- ir.c | 33 ++++++++++++++++----------------- optmem.c | 1 + 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/intrin.c b/intrin.c index 6a3bc7f..70928d4 100644 --- a/intrin.c +++ b/intrin.c @@ -34,8 +34,8 @@ intrin(struct block *blk, int *curi, enum intrin in, struct arg *args, int narg, for (int off = 0; off < td->siz; off += step) { union ref psrc = *args[1].arg, pdst = *args[0].arg, src; if (off) { - pdst = mkaddr((struct addr) {.base = *args[0].arg, .disp = off}); - psrc = mkaddr((struct addr) {.base = *args[1].arg, .disp = off}); + pdst = insertinstr(blk, ++*curi, mkinstr(Oadd, KPTR, *args[0].arg, mkref(RICON, off))); + psrc = insertinstr(blk, ++*curi, mkinstr(Oadd, KPTR, *args[1].arg, mkref(RICON, off))); } src = insertinstr(blk, ++*curi, mkinstr(Oloads1 + 2*ilog2(step), step < 8 ? KI4 : KI8, psrc)); insertinstr(blk, ++*curi, mkinstr(Ostore1 + ilog2(step), 0, pdst, src)); diff --git a/ir.c b/ir.c index b39cae3..4ed798e 100644 --- a/ir.c +++ b/ir.c @@ -376,30 +376,29 @@ insertphi(struct block *blk, enum irclass cls) void replcuses(union ref from, union ref to) { - struct use *use, *uend; - assert(from.t == RTMP); - uend = (use = instruse[from.i]) + instrnuse[from.i]; - for (; use < uend; ++use) { + for (int i = 0; i < instrnuse[from.i]; ++i) { + struct use use = instruse[from.i][i]; union ref *u; - int n, i; - if (use->u == from.i) continue; - if (use->u == USERJUMP) { - u = &use->blk->jmp.arg[0]; + int n, j; + if (use.u == from.i) continue; + if (use.u == USERJUMP) { + u = &use.blk->jmp.arg[0]; n = 2; - } else if (instrtab[use->u].op == Ophi) { - u = phitab.p[instrtab[use->u].l.i]; - n = use->blk->npred; + } else if (instrtab[use.u].op == Ophi) { + u = phitab.p[instrtab[use.u].l.i]; + n = use.blk->npred; } else { - u = &instrtab[use->u].l; + u = &instrtab[use.u].l; n = 2; } - for (i = 0; i < n; ++i) { - if (u[i].bits == from.bits) { - deluse(use->blk, use->u, u[i]); - u[i].bits = to.bits; - adduse(use->blk, use->u, u[i]); + for (j = 0; j < n; ++j) { + if (u[j].bits == from.bits) { + u[j].bits = to.bits; + adduse(use.blk, use.u, to); + deluse(use.blk, use.u, from); + --i; break; } } diff --git a/optmem.c b/optmem.c index 2e7c7e5..70737ec 100644 --- a/optmem.c +++ b/optmem.c @@ -132,6 +132,7 @@ readvar(struct ssabuilder *sb, int var, enum irclass cls, struct block *blk) return readvarrec(sb, var, cls, blk); } +/* require use, blkid */ void mem2reg(struct function *fn) { -- cgit v1.2.3