From: Ken Thompson Date: Sun, 30 Aug 2009 03:33:21 +0000 (-0700) Subject: sped up optimization by not optimizing X-Git-Tag: weekly.2009-11-06~715 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=bc15b94181baaed5ae3e8afef7dfedb9bb43956a;p=gostls13.git sped up optimization by not optimizing very large functions. R=r OCL=34080 CL=34080 --- diff --git a/src/cmd/6g/ggen.c b/src/cmd/6g/ggen.c index 788e6daa55..c7a1f2d774 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 57bdf4dc51..9a8866b8d1 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 6503ba9db1..b79cd61d86 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; zset.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; zset.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"); }