|
@@ -16,7 +16,7 @@ copyof(Ref r, Ref *cp)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
static void
|
|
|
-update(Ref r, Ref rcp, Ref *cp, RList **w)
|
|
|
|
|
|
|
+update(Ref r, Ref rcp, Ref *cp, RList ***pw)
|
|
|
{
|
|
{
|
|
|
RList *l;
|
|
RList *l;
|
|
|
|
|
|
|
@@ -24,13 +24,14 @@ update(Ref r, Ref rcp, Ref *cp, RList **w)
|
|
|
cp[r.val] = rcp;
|
|
cp[r.val] = rcp;
|
|
|
l = emalloc(sizeof *l);
|
|
l = emalloc(sizeof *l);
|
|
|
l->t = r.val;
|
|
l->t = r.val;
|
|
|
- l->l = *w;
|
|
|
|
|
- *w = l;
|
|
|
|
|
|
|
+ l->l = 0;
|
|
|
|
|
+ **pw = l;
|
|
|
|
|
+ *pw = &l->l;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
static void
|
|
|
-visitphi(Phi *p, Ref *cp, RList **w)
|
|
|
|
|
|
|
+visitphi(Phi *p, Ref *cp, RList ***pw)
|
|
|
{
|
|
{
|
|
|
uint a;
|
|
uint a;
|
|
|
Ref r, r1;
|
|
Ref r, r1;
|
|
@@ -47,20 +48,20 @@ visitphi(Phi *p, Ref *cp, RList **w)
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- update(p->to, r, cp, w);
|
|
|
|
|
|
|
+ update(p->to, r, cp, pw);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
static void
|
|
|
-visitins(Ins *i, Ref *cp, RList **w)
|
|
|
|
|
|
|
+visitins(Ins *i, Ref *cp, RList ***pw)
|
|
|
{
|
|
{
|
|
|
Ref r;
|
|
Ref r;
|
|
|
|
|
|
|
|
if (i->op == Ocopy) {
|
|
if (i->op == Ocopy) {
|
|
|
r = copyof(i->arg[0], cp);
|
|
r = copyof(i->arg[0], cp);
|
|
|
- update(i->to, r, cp, w);
|
|
|
|
|
|
|
+ update(i->to, r, cp, pw);
|
|
|
} else if (!req(i->to, R)) {
|
|
} else if (!req(i->to, R)) {
|
|
|
assert(rtype(i->to) == RTmp);
|
|
assert(rtype(i->to) == RTmp);
|
|
|
- update(i->to, i->to, cp, w);
|
|
|
|
|
|
|
+ update(i->to, i->to, cp, pw);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -76,7 +77,7 @@ copy(Fn *fn)
|
|
|
{
|
|
{
|
|
|
Blk *b;
|
|
Blk *b;
|
|
|
Ref *cp, r;
|
|
Ref *cp, r;
|
|
|
- RList *w, *w1;
|
|
|
|
|
|
|
+ RList *w, *w1, **pw;
|
|
|
Use *u, *u1;
|
|
Use *u, *u1;
|
|
|
Ins *i;
|
|
Ins *i;
|
|
|
Phi *p, **pp;
|
|
Phi *p, **pp;
|
|
@@ -84,32 +85,33 @@ copy(Fn *fn)
|
|
|
int t;
|
|
int t;
|
|
|
|
|
|
|
|
w = 0;
|
|
w = 0;
|
|
|
|
|
+ pw = &w;
|
|
|
cp = emalloc(fn->ntmp * sizeof cp[0]);
|
|
cp = emalloc(fn->ntmp * sizeof cp[0]);
|
|
|
for (b=fn->start; b; b=b->link) {
|
|
for (b=fn->start; b; b=b->link) {
|
|
|
for (p=b->phi; p; p=p->link)
|
|
for (p=b->phi; p; p=p->link)
|
|
|
- visitphi(p, cp, &w);
|
|
|
|
|
|
|
+ visitphi(p, cp, &pw);
|
|
|
for (i=b->ins; i-b->ins < b->nins; i++)
|
|
for (i=b->ins; i-b->ins < b->nins; i++)
|
|
|
- visitins(i, cp, &w);
|
|
|
|
|
|
|
+ visitins(i, cp, &pw);
|
|
|
}
|
|
}
|
|
|
while ((w1=w)) {
|
|
while ((w1=w)) {
|
|
|
t = w->t;
|
|
t = w->t;
|
|
|
- w = w->l;
|
|
|
|
|
- free(w1);
|
|
|
|
|
u = fn->tmp[t].use;
|
|
u = fn->tmp[t].use;
|
|
|
u1 = u + fn->tmp[t].nuse;
|
|
u1 = u + fn->tmp[t].nuse;
|
|
|
for (; u<u1; u++)
|
|
for (; u<u1; u++)
|
|
|
switch (u->type) {
|
|
switch (u->type) {
|
|
|
case UPhi:
|
|
case UPhi:
|
|
|
- visitphi(u->u.phi, cp, &w);
|
|
|
|
|
|
|
+ visitphi(u->u.phi, cp, &pw);
|
|
|
break;
|
|
break;
|
|
|
case UIns:
|
|
case UIns:
|
|
|
- visitins(u->u.ins, cp, &w);
|
|
|
|
|
|
|
+ visitins(u->u.ins, cp, &pw);
|
|
|
break;
|
|
break;
|
|
|
case UJmp:
|
|
case UJmp:
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
|
die("invalid use %d", u->type);
|
|
die("invalid use %d", u->type);
|
|
|
}
|
|
}
|
|
|
|
|
+ w = w->l;
|
|
|
|
|
+ free(w1);
|
|
|
}
|
|
}
|
|
|
for (b=fn->start; b; b=b->link) {
|
|
for (b=fn->start; b; b=b->link) {
|
|
|
for (pp=&b->phi; (p=*pp);) {
|
|
for (pp=&b->phi; (p=*pp);) {
|