Replace linked list walk with memset.
This reduces CPU time taken by 'go install -a std' by ~10%.
Before:
real user sys
0m23.561s 0m16.625s 0m5.848s
0m23.766s 0m16.624s 0m5.846s
0m23.742s 0m16.621s 0m5.868s
after:
0m22.714s 0m14.858s 0m6.138s
0m22.644s 0m14.875s 0m6.120s
0m22.604s 0m14.854s 0m6.081s
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/
13084043
g = flowstart(firstp, sizeof(Flow));
if(g == nil)
return;
+ for(r=g->start, t=0; r!=nil; r=r->link, t++)
+ r->active = t;
loop1:
if(debug['P'] && debug['v'])
return 1;
}
+static uchar *active;
+static int nactive;
+
/*
* The idea is to remove redundant copies.
* v1->v2 F=0
{
Prog *p;
Adr *v1, *v2;
- Flow *r;
p = r0->prog;
v1 = &p->from;
v2 = &p->to;
if(copyas(v1, v2))
return 1;
- for(r=g->start; r!=nil; r=r->link)
- r->active = 0;
+ if(nactive < g->num) {
+ nactive = g->num;
+ active = realloc(active, g->num);
+ }
+ memset(active, 0, g->num);
return copy1(v1, v2, r0->s1, 0);
}
int t;
Prog *p;
- if(r->active) {
+ if(active[r->active]) {
if(debug['P'])
print("act set; return 1\n");
return 1;
}
- r->active = 1;
+ active[r->active] = 1;
if(debug['P'])
print("copy %D->%D f=%d\n", v1, v2, f);
for(; r != nil; r = r->s1) {
g = flowstart(firstp, sizeof(Flow));
if(g == nil)
return;
+ for(r=g->start, t=0; r!=nil; r=r->link, t++)
+ r->active = t;
// byte, word arithmetic elimination.
elimshortmov(g);
pushback(r);
}
}
-
+
flowend(g);
}
return 1;
}
+static uchar *active;
+static int nactive;
+
/*
* The idea is to remove redundant copies.
* v1->v2 F=0
{
Prog *p;
Adr *v1, *v2;
- Flow *r;
if(debug['P'] && debug['v'])
print("copyprop %P\n", r0->prog);
v2 = &p->to;
if(copyas(v1, v2))
return 1;
- for(r=g->start; r!=nil; r=r->link)
- r->active = 0;
+ if(nactive < g->num) {
+ nactive = g->num;
+ active = realloc(active, g->num);
+ }
+ memset(active, 0, g->num);
return copy1(v1, v2, r0->s1, 0);
}
int t;
Prog *p;
- if(r->active) {
+ if(active[r->active]) {
if(debug['P'])
print("act set; return 1\n");
return 1;
}
- r->active = 1;
+ active[r->active] = 1;
if(debug['P'])
print("copy %D->%D f=%d\n", v1, v2, f);
for(; r != nil; r = r->s1) {
g = flowstart(firstp, sizeof(Flow));
if(g == nil)
return;
+ for(r=g->start, t=0; r!=nil; r=r->link, t++)
+ r->active = t;
// byte, word arithmetic elimination.
elimshortmov(g);
return 1;
}
+static uchar *active;
+static int nactive;
+
/*
* The idea is to remove redundant copies.
* v1->v2 F=0
{
Prog *p;
Adr *v1, *v2;
- Flow *r;
p = r0->prog;
v1 = &p->from;
v2 = &p->to;
if(copyas(v1, v2))
return 1;
- for(r=g->start; r!=nil; r=r->link)
- r->active = 0;
+ if(nactive < g->num) {
+ nactive = g->num;
+ active = realloc(active, g->num);
+ }
+ memset(active, 0, g->num);
return copy1(v1, v2, r0->s1, 0);
}
int t;
Prog *p;
- if(r->active) {
+ if(active[r->active]) {
if(debug['P'])
print("act set; return 1\n");
return 1;
}
- r->active = 1;
+ active[r->active] = 1;
if(debug['P'])
print("copy %D->%D f=%d\n", v1, v2, f);
for(; r != nil; r = r->s1) {