diff options
Diffstat (limited to 'live.c')
-rw-r--r-- | live.c | 52 |
1 files changed, 6 insertions, 46 deletions
diff --git a/live.c b/live.c index 6e63705..4198995 100644 --- a/live.c +++ b/live.c @@ -19,46 +19,13 @@ liveon(BSet *v, Blk *b, Blk *s) } } -static int -phitmp(int t, Tmp *tmp) -{ - int tp; - - tp = tmp[t].phi; - return tp ? tp : t; -} - -static void -phifix(int t1, int *phi, Tmp *tmp) -{ - int t, t2; - - /* detect temporaries arguments - * of the same phi node that - * interfere and separate them - */ - t = phitmp(t1, tmp); - t2 = phi[t]; - if (t2 && t2 != t1) { - if (t != t1) { - tmp[t1].phi = t1; - t = t1; - } else { - tmp[t2].phi = t2; - phi[t2] = t2; - } - } - phi[t] = t1; -} - static void -bset(Ref r, Blk *b, int *nlv, int *phi, Tmp *tmp) +bset(Ref r, Blk *b, int *nlv, Tmp *tmp) { if (rtype(r) != RTmp) return; bsset(b->gen, r.val); - phifix(r.val, phi, tmp); if (!bshas(b->in, r.val)) { nlv[KBASE(tmp[r.val].cls)]++; bsset(b->in, r.val); @@ -74,13 +41,11 @@ filllive(Fn *f) Blk *b; Ins *i; int k, t, m[2], n, chg, nlv[2]; - int *phi; BSet u[1], v[1]; Mem *ma; bsinit(u, f->ntmp); bsinit(v, f->ntmp); - phi = emalloc(f->ntmp * sizeof phi[0]); for (b=f->start; b; b=b->link) { bsinit(b->in, f->ntmp); bsinit(b->out, f->ntmp); @@ -102,21 +67,18 @@ Again: } chg |= !bsequal(b->out, u); - memset(phi, 0, f->ntmp * sizeof phi[0]); memset(nlv, 0, sizeof nlv); b->out->t[0] |= T.rglob; bscopy(b->in, b->out); - for (t=0; bsiter(b->in, &t); t++) { - phifix(t, phi, f->tmp); + for (t=0; bsiter(b->in, &t); t++) nlv[KBASE(f->tmp[t].cls)]++; - } if (rtype(b->jmp.arg) == RCall) { assert((int)bscount(b->in) == T.nrglob && nlv[0] == T.nrglob && nlv[1] == 0); b->in->t[0] |= T.retregs(b->jmp.arg, nlv); } else - bset(b->jmp.arg, b, nlv, phi, f->tmp); + bset(b->jmp.arg, b, nlv, f->tmp); for (k=0; k<2; k++) b->nlive[k] = nlv[k]; for (i=&b->ins[b->nins]; i!=b->ins;) { @@ -145,17 +107,16 @@ Again: nlv[KBASE(f->tmp[t].cls)]--; bsset(b->gen, t); bsclr(b->in, t); - phi[phitmp(t, f->tmp)] = 0; } for (k=0; k<2; k++) switch (rtype(i->arg[k])) { case RMem: ma = &f->mem[i->arg[k].val]; - bset(ma->base, b, nlv, phi, f->tmp); - bset(ma->index, b, nlv, phi, f->tmp); + bset(ma->base, b, nlv, f->tmp); + bset(ma->index, b, nlv, f->tmp); break; default: - bset(i->arg[k], b, nlv, phi, f->tmp); + bset(i->arg[k], b, nlv, f->tmp); break; } for (k=0; k<2; k++) @@ -167,7 +128,6 @@ Again: chg = 0; goto Again; } - free(phi); if (debug['L']) { fprintf(stderr, "\n> Liveness analysis:\n"); |