aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-24 22:19:14 +0200
committerlemon <lsof@mailbox.org>2023-06-24 22:19:14 +0200
commit02d7b9d8c67b12f2e105ee56399a1fc633bcbe0f (patch)
treec7ed9c437f807740fc532cb229120d0d3155b80e
parent19bbdfa3c7ae05f4694ce5e434d9855c6f2c3682 (diff)
fix replcuses
-rw-r--r--intrin.c4
-rw-r--r--ir.c33
-rw-r--r--optmem.c1
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)
{