ref: 0c7b32834178eabf37aed972ae393d006d5fd905
parent: 512c73322d9ac6e3a6eb580e9ac0bc90b5ecc682
author: Ori Bernstein <[email protected]>
date: Tue Jul 3 17:53:18 EDT 2012
Speed up adjacency iteration.
--- a/8/ra.c
+++ b/8/ra.c
@@ -330,6 +330,25 @@
}
}
+static int adjiter(Isel *s, regid n, regid *m)
+{
+ size_t i, r;
+
+ for (r = *m; bsiter(s->gadj[n], &r); r++) {
+ for (i = 0; i < s->nselstk; i++)
+ if (r == s->selstk[i]->reg.id)
+ goto next;
+ if (bshas(s->coalesced, r))
+ goto next;
+ assert(r < maxregid);
+ *m = r;
+ return 1;
+next:
+ continue;
+ }
+ return 0;
+}
+
static Bitset *adjacent(Isel *s, regid n)
{
Bitset *r;
@@ -412,17 +431,15 @@
{
int d;
regid m;
- Bitset *adj;
+ assert(n < maxregid);
d = s->degree[n];
s->degree[n]--;
if (d == K) {
enablemove(s, n);
- adj = adjacent(s, n);
- for (m = 0; bsiter(adj, &m); m++)
+ for (m = 0; adjiter(s, n, &m); m++)
enablemove(s, n);
- bsfree(adj);
}
}
@@ -429,15 +446,12 @@
static void simp(Isel *s)
{
Loc *l;
- Bitset *adj;
regid m;
l = lpop(&s->wlsimp, &s->nwlsimp);
lappend(&s->selstk, &s->nselstk, l);
- adj = adjacent(s, l->reg.id);
- for (m = 0; bsiter(adj, &m); m++)
+ for (m = 0; adjiter(s, l->reg.id, &m); m++)
decdegree(s, m);
- bsfree(adj);
}
static regid getalias(Isel *s, regid id)
@@ -471,20 +485,14 @@
int k;
regid n;
size_t i;
- Bitset *uadj;
- Bitset *vadj;
- uadj = adjacent(s, u);
- vadj = adjacent(s, u);
k = 0;
- for (i = 0; bsiter(uadj, &n); i++)
+ for (i = 0; adjiter(s, u, &n); i++)
if (s->degree[n] >= K)
k++;
- for (i = 0; bsiter(vadj, &n); i++)
+ for (i = 0; adjiter(s, v, &n); i++)
if (s->degree[n] >= K)
k++;
- bsfree(uadj);
- bsfree(vadj);
return k < K;
}
@@ -503,7 +511,6 @@
static int combinable(Isel *s, regid u, regid v)
{
regid t;
- Bitset *adj;
/* if u isn't prepainted, can we conservatively coalesce? */
if (!bshas(s->prepainted, u) && conservative(s, u, v))
@@ -510,11 +517,9 @@
return 1;
/* if it is, are the adjacent nodes ok to combine with this? */
- adj = adjacent(s, u);
- for (t = 0; bsiter(adj, &t); t++)
+ for (t = 0; adjiter(s, u, &t); t++)
if (!ok(s, t, u))
return 0;
- bsfree(adj);
return 1;
}
@@ -566,8 +571,11 @@
lappend(&s->rmoves[u], &s->nrmoves[u], s->rmoves[v][i]);
}
+ size_t x;
adj = adjacent(s, v);
- for (t = 0; bsiter(adj, &t); t++) {
+ for (t = 0; adjiter(s, v, &t); t++) {
+ bsiter(adj, &x);
+ assert(t == x);
gbputedge(s, t, u);
decdegree(s, t);
}