diff --git a/src/cmd/6g/ggen.c b/src/cmd/6g/ggen.c index 788e6daa55b7352045960ac9ed29f5b030504fbd..c7a1f2d774948a7bbbab700ada191ac13f84a8c0 100644 --- a/src/cmd/6g/ggen.c +++ b/src/cmd/6g/ggen.c @@ -1175,8 +1175,12 @@ yes: } static int -regcmp(Node *ra, Node *rb) +regcmp(const void *va, const void *vb) { + Node *ra, *rb; + + ra = (Node*)va; + rb = (Node*)vb; return ra->local - rb->local; } diff --git a/src/cmd/6g/opt.h b/src/cmd/6g/opt.h index 57bdf4dc5119ac29e29faa94e136076b113b0655..9a8866b8d1492220d6daa09de50bc32859fe01c6 100644 --- a/src/cmd/6g/opt.h +++ b/src/cmd/6g/opt.h @@ -137,7 +137,8 @@ void paint1(Reg*, int); uint32 paint2(Reg*, int); void paint3(Reg*, int, int32, int); void addreg(Adr*, int); -void dumpit(char *str, Reg *r0); +void dumpone(Reg*); +void dumpit(char*, Reg*); int noreturn(Prog *p); /* diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c index 6503ba9db14d748fba1c66fe8dd22ef9e2af5fb9..b79cd61d863673e168aad54900a24dc864c878dc 100644 --- a/src/cmd/6g/reg.c +++ b/src/cmd/6g/reg.c @@ -106,6 +106,16 @@ regopt(Prog *firstp) first = 0; } + // count instructions + nr = 0; + for(p=firstp; p!=P; p=p->link) + nr++; + // if too big dont bother + if(nr >= 10000) { + print("********** %S is too big (%d)\n", curfn->nname->sym, nr); + return; + } + r1 = R; firstr = R; lastr = R; @@ -1464,49 +1474,56 @@ BtoF(int32 b) } void -dumpit(char *str, Reg *r0) +dumpone(Reg *r) { - Reg *r, *r1; int z; Bits bit; + print("%ld:%P", r->loop, r->prog); + for(z=0; z<BITS; z++) + bit.b[z] = + r->set.b[z] | + r->use1.b[z] | + r->use2.b[z] | + r->refbehind.b[z] | + r->refahead.b[z] | + r->calbehind.b[z] | + r->calahead.b[z] | + r->regdiff.b[z] | + r->act.b[z] | + 0; + if(bany(&bit)) { + print("\t"); + if(bany(&r->set)) + print(" s:%Q", r->set); + if(bany(&r->use1)) + print(" u1:%Q", r->use1); + if(bany(&r->use2)) + print(" u2:%Q", r->use2); + if(bany(&r->refbehind)) + print(" rb:%Q ", r->refbehind); + if(bany(&r->refahead)) + print(" ra:%Q ", r->refahead); + if(bany(&r->calbehind)) + print("cb:%Q ", r->calbehind); + if(bany(&r->calahead)) + print(" ca:%Q ", r->calahead); + if(bany(&r->regdiff)) + print(" d:%Q ", r->regdiff); + if(bany(&r->act)) + print(" a:%Q ", r->act); + } + print("\n"); +} + +void +dumpit(char *str, Reg *r0) +{ + Reg *r, *r1; + print("\n%s\n", str); for(r = r0; r != R; r = r->link) { - print("%ld:%P", r->loop, r->prog); - for(z=0; z<BITS; z++) - bit.b[z] = - r->set.b[z] | - r->use1.b[z] | - r->use2.b[z] | - r->refbehind.b[z] | - r->refahead.b[z] | - r->calbehind.b[z] | - r->calahead.b[z] | - r->regdiff.b[z] | - r->act.b[z] | - 0; - if(bany(&bit)) { - print("\t"); - if(bany(&r->set)) - print(" s:%Q", r->set); - if(bany(&r->use1)) - print(" u1:%Q", r->use1); - if(bany(&r->use2)) - print(" u2:%Q", r->use2); - if(bany(&r->refbehind)) - print(" rb:%Q ", r->refbehind); - if(bany(&r->refahead)) - print(" ra:%Q ", r->refahead); - if(bany(&r->calbehind)) - print("cb:%Q ", r->calbehind); - if(bany(&r->calahead)) - print(" ca:%Q ", r->calahead); - if(bany(&r->regdiff)) - print(" d:%Q ", r->regdiff); - if(bany(&r->act)) - print(" a:%Q ", r->act); - } - print("\n"); + dumpone(r); r1 = r->p2; if(r1 != R) { print(" pred:"); @@ -1535,6 +1552,7 @@ noreturn(Prog *p) if(symlist[0] == S) { symlist[0] = pkglookup("throwindex", "sys"); symlist[0] = pkglookup("throwslice", "sys"); + symlist[0] = pkglookup("throwinit", "sys"); symlist[1] = pkglookup("panicl", "sys"); }