commit a3a1fc0c8025117139d5e8e6ba4c88ecbe978981
parent d3f1cd94833b33c2817312dfd67100693987083f
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date: Wed, 11 Nov 2015 21:21:54 -0500
move usage computation in filluse()
Diffstat:
4 files changed, 54 insertions(+), 14 deletions(-)
diff --git a/lisc/lisc.h b/lisc/lisc.h
@@ -357,6 +357,7 @@ void parse(FILE *, void (Dat *), void (Fn *));
void printfn(Fn *, FILE *);
/* ssa.c */
+void filluse(Fn *);
void fillpreds(Fn *);
void fillrpo(Fn *);
void ssa(Fn *);
diff --git a/lisc/main.c b/lisc/main.c
@@ -49,8 +49,9 @@ func(Fn *fn)
}
fillrpo(fn);
fillpreds(fn);
+ filluse(fn);
ssa(fn);
-#if 0
+ filluse(fn);
isel(fn);
filllive(fn);
fillcost(fn);
@@ -69,7 +70,6 @@ func(Fn *fn)
printf("/* end function %s */\n\n", fn->name);
} else
fprintf(stderr, "\n");
-#endif
freeall();
}
diff --git a/lisc/parse.c b/lisc/parse.c
@@ -299,18 +299,15 @@ expect(int t)
}
static Ref
-tmpref(char *v, int use)
+tmpref(char *v)
{
int t;
for (t=Tmp0; t<ntmp; t++)
if (strcmp(v, tmp[t].name) == 0)
- goto Found;
+ return TMP(t);
vgrow(&tmp, ++ntmp);
strcpy(tmp[t].name, v);
-Found:
- tmp[t].ndef += !use;
- tmp[t].nuse += use;
return TMP(t);
}
@@ -322,7 +319,7 @@ parseref()
switch (next()) {
case TTmp:
- return tmpref(tokval.str, 1);
+ return tmpref(tokval.str);
case TNum:
c = (Con){.type = CNum, .val = tokval.num};
strcpy(c.label, "");
@@ -509,7 +506,7 @@ parseline(PState ps)
closeblk();
return PLbl;
}
- r = tmpref(tokval.str, 0);
+ r = tmpref(tokval.str);
expect(TEq);
w = parsecls(&ty);
op = next();
@@ -547,10 +544,6 @@ DoOp:
arg[i] = parseref();
if (req(arg[i], R))
err("invalid instruction argument");
- if (op == -1)
- if (rtype(arg[i]) == RTmp)
- if (!tmp[arg[i].val].phi)
- tmp[arg[i].val].phi = r.val;
i++;
t = peek();
if (t == TNL)
@@ -572,7 +565,6 @@ DoOp:
curi++;
return PIns;
} else {
- tmp[r.val].phi = r.val;
phi = alloc(sizeof *phi);
phi->to = r;
phi->wide = w;
diff --git a/lisc/ssa.c b/lisc/ssa.c
@@ -1,5 +1,52 @@
#include "lisc.h"
+/* fill usage and phi information
+ */
+void
+filluse(Fn *fn)
+{
+ Blk *b;
+ Phi *p;
+ Ins *i;
+ int t;
+ uint a;
+ Tmp *tmp;
+
+ /* todo, is this the correct file? */
+ tmp = fn->tmp;
+ for (t=0; t<fn->ntmp; t++) {
+ tmp[t].ndef = 0;
+ tmp[t].nuse = 0;
+ tmp[t].phi = 0;
+ }
+ for (b=fn->start; b; b=b->link) {
+ for (p=b->phi; p; p=p->link) {
+ assert(rtype(p->to) == RTmp);
+ tmp[p->to.val].ndef++;
+ tmp[p->to.val].phi = p->to.val;
+ for (a=0; a<p->narg; a++)
+ if (rtype(p->arg[a]) == RTmp) {
+ t = p->arg[a].val;
+ tmp[t].nuse++;
+ if (!tmp[t].phi)
+ tmp[t].phi = p->to.val;
+ }
+ }
+ for (i=b->ins; i!=&b->ins[b->nins]; i++) {
+ if (!req(i->to, R)) {
+ assert(rtype(i->to) == RTmp);
+ tmp[i->to.val].ndef++;
+ }
+ if (rtype(i->arg[0]) == RTmp)
+ tmp[i->arg[0].val].nuse++;
+ if (rtype(i->arg[1]) == RTmp)
+ tmp[i->arg[1].val].nuse++;
+ }
+ if (rtype(b->jmp.arg) == RTmp)
+ tmp[b->jmp.arg.val].nuse++;
+ }
+}
+
static void
addpred(Blk *bp, Blk *bc)
{