ref: 84076e37167a9329d70104a39ea398a9f676009d
parent: 3a3eb0434c3e5bc98b05a4a0a9752a1743b32512
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Jun 17 17:12:35 EDT 2019
Delete dead code. Nothing is using (or even building) bound.[ch]
--- a/sys/src/cmd/8c/bound.c
+++ /dev/null
@@ -1,1117 +1,0 @@
-#include "gc.h"
-#include "bound.h"
-
-static BB* bbfree;
-static BBset* bbsfree;
-static int bballoc;
-static int bbsalloc;
-static BB bbz;
-static BBset bbsz;
-static BB* firstbb;
-static BB* lastbb;
-static BB* wounded;
-static BB* bbaux;
-static BBset* recalc;
-static BBset* bbhash[BBHASH];
-static BB** ordered;
-static int bcount;
-static BBset** heap;
-static int heapn;
-static int bsize;
-static char bbbuff[BBBSIZE];
-static int bchange;
-
-#define bdebug (debug['v'])
-#define dbg 0
-#define bcheck 0
-
-static long
-Rn(Reg *r)
-{
- if(r == R)
- return -1;
- return r->rpo;
-}
-
-static BB*
-bba(void)
-{
- BB *b;
-
- bballoc++;
- b = bbfree;
- if(b == nil) {
- b = alloc(sizeof(*b));
- } else
- bbfree = b->link;
-
- *b = bbz;
- return b;
-}
-
-static void
-bfree(BB *b)
-{
- bballoc--;
- b->link = bbfree;
- bbfree = b;
-}
-
-static BBset*
-bbsa(void)
-{
- BBset *b;
-
- bballoc++;
- b = bbsfree;
- if(b == nil) {
- b = alloc(sizeof(*b));
- } else
- bbsfree = b->link;
-
- *b = bbsz;
- return b;
-}
-
-static void
-bsfree(BBset *b)
-{
- bballoc--;
- b->link = bbsfree;
- bbsfree = b;
-}
-
-static void
-dumpheap(void)
-{
- int i;
-
- for(i = 1; i <= heapn; i++)
- print(" %d", heap[i]->damage);
-}
-
-static void
-checkheap(void)
-{
- int N, N2, n, c;
-
- N = heapn;
- N2 = N >> 1;
- for(n = 1; n <= N2; n++) {
- c = n << 1;
- if((heap[c]->damage > heap[n]->damage)
- || ((c < N) && (heap[c + 1]->damage > heap[n]->damage))) {
- print("bad heap (%d:%d) %d [", n, heap[n]->damage, heapn);
- dumpheap();
- print(" ]\n");
- abort();
- }
- }
-}
-
-static void
-downheap(int n)
-{
- int N, N2, d, c;
- BBset *s, *t, *u;
-
- s = heap[n];
- d = s->damage;
-//print("down %d %d", n, d);
- N = heapn;
- N2 = N >> 1;
- while(n <= N2) {
- c = n << 1;
- t = heap[c];
- if(c < N) {
- u = heap[c + 1];
- if(t->damage < u->damage) {
- t = u;
- c++;
- }
- }
-//print(" [%d %d]", c, t->damage);
- if(t->damage < d)
- break;
- heap[n] = t;
- t->index = n;
- n = c;
- }
- heap[n] = s;
- s->index = n;
-//print("\n");
-//checkheap();
-}
-
-static void
-upheap(int n)
-{
- int f, d;
- BBset *s, *t;
-
- s = heap[n];
- d = s->damage;
-//print("up %d %d", n, d);
- while(n > 1) {
- f = n >> 1;
- t = heap[f];
-//print(" [%d %d]", f, t->damage);
- if(t->damage >= d)
- break;
- heap[n] = t;
- t->index = n;
- n = f;
- }
- heap[n] = s;
- s->index = n;
-//print("\n");
-//checkheap();
-}
-
-static void
-heapremove(BBset *s)
-{
- int x;
- BBset *t;
-
- x = s->index;
- s->index = 0;
- if(x == 0)
- return;
- if(x == heapn) {
- heapn--;
- return;
- }
- t = heap[heapn--];
- heap[x] = t;
- t->index = x;
- if(s->damage < t->damage)
- upheap(x);
- else
- downheap(x);
-}
-
-static void
-heapadd(BBset *s)
-{
- int n;
-
- n = heapn + 1;
- heap[n] = s;
- s->index = n;
- heapn = n;
- upheap(n);
-
-}
-
-static void
-bbsrecalc(BBset *s)
-{
- if(s->recalc)
- return;
- s->recalc = 1;
- s->link = recalc;
- recalc = s;
- heapremove(s);
-}
-
-static void
-bbadd(BB *b, Hval h)
-{
- int k;
- BBset *s;
-
- k = h[0] & BBMASK;
- for(s = bbhash[k]; s != nil; s = s->next) {
- if(BBEQ(s->hash, h)) {
- b->set = s;
- b->link = s->ents;
- s->ents = b;
- bbsrecalc(s);
- return;
- }
- }
- s = bbsa();
- s->next = bbhash[k];
- bbhash[k] = s;
- b->set = s;
- b->link = nil;
- s->ents = b;
- BBCP(s->hash, h);
- bbsrecalc(s);
-}
-
-static int
-hashbb(BB *b, Hval h)
-{
- Reg *r;
- Prog *p;
- char *s;
- int c, f, i, n;
-
- r = b->first;
- s = bbbuff;
- i = 0;
- n = BBBSIZE;
- for(;;) {
- p = r->prog;
- if(p->as != ANOP) {
- if(p->to.type == D_BRANCH)
- p->to.offset = r->s2->rpo;
- c = snprint(s, n, "%P", p);
- s += c;
- n -= c;
- i++;
- }
- if(r == b->last)
- break;
- r = r->link;
- }
- if(n == 0)
- return Bbig;
- b->len = i;
- BBMKHASH(bbbuff, BBBSIZE - n, h);
- f = b->flags;
- if(i == 1 && r->prog->as == AJMP && b->first->p1 == R)
- f = Bjo;
- else if(b->first->p1 != R)
- f |= Bpre;
- if(bdebug)
- print("A %x %s %ux %ux\n", f, bbbuff, h[0], h[1]);
- return f;
-}
-
-static void
-enterbb(BB *b)
-{
- Hval h;
-
- b->flags = hashbb(b, h);
- if(b->flags != Bbig)
- bbadd(b, h);
-}
-
-static void
-preproc(BB *b, int x)
-{
- BB *n;
- Reg *r;
-
- ordered[x] = b;
- if(b->last->rpo - b->first->rpo > BBBIG) {
- b->flags = Bbig;
- return;
- }
- if(b->first->p2 == nil) {
- b->flags = Bdel;
- return;
- }
- switch(b->last->prog->as) {
- case ARET:
- case AJMP:
- case AIRETL:
- break;
-
- default:
- b->flags = Bdel;
- n = bba();
- n->first = b->first;
- for(r = b->last->link; r != R; r = r->link) {
- switch(r->prog->as) {
- case ARET:
- case AJMP:
- case AIRETL:
- n->last = r;
- n->flags = Bpin;
- enterbb(n);
- if(n->flags & Bpin) {
- n->aux = bbaux;
- bbaux = n;
- }
- else
- bfree(n);
- return;
- }
- }
- bfree(n);
- return;
- }
- enterbb(b);
-}
-
-static int
-p2len(Reg *r)
-{
- int c;
-
- c = 0;
- for(r = r->p2; r != nil; r = r->p2link)
- c++;
- return c;
-}
-
-static void
-calcdamage(BBset *s)
-{
- BB *f;
- int d, t;
-
- s->recalc = 0;
- f = s->ents;
- if(f == nil)
- return;
- if(f->flags & Bjo) {
- if(bdebug)
- print("add %ld jo\n", f->first->rpo);
- s->damage = COSTJO;
- heapadd(s);
- return;
- }
- if(f->link == nil) {
- if(bdebug)
- print("solo %x %x\n", s->hash[0], s->hash[1]);
- return;
- }
-
- d = 0;
- t = 0;
- while(f != nil) {
- if((f->flags & (Bpre|Bpin)) == 0 && f->last->link != R) {
- t = 1;
- d += (f->last->rpo - f->first->rpo) >> 1;
- }
- d += p2len(f->first);
- f = f->link;
- }
-
- if(t == 0) {
- if(bdebug)
- print("all pre %ld\n", s->ents->first->rpo);
- return;
- }
-
- if(bdebug)
- print("add %ld %d\n", s->ents->first->rpo, d);
- if(d > COSTHI)
- d = COSTHI;
- s->damage = d;
- heapadd(s);
-}
-
-static Reg*
-findjump(BB *b)
-{
- Reg *r, *l;
-
- r = b->first;
- l = b->last;
-
- for(;;) {
- if(r->prog->as == AJMP)
- break;
- if(r == l) {
- diag(Z, "findjump botch");
- break;
- }
- r = r->link;
- }
- return r;
-}
-
-static BB*
-findset(int r)
-{
- BB *s, **p;
- int n, n2;
-
- if(r < ordered[0]->first->rpo)
- return nil;
- n = bcount;
- p = ordered;
- while(n > 0) {
- n2 = n >> 1;
- s = p[n2];
- if(r < s->first->rpo) {
- n = n2;
- continue;
- }
- if(r > s->last->rpo) {
- n2++;
- p += n2;
- n -= n2;
- continue;
- }
- return s;
- }
- diag(Z, "findset botch");
- return nil;
-}
-
-static void
-wound(Reg *r)
-{
- BB *b, *p, **n;
- BBset *s;
-
- b = findset(r->rpo);
- if(b == nil)
- return;
- s = b->set;
- if(s == nil)
- return;
- for(n = &s->ents; (p = *n) != nil; n = &(*n)->link) {
- if(p == b) {
- *n = b->link;
- b->link = wounded;
- wounded = b;
- bbsrecalc(s);
- return;
- }
- }
-}
-
-static void
-printbl(Reg *l)
-{
- if(l == nil) {
- print("Z");
- return;
- }
-
- print("%ld", l->rpo);
- while((l = l->p2link) != nil)
- print(" %ld", l->rpo);
-}
-
-static void
-appset(Reg *e, Reg *s)
-{
- for(;;) {
- if(s->p2link == R) {
- s->p2link = e;
- return;
- }
- s = s->p2link;
- }
-}
-
-static Reg*
-delset(Reg *e, Reg *s)
-{
- Reg *c, *l;
-
- c = s;
- l = nil;
- for(;;) {
- if(e == c) {
- if(l == nil)
- return s->p2link;
- l->p2link = c->p2link;
- return s;
- }
- l = c;
- c = c->p2link;
- if(c == nil)
- return s;
- }
-}
-
-static void
-redest(Reg *s, Reg *d)
-{
- while(s != R) {
- s->s2 = d;
- s = s->p2link;
- }
-}
-
-static void
-changedest(Reg *s, Reg *d, int x)
-{
- Reg *l;
-
- if(bdebug) {
- print("change %ld [", s->rpo);
- printbl(s->p2);
- print("] -> %ld [", d->rpo);
- printbl(d->p2);
- print("]\n");
- }
-
- if(s->p2 == nil) {
-// print("deadjmp\n");
- return;
- }
-
- l = s->p2;
- for(;;) {
- if(bdebug)
- print("s2 %ld = %ld\n", l->rpo, d->rpo);
- l->s2 = d;
- wound(l);
- if(l->p2link == nil)
- break;
- l = l->p2link;
- }
-
- if(x) {
- l->p2link = delset(s, d->p2);
- d->p2 = s->p2;
- }
- else {
- l->p2link = d->p2;
- d->p2 = s->p2;
- s->p2 = nil;
- }
-
- if(bdebug) {
- print("result [");
- printbl(d->p2);
- print("]\n");
- }
-
- bchange = 1;
-}
-
-static void
-bexcise(BB *b)
-{
- Reg *r, *l;
-
- l = b->last;
- r = b->first;
- if(bdebug)
- print("excise %ld to %ld\n", r->rpo, l->rpo);
- for(;;) {
- r->prog->as = ANOP;
- r->prog->to.type = D_NONE;
- r->p2 = R;
- if(r->s2 != R) {
- r->s2->p2 = delset(r, r->s2->p2);
- r->s2 = R;
- }
- if(r == l)
- break;
- r = r->link;
- }
-}
-
-static int
-backtrack(Reg *s, Reg *d)
-{
- int i;
- char l[BINST], r[BINST];
-
-//print("backtrack %ld %ld\n", Rn(s), Rn(d));
- i = 0;
- while(s != nil && d != nil) {
- if(snprint(l, BINST, "%P", s->prog) == BINST)
- break;
- if(snprint(r, BINST, "%P", d->prog) == BINST)
- break;
-//print("%s\t%s\n", l, r);
- if(strcmp(l, r) != 0)
- break;
- i++;
- s = s->p2link;
- d = d->p2link;
- }
- return i;
-}
-
-static void
-checktails(void)
-{
- int c;
- Reg *r;
-
- c = 0;
- for(r = firstr; r->link != R; r = r->link) {
- if(r->prog->as == AJMP && r->s2 != nil)
- c += backtrack(r->p1, r->s2->p1);
- }
-
- if(c > 0)
- print("tails %s %d\n", firstr->prog->from.sym->name, c);
-}
-
-static void
-process(BBset *s)
-{
- Reg *h;
- BB *f, *o, *p, *t;
-
- if(bdebug)
- print("process %d %x %x\n", s->damage, s->hash[0], s->hash[1]);
- f = s->ents;
- if(f->flags & Bjo) {
- s->ents = nil;
- h = findjump(f)->s2;
- o = nil;
- while(f != nil) {
- t = f->link;
- if((f->flags & Bjo) != 0 && f->first->s2 != f->first) {
- changedest(f->first, h, 1);
- bexcise(f);
- }
- else {
- f->link = o;
- o = f;
- }
- f = t;
- }
- s->ents = o;
- }
- else {
- o = nil;
- p = nil;
- while(f != nil) {
- t = f->link;
- if((f->flags & (Bpre|Bpin)) != 0 || (f->last->link == R)) {
- f->link = p;
- p = f;
- }
- else {
- f->link = o;
- o = f;
- }
- f = t;
- }
- if(o == nil) {
- diag(Z, "all Bpre");
- return;
- }
- if(p == nil) {
- p = o;
- o = p->link;
- p->link = nil;
- s->ents = p;
- }
- else
- s->ents = p;
-
- h = p->first;
- // oblit o list repl with jmp to h
- while(o != nil) {
- changedest(o->first, h, 1);
- bexcise(o);
- o = o->link;
- }
-
- bbsrecalc(s);
- }
-}
-
-static void
-iterate(void)
-{
- BBset *s;
- BB *b, *t;
-
- heapn = 0;
-
- for(;;) {
- for(b = wounded; b != nil; b = t) {
- t = b->link;
- enterbb(b);
- }
- wounded = nil;
-
- for(s = recalc; s != nil; s = s->link)
- calcdamage(s);
- recalc = nil;
-
- if(heapn == 0)
- return;
-
- s = heap[1];
- heapremove(s);
- process(s);
- }
-}
-
-static void
-cleanup(void)
-{
- int i;
- BB *l, *n;
- BBset *b, *t;
-
- for(i = 0; i < BBHASH; i++) {
- b = bbhash[i];
- bbhash[i] = nil;
- while(b != nil) {
- t = b->next;
- bsfree(b);
- b = t;
- }
- }
- for(i = 0; i < bcount; i++)
- bfree(ordered[i]);
- for(l = bbaux; l != nil; l = n) {
- n = l->aux;
- bfree(l);
- }
- bbaux = nil;
-}
-
-static void
-prreg(Reg *r)
-{
- Prog *p;
-
- p = r->prog;
- if(p->to.type == D_BRANCH)
- p->to.offset = r->s2->rpo;
- print("%ld:%P\tr %lX ", r->rpo, r->prog, r->regu);
- print("p1 %ld p2 %ld p2l %ld s1 %ld s2 %ld link %ld",
- Rn(r->p1), Rn(r->p2), Rn(r->p2link),
- Rn(r->s1), Rn(r->s2), Rn(r->link));
- if(!r->active)
- print(" d");
-// print(" %p %p\n", r->prog, r->prog->link);
- print("\n");
-}
-
-static void prfunc(char*);
-
-static void
-checkr(int d)
-{
- Prog *p;
- Reg *r, *t;
-
- for(r = firstr; r->link != R; r = r->link) {
- for(p = r->prog->link; p != P && p != r->link->prog; p = p->link)
- ;
- if(p == P) {
- print("%ld: bad prog link\n", r->rpo);
- if(d)
- prfunc(nil);
- abort();
- }
- if(r->s1 != R && (r->s1 != r->link || r->link->p1 != r)) {
- print("%ld: bad s1 p1\n", r->rpo);
- if(d)
- prfunc(nil);
- abort();
- }
- if(r->s2 != R && r->s2->p2 == nil) {
- print("%ld: no p2 for s2\n", r->rpo);
- if(d)
- prfunc(nil);
- abort();
- }
- if(r->p2 != R) {
- t = r->p2->s2;
- while(t != r) {
- t = t->p2link;
- if(t == R) {
- print("%ld: bad s2 for p2\n", r->rpo);
- if(d)
- prfunc(nil);
- abort();
- }
- }
- }
- }
-}
-
-static void
-prfunc(char *s)
-{
- Reg *r;
-
- if(s != nil)
- print("%s structure %s\n", s, firstr->prog->from.sym->name);
- for(r = firstr; r != R; r = r->link)
- prreg(r);
- if(s != nil) {
- print("end\n");
- checkr(0);
- }
-}
-
-/* find p in r's list and replace with l */
-static void
-adjprog(Reg *r, Prog *p, Prog *l)
-{
- Prog *t, **n;
-
- for(n = &r->prog->link; (t = *n) != nil; n = &t->link) {
- if(t == p) {
- *n = l;
- return;
- }
- }
- print("adjprog botch\n");
- abort();
-}
-
-static void
-jumptojump(void)
-{
- Reg *r;
-
- for(r = firstr; r != R; r = r->link) {
- if(r->prog->as == AJMP && r->p2 != R && r->s2 != r) {
- if(bdebug)
- print("jump as dest %ld -> %ld\n", r->rpo, r->s2->rpo);
- changedest(r, r->s2, 0);
- bchange++;
- }
- }
-}
-
-/* drag a tail to replace a jump. seems to be a bad idea. */
-static void
-rearrange(void)
-{
- int i;
- Reg *j, *t;
- BB *b, *p, *s;
-
- for(i = 0; i < bcount; i++) {
- b = ordered[i];
- if(b->flags & Bdel)
- continue;
- j = b->last;
- if(j->prog->as == AJMP && j->s2->p1 == R) {
- t = j->s2;
- if(t == b->first)
- continue;
- s = findset(t->rpo);
- if(s == nil) {
- diag(Z, "no self");
- continue;
- }
- if(s == ordered[0])
- continue;
- if(s->flags & Bdel)
- continue;
- if(s->last->link == R)
- continue;
- if(bdebug)
- print("drag %ld to %ld\n", t->rpo, j->rpo);
- p = findset(t->rpo - 1);
- if(p == nil) {
- diag(Z, "no predec");
- continue;
- }
- if(p->last->link != t) {
- diag(Z, "bad predec %ld %ld", p->last->rpo, t->rpo);
- continue;
- }
-
- /* poison everything in sight */
- b->flags |= Bdel;
- s->flags |= Bdel;
- findset(j->link->rpo)->flags |= Bdel;
- findset(s->last->link->rpo)->flags |= Bdel;
-
- /* remove */
- adjprog(p->last, t->prog, s->last->link->prog);
- p->last->link = s->last->link;
-
- /* fix tail */
- adjprog(s->last, s->last->link->prog, j->link->prog);
- s->last->link = j->link;
-
- /* fix head */
- adjprog(j, j->link->prog, t->prog);
- j->link = t;
-
- /* nop the jump */
- j->prog->as = ANOP;
- j->prog->to.type = D_NONE;
- j->s2 = nil;
- j->link->p2 = delset(j, j->link->p2);
- j->s1 = t;
- t->p1 = j;
- if(bcheck)
- checkr(1);
- bchange++;
- }
- }
-}
-
-void
-jumptodot(void)
-{
- Reg *r;
-
- for(r = firstr; r != R; r = r->link) {
- if(r->prog->as == AJMP && r->s2 == r->link) {
- if(debug['v'])
- print("jump to next %ld\n", r->rpo);
- r->prog->as = ANOP;
- r->prog->to.type = D_NONE;
- r->s2 = nil;
- r->link->p2 = delset(r, r->link->p2);
- findset(r->rpo)->flags |= Bdel;
- findset(r->link->rpo)->flags |= Bdel;
- bchange++;
- }
- }
-}
-
-void
-comtarg(void)
-{
- int n;
- BB *b, *c;
- Reg *r, *l, *p, *t;
-
-loop:
- bchange = 0;
-
- /* excise NOPS because they just get in the way */
- /* some have p2 because they are excised labelled moves */
-
- if(debug['v']) {
- n = 0;
- for(r = firstr; r != R; r = r->link)
- r->rpo = n++;
- prfunc("prenop");
- }
-
- r = firstr;
- l = r->link;
- while(l != R) {
- if(l->prog->as == ANOP) {
- t = l->p1;
- p = l->p2;
-if(dbg) print("nop %ld [", l->rpo);
-if(dbg) printbl(p);
- for(;;) {
- adjprog(r, l->prog, l->prog->link);
- r->link = l->link;
- l->link = freer;
- freer = l;
- l = r->link;
- if(l->prog->as != ANOP)
- break;
-if(dbg) print("] %ld [", l->rpo);
-if(dbg) printbl(l->p2);
- if(p == R)
- p = l->p2;
- else if(l->p2 != nil)
- appset(l->p2, p);
- }
-if(dbg) print("] %ld [", l->rpo);
-if(dbg) printbl(l->p2);
- if(p != R) {
- redest(p, l);
- if(l->p2 != R)
- appset(p, l->p2);
- else
- l->p2 = p;
- }
-if(dbg) print("] -> [");
-if(dbg) printbl(l->p2);
-if(dbg) print("]\n");
- if(r->s1 != R)
- r->s1 = l;
- l->p1 = t;
- }
- r = l;
- l = r->link;
- }
-
- n = 0;
- for(r = firstr; r != R; r = r->link)
- r->rpo = n++;
-
- if(debug['v'])
- prfunc("input");
-
- firstbb = nil;
- lastbb = nil;
-
- if(debug['v'])
- print("bbstart\n");
-
- n = 0;
- r = firstr;
- do {
- b = bba();
- b->first = r;
- for(;;) {
- l = r;
- r = r->link;
- switch(l->prog->as) {
- case ARET:
- case AJMP:
- case AIRETL:
- goto out;
- }
- if(r->p2 != R)
- break;
- }
- out:
- b->last = l;
- if(lastbb == nil)
- firstbb = b;
- else
- lastbb->link = b;
- lastbb = b;
- if(bdebug)
- print("BB %ld %ld\n", b->first->rpo, b->last->rpo);
- n++;
- } while(r != R);
-
- if(debug['v'])
- print("end\n");
-
- if(n > bsize) {
- bsize = n * 3 / 2;
- if(bsize < BBINIT)
- bsize = BBINIT;
- ordered = alloc(bsize * sizeof(*ordered));
- heap = alloc((bsize + 1) * sizeof(*ordered));
- }
-
- if(debug['v'])
- print("preprocstart\n");
-
- n = 0;
- for(b = firstbb; b != nil; b = c) {
- c = b->link;
- preproc(b, n++);
- }
-
- if(debug['v'])
- print("end\n");
-
- bcount = n;
-
- jumptojump();
-
- if(debug['v'])
- print("iteratestart\n");
-
- iterate();
-//checktails();
-
- if(debug['v'])
- print("end\n");
-
- if(debug['v'])
- print("extrastart\n");
-
- jumptodot();
-// rearrange();
-
- if(debug['v'])
- print("end\n");
-
- cleanup();
- if(bballoc || bbsalloc)
- diag(Z, "bballoc %d %d", bballoc, bbsalloc);
-
- if(debug['v'])
- prfunc("output");
-
- if(1 && bchange)
- goto loop;
-}
--- a/sys/src/cmd/8c/bound.h
+++ /dev/null
@@ -1,56 +1,0 @@
-/*
- * Bounding Box stuff (brucee 04/03/30).
- */
-
-#include <mp.h>
-#include <libsec.h>
-
-typedef struct BB BB;
-typedef struct BBset BBset;
-typedef uchar Hval[SHA1dlen];
-
-#define BBEQ(a, b) (memcmp((a), (b), SHA1dlen) == 0)
-#define BBMKHASH(b, n, h) sha1((uchar *)(b), (n), (h), nil)
-#define BBCP(d, s) memmove(d, s, SHA1dlen)
-
-enum
-{
- Bpre = 1 << 0, /* has a flow in */
- Bjo = 1 << 1, /* a jump only */
- Bbig = 1 << 2, /* too big */
- Bdel = 1 << 3, /* deleted or not of interest */
- Bpin = 1 << 4, /* pinned by embedded labels */
-
- BBHASH = 64, /* power of 2 <= 256 */
- BBMASK = BBHASH - 1,
-
- BBINIT = 128,
- BBBIG = 64,
- BBBSIZE = 8192,
- BINST = 128,
-
- COSTHI = 0x7F,
- COSTJO = 0xFF,
-};
-
-struct BB
-{
- Reg* first;
- Reg* last;
- BBset* set;
- BB* link;
- BB* aux;
- short flags;
- short len;
-};
-
-struct BBset
-{
- Hval hash;
- BB* ents;
- BBset* next;
- BBset* link;
- short index;
- uchar damage;
- uchar recalc;
-};