From 6d47de2f408811304f2cc06d3debd2404b360f84 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 11 Sep 2013 15:22:11 -0400 Subject: [PATCH] cmd/5g, cmd/6g, cmd/8g: remove O(n) reset loop in copyprop Simpler version of CL 13084043. R=ken2 CC=golang-dev https://golang.org/cl/13602045 --- src/cmd/5g/peep.c | 12 +++++++----- src/cmd/6g/peep.c | 12 +++++++----- src/cmd/8g/peep.c | 12 +++++++----- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/cmd/5g/peep.c b/src/cmd/5g/peep.c index f96804d73d..9e51fa1b8a 100644 --- a/src/cmd/5g/peep.c +++ b/src/cmd/5g/peep.c @@ -47,6 +47,8 @@ static Flow* findpre(Flow *r, Adr *v); static int copyau1(Prog *p, Adr *v); static int isdconst(Addr *a); +static uint32 gactive; + // UNUSED int shiftprop(Flow *r); void constprop(Adr *c1, Adr *v1, Flow *r); @@ -63,6 +65,7 @@ peep(Prog *firstp) g = flowstart(firstp, sizeof(Flow)); if(g == nil) return; + gactive = 0; loop1: if(debug['P'] && debug['v']) @@ -360,15 +363,14 @@ copyprop(Graph *g, Flow *r0) { Prog *p; Adr *v1, *v2; - Flow *r; + USED(g); 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; + gactive++; return copy1(v1, v2, r0->s1, 0); } @@ -378,12 +380,12 @@ copy1(Adr *v1, Adr *v2, Flow *r, int f) int t; Prog *p; - if(r->active) { + if(r->active == gactive) { if(debug['P']) print("act set; return 1\n"); return 1; } - r->active = 1; + r->active = gactive; if(debug['P']) print("copy %D->%D f=%d\n", v1, v2, f); for(; r != nil; r = r->s1) { diff --git a/src/cmd/6g/peep.c b/src/cmd/6g/peep.c index 9b935ded8b..9ae5421bf9 100644 --- a/src/cmd/6g/peep.c +++ b/src/cmd/6g/peep.c @@ -45,6 +45,8 @@ static int copyas(Adr*, Adr*); static int copyau(Adr*, Adr*); static int copysub(Adr*, Adr*, Adr*, int); +static uint32 gactive; + // do we need the carry bit static int needc(Prog *p) @@ -92,6 +94,7 @@ peep(Prog *firstp) g = flowstart(firstp, sizeof(Flow)); if(g == nil) return; + gactive = 0; // byte, word arithmetic elimination. elimshortmov(g); @@ -643,8 +646,8 @@ copyprop(Graph *g, Flow *r0) { Prog *p; Adr *v1, *v2; - Flow *r; + USED(g); if(debug['P'] && debug['v']) print("copyprop %P\n", r0->prog); p = r0->prog; @@ -652,8 +655,7 @@ copyprop(Graph *g, Flow *r0) v2 = &p->to; if(copyas(v1, v2)) return 1; - for(r=g->start; r!=nil; r=r->link) - r->active = 0; + gactive++; return copy1(v1, v2, r0->s1, 0); } @@ -663,12 +665,12 @@ copy1(Adr *v1, Adr *v2, Flow *r, int f) int t; Prog *p; - if(r->active) { + if(r->active == gactive) { if(debug['P']) print("act set; return 1\n"); return 1; } - r->active = 1; + r->active = gactive; if(debug['P']) print("copy %D->%D f=%d\n", v1, v2, f); for(; r != nil; r = r->s1) { diff --git a/src/cmd/8g/peep.c b/src/cmd/8g/peep.c index 6e4d8176c1..f8e832e6d4 100644 --- a/src/cmd/8g/peep.c +++ b/src/cmd/8g/peep.c @@ -44,6 +44,8 @@ static int copyas(Adr*, Adr*); static int copyau(Adr*, Adr*); static int copysub(Adr*, Adr*, Adr*, int); +static uint32 gactive; + // do we need the carry bit static int needc(Prog *p) @@ -91,6 +93,7 @@ peep(Prog *firstp) g = flowstart(firstp, sizeof(Flow)); if(g == nil) return; + gactive = 0; // byte, word arithmetic elimination. elimshortmov(g); @@ -441,15 +444,14 @@ copyprop(Graph *g, Flow *r0) { Prog *p; Adr *v1, *v2; - Flow *r; + USED(g); 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; + gactive++; return copy1(v1, v2, r0->s1, 0); } @@ -459,12 +461,12 @@ copy1(Adr *v1, Adr *v2, Flow *r, int f) int t; Prog *p; - if(r->active) { + if(r->active == gactive) { if(debug['P']) print("act set; return 1\n"); return 1; } - r->active = 1; + r->active = gactive; if(debug['P']) print("copy %D->%D f=%d\n", v1, v2, f); for(; r != nil; r = r->s1) { -- 2.48.1