aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland Paterson-Jones <[email protected]>2024-11-20 16:05:51 +0200
committerQuentin Carbonneaux <[email protected]>2025-03-14 13:07:40 +0100
commit1cb255cb045d1e531d5e7e6961ac90bb6f7a0474 (patch)
tree148e1199407ff41a88d4b60944258edac83c84f0
parentc2ff93e75e5f6df8e1679120b18f0d5884deab2b (diff)
Get rid of movins() infra.
-rw-r--r--Makefile3
-rw-r--r--all.h24
-rw-r--r--gcm.c22
-rw-r--r--ins.c195
-rw-r--r--reassoc.c101
-rw-r--r--util.c18
6 files changed, 22 insertions, 341 deletions
diff --git a/Makefile b/Makefile
index 85783be..ca27b35 100644
--- a/Makefile
+++ b/Makefile
@@ -5,8 +5,7 @@ PREFIX = /usr/local
BINDIR = $(PREFIX)/bin
COMMOBJ = main.o util.o parse.o abi.o cfg.o mem.o ssa.o alias.o load.o \
- copy.o fold.o gvn.o gcm.o ins.o simpl.o live.o \
- spill.o rega.o emit.o
+ copy.o fold.o gvn.o gcm.o simpl.o live.o spill.o rega.o emit.o
AMD64OBJ = amd64/targ.o amd64/sysv.o amd64/isel.o amd64/emit.o
ARM64OBJ = arm64/targ.o arm64/abi.o arm64/isel.o arm64/emit.o
RV64OBJ = rv64/targ.o rv64/abi.o rv64/isel.o rv64/emit.o
diff --git a/all.h b/all.h
index ceb7520..6da6330 100644
--- a/all.h
+++ b/all.h
@@ -355,8 +355,6 @@ struct Tmp {
} width;
int visit;
uint gcmbid;
- uint gcminsn; // TODO get rid
- uint gcmdefinsn; // TODO get rid
};
struct Con {
@@ -463,20 +461,6 @@ struct Dat {
char isstr;
};
-typedef struct InsLoc InsLoc;
-
-struct InsLoc {
- uint bid;
- uint insn;
-};
-
-typedef struct InsMov InsMov;
-
-struct InsMov {
- InsLoc from;
- InsLoc to;
-};
-
/* main.c */
extern Target T;
extern char debug['Z'+1];
@@ -497,6 +481,8 @@ void freeall(void);
void *vnew(ulong, size_t, Pool);
void vfree(void *);
void vgrow(void *, ulong);
+void addins(Ins **, uint *, Ins *);
+void addbins(Blk *, Ins **, uint *);
void strf(char[NString], char *, ...);
uint32_t intern(char *);
char *str(uint32_t);
@@ -616,12 +602,6 @@ void gvn(Fn *);
int isfixed(Fn *, Ins *);
void gcm(Fn *);
-/* ins.c */
-void addins(Ins **, uint *, Ins *);
-void addbins(Blk *, Ins **, uint *);
-void nopunused(Fn *);
-void movins(Fn *, InsMov *, uint, int);
-
/* reassoc.c */
void reassoc(Fn *);
diff --git a/gcm.c b/gcm.c
index 515d41f..23e475b 100644
--- a/gcm.c
+++ b/gcm.c
@@ -452,7 +452,6 @@ cleartmps(Fn *fn)
for (t=&fn->tmp[Tmp0]; t < &fn->tmp[fn->ntmp]; t++) {
t->visit = 0;
t->gcmbid = NOBID;
- t->gcminsn = -1u; // TODO - get rid
}
}
@@ -465,9 +464,6 @@ gcm(Fn *fn)
{
uint bid;
- /* fprintf(stderr, "\n\nBefore gcm:\n\n"); */
- /* printfn(fn, stderr); */
-
filldomdpth(fn);
fillloop(fn);
@@ -477,29 +473,13 @@ gcm(Fn *fn)
for (bid=0; bid<fn->nblk; bid++)
lateblk(fn, bid);
- /* fprintf(stderr, "\n\nBefore gcmmove/fixub4d:\n\n"); */
- /* printfn(fn, stderr); */
-
gcmmove(fn);
- cleartmps(fn);
- /* filluse(fn); */
- /* fixub4d(fn); */
-
- /* fprintf(stderr, "\n\nAfter gcmmove/fixub4d:\n\n"); */
- /* printfn(fn, stderr); */
-
- //fillcfg(fn);
+ cleartmps(fn); /* filluse() uses visit */
filluse(fn);
reassoc(fn);
-
- /* cleartmps(fn); */
filluse(fn);
fixub4d(fn);
- /* delete (now) unused ins - already done later??? */
- filluse(fn);
- nopunused(fn);
-
if (debug['G']) {
fprintf(stderr, "\n> After GCM:\n");
printfn(fn, stderr);
diff --git a/ins.c b/ins.c
deleted file mode 100644
index 1935a95..0000000
--- a/ins.c
+++ /dev/null
@@ -1,195 +0,0 @@
-#include "all.h"
-
-void
-addins(Ins **pvins, uint *pnins, Ins *i)
-{
- if (i->op == Onop)
- return;
- vgrow(pvins, ++(*pnins));
- (*pvins)[(*pnins)-1] = *i;
-}
-
-void
-addbins(Blk *b, Ins **pvins, uint *pnins)
-{
- Ins *i;
-
- for (i = b->ins; i < &b->ins[b->nins]; i++)
- addins(pvins, pnins, i);
-}
-
-static int
-unusedins(Fn *fn, Ins *i);
-
-static int
-unusedtmp(Fn *fn, Tmp *t)
-{
- if (t->nuse == 0)
- return 1;
- if (t->nuse == 1)
- if (t->use[0].type == UIns)
- return unusedins(fn, t->use[0].u.ins);
- return 0;
-}
-
-static int
-unusedtmpref(Fn *fn, Ref r)
-{
- if (rtype(r) != RTmp)
- return 0;
- return unusedtmp(fn, &fn->tmp[r.val]);
-}
-
-static int
-unusedins(Fn *fn, Ins *i)
-{
- if (!INRANGE(i->op, Opar, Ocall))
- if (unusedtmpref(fn, i->to))
- return 1;
- return 0;
-}
-
-/* replace unused ins with nop */
-/* needs use; breaks use */
-void
-nopunused(Fn *fn)
-{
- Blk *b;
- Ins *i;
-
- for (b = fn->start; b; b = b->link)
- for (i = b->ins; i < &b->ins[b->nins]; i++)
- if (unusedins(fn, i))
- *i = (Ins){.op = Onop};
-}
-
-typedef struct FromLoc FromLoc;
-struct FromLoc {
- InsLoc from;
- uint ton;
-};
-
-static int
-loccmp(InsLoc *la, InsLoc *lb)
-{
- if (la->bid != lb->bid)
- return (int)la->bid - (int)lb->bid;
- return la->insn - lb->insn;
-}
-
-static int
-tocmp(const void *a, const void *b)
-{
- InsMov *ma, *mb;
-
- ma = (InsMov*)a;
- mb = (InsMov*)b;
- return loccmp(&ma->to, &mb->to);
-}
-
-static int
-fromcmp(const void *a, const void *b)
-{
- FromLoc *fa, *fb;
-
- fa = (FromLoc*)a;
- fb = (FromLoc*)b;
- return loccmp(&fa->from, &fb->from);
-}
-
-static int
-loceq(InsLoc *a, InsLoc *b)
-{
- return a->bid == b->bid && a->insn == b->insn;
-}
-
-/* after, mov is sorted by to, and to.insn, from.insn are updated */
-void
-movins(Fn *fn, InsMov *mov, uint nmov, int del)
-{
- Blk *b, *b2;
- uint bid, n, fromn, ton, ifromn, nins;
- FromLoc *from;
- uint *newbnins;
- Ins **newbins, *vins;
-
- qsort(mov, nmov, sizeof mov[0], tocmp);
-
- from = emalloc(nmov * sizeof from[0]);
- for (n = 0; n < nmov; n++) {
- from[n].from = mov[n].from;
- from[n].ton = n;
- }
- qsort(from, nmov, sizeof from[0], fromcmp);
-
- nins = 0;
- vins = vnew(nins, sizeof vins[0], PFn);
-
- newbnins = emalloc(fn->nblk * sizeof newbnins[0]);
- newbins = emalloc(fn->nblk * sizeof newbins[0]);
-
- /* populate new ins buffers */
- /* update mov to.insn, from insn */
- fromn = ton = 0;
- for (bid = 0; bid < fn->nblk; bid++) {
- /* no moves to this block */
- if (nmov <= ton || mov[ton].to.bid != bid) {
- while (fromn < nmov && from[fromn].from.bid == bid)
- fromn++;
- continue;
- }
- b = fn->rpo[bid];
- nins = 0;
- for (ifromn = 0; ifromn < b->nins; ifromn++) {
- /* insert new ins, update to */
- while (ton < nmov && loceq(&mov[ton].to, &(InsLoc){.bid = bid, .insn = ifromn})) {
- b2 = fn->rpo[mov[ton].from.bid];
- assert(mov[ton].from.insn < b2->nins);
- addins(&vins, &nins, &b2->ins[mov[ton].from.insn]);
- mov[ton++].to.insn = nins-1;
- }
- /* update from */
- while (fromn < nmov && loceq(&from[fromn].from, &(InsLoc){.bid = bid, .insn = ifromn}))
- from[fromn++].from.insn = nins;
- /* copy original ins */
- addins(&vins, &nins, &b->ins[ifromn]);
- }
- /* append new ins, update to */
- while (ton < nmov && mov[ton].to.bid == bid) {
- assert(mov[ton].to.insn == b->nins);
- b2 = fn->rpo[mov[ton].from.bid];
- assert(mov[ton].from.insn < b2->nins);
- addins(&vins, &nins, &b2->ins[mov[ton].from.insn]);
- mov[ton++].to.insn = nins-1;
- }
- assert(ifromn == b->nins);
- /* idup(&newbins[bid], vins, nins); */
- newbins[bid] = vins;
- vins = vnew(0, sizeof vins[0], PFn);
- newbnins[bid] = nins;
- }
- assert(fromn == nmov);
- assert(ton == nmov);
-
- /* install new b->ins */
- for (bid = 0; bid < fn->nblk; bid++) {
- if (newbnins[bid] == 0)
- continue;
- b = fn->rpo[bid];
- b->ins = newbins[bid];
- b->nins = newbnins[bid];
- }
-
- /* remove from ins, update mov from insn */
- for (fromn = 0; fromn < nmov; fromn++) {
- b = fn->rpo[from[fromn].from.bid];
- assert(from[fromn].from.insn < b->nins);
- if (del)
- b->ins[from[fromn].from.insn] = (Ins){.op = Onop};
- mov[from[fromn].ton].from.insn = from[fromn].from.insn;
- }
-
- free(from);
- free(newbins);
- free(newbnins);
-}
diff --git a/reassoc.c b/reassoc.c
deleted file mode 100644
index 25d88ea..0000000
--- a/reassoc.c
+++ /dev/null
@@ -1,101 +0,0 @@
-#include "all.h"
-
-static void
-ireassoc(Fn *fn, Blk *b, Ins *i, uint *pnim, InsMov **pim)
-{
- Blk *b2;
- Tmp *t;
- Use *u;
- int64_t v;
- int x;
-
- assert(b->ins <= i && i < &b->ins[b->nins]);
- if (!iscmp(i->op, &x, &x))
- if (!iskladdcon(fn, i, &v))
- return;
-
- assert(rtype(i->to) == RTmp);
- t = &fn->tmp[i->to.val];
- for (u = t->use; u < &t->use[t->nuse]; u++) {
- if (u->type == UPhi)
- continue;
- if (u->type == UIns)
- if (INRANGE(u->u.ins->op, Oarg, Ocall))
- continue;
- b2 = fn->rpo[u->bid];
- vgrow(pim, ++(*pnim));
- (*pim)[(*pnim)-1] = (InsMov){
- .from = {.bid = b->id, .insn = i-b->ins},
- .to = {
- .bid = u->bid,
- .insn = u->type == UJmp ? b2->nins : u->u.ins-b2->ins
- }};
- }
-}
-
-static void
-trealloc(Fn *fn, Blk *b, Ins *i)
-{
- Ins *i2;
- Ref r;
-
- assert(b->ins <= i && i < &b->ins[b->nins]);
- r = newtmp("rea", i->cls, fn);
- if (i < &b->ins[b->nins-1]) {
- i2 = i+1;
- /* special case of both args of target instruction reassociated */
- if (!req(i->to, i2->arg[0]) && !req(i->to, i2->arg[1])) {
- assert(i < &b->ins[b->nins-2]);
- i2 = i+2;
- }
- assert(req(i->to, i2->arg[0]) || req(i->to, i2->arg[1]));
- if (req(i->to, i2->arg[0]))
- i2->arg[0] = r;
- if (req(i->to, i2->arg[1]))
- i2->arg[1] = r;
- } else {
- assert(req(i->to, b->jmp.arg));
- b->jmp.arg = r;
- }
- i->to = r;
-}
-
-/* Redistribute trivial ops to point of use. */
-/* Reduces register pressure. */
-/* needs rpo, use; breaks use */
-void
-reassoc(Fn *fn)
-{
- Blk *b;
- Ins *i;
- InsMov *im;
- uint n, nim;
-
- nim = 0;
- im = vnew(nim, sizeof im[0], PHeap);
-
- /* identify trivial ins */
- for (b = fn->start; b; b = b->link) {
- for (i = b->ins; i < &b->ins[b->nins]; i++)
- ireassoc(fn, b, i, &nim, &im);
- }
-
- /* duplicate trivial ins */
- movins(fn, im, nim, 0/*!del*/);
-
- /* create new tmps for dups */
- for (n = 0; n < nim; n++) {
- b = fn->rpo[im[n].to.bid];
- i = &b->ins[im[n].to.insn];
- trealloc(fn, b, i);
- }
-
- /* delete (now) unused ins */
- filluse(fn);
- nopunused(fn);
-
- if (debug['G']) {
- fprintf(stderr, "\n> After Reassociation:\n");
- printfn(fn, stderr);
- }
-}
diff --git a/util.c b/util.c
index ba1f98f..580bc43 100644
--- a/util.c
+++ b/util.c
@@ -155,6 +155,24 @@ vgrow(void *vp, ulong len)
}
void
+addins(Ins **pvins, uint *pnins, Ins *i)
+{
+ if (i->op == Onop)
+ return;
+ vgrow(pvins, ++(*pnins));
+ (*pvins)[(*pnins)-1] = *i;
+}
+
+void
+addbins(Blk *b, Ins **pvins, uint *pnins)
+{
+ Ins *i;
+
+ for (i = b->ins; i < &b->ins[b->nins]; i++)
+ addins(pvins, pnins, i);
+}
+
+void
strf(char str[NString], char *s, ...)
{
va_list ap;