Commit acba34e4 authored by Russ Cox's avatar Russ Cox

cmd/gc: eliminate some pointer arithmetic

In mparith, all the a1-- are problematic. Rewrite it all without pointers.
It's clearer anyway.

In popt, v is problematic because it is used both as a fixed pointer
(v = byvar[i]) and as a moving pointer (v = var; v++) aka slice.
Eliminate pointer movement.

Tested that this still produces bit-for-bit output for 'go build -a std'
compared to d260756 (current master).

Change-Id: I1a1bed0f98b594c3864fe95075dd95f9b52113e0
Reviewed-on: https://go-review.googlesource.com/4645Reviewed-by: default avatarAustin Clements <austin@google.com>
parent ff81c14f
...@@ -235,9 +235,9 @@ mppow10flt(Mpflt *a, int p) ...@@ -235,9 +235,9 @@ mppow10flt(Mpflt *a, int p)
static void static void
mphextofix(Mpint *a, char *s, int n) mphextofix(Mpint *a, char *s, int n)
{ {
char *hexdigitp, *end, c; char c;
long d; long d;
int bit; int bit, hexdigitp, end;
while(*s == '0') { while(*s == '0') {
s++; s++;
...@@ -250,9 +250,9 @@ mphextofix(Mpint *a, char *s, int n) ...@@ -250,9 +250,9 @@ mphextofix(Mpint *a, char *s, int n)
return; return;
} }
end = s+n-1; end = n-1;
for(hexdigitp=end; hexdigitp>=s; hexdigitp--) { for(hexdigitp=end; hexdigitp>=0; hexdigitp--) {
c = *hexdigitp; c = s[hexdigitp];
if(c >= '0' && c <= '9') if(c >= '0' && c <= '9')
d = c-'0'; d = c-'0';
else if(c >= 'A' && c <= 'F') else if(c >= 'A' && c <= 'F')
...@@ -348,7 +348,8 @@ mpatoflt(Mpflt *a, char *as) ...@@ -348,7 +348,8 @@ mpatoflt(Mpflt *a, char *as)
mpnorm(a); mpnorm(a);
} }
for(;;) { for(;;) {
switch(c = *s++) { c = *s++;
switch(c) {
default: default:
yyerror("malformed constant: %s (at %c)", as, c); yyerror("malformed constant: %s (at %c)", as, c);
goto bad; goto bad;
...@@ -542,7 +543,8 @@ bad: ...@@ -542,7 +543,8 @@ bad:
int int
Bconv(Fmt *fp) Bconv(Fmt *fp)
{ {
char buf[500], *p; char buf[500];
int p;
Mpint *xval, q, r, ten, sixteen; Mpint *xval, q, r, ten, sixteen;
int f, digit; int f, digit;
...@@ -554,8 +556,8 @@ Bconv(Fmt *fp) ...@@ -554,8 +556,8 @@ Bconv(Fmt *fp)
mpnegfix(&q); mpnegfix(&q);
} }
p = &buf[sizeof(buf)]; p = sizeof(buf);
*--p = 0; buf[--p] = 0;
if(fp->flags & FmtSharp) { if(fp->flags & FmtSharp) {
// Hexadecimal // Hexadecimal
mpmovecfix(&sixteen, 16); mpmovecfix(&sixteen, 16);
...@@ -563,27 +565,27 @@ Bconv(Fmt *fp) ...@@ -563,27 +565,27 @@ Bconv(Fmt *fp)
mpdivmodfixfix(&q, &r, &q, &sixteen); mpdivmodfixfix(&q, &r, &q, &sixteen);
digit = mpgetfix(&r); digit = mpgetfix(&r);
if(digit < 10) if(digit < 10)
*--p = digit + '0'; buf[--p] = digit + '0';
else else
*--p = digit - 10 + 'A'; buf[--p] = digit - 10 + 'A';
if(mptestfix(&q) <= 0) if(mptestfix(&q) <= 0)
break; break;
} }
*--p = 'x'; buf[--p] = 'x';
*--p = '0'; buf[--p] = '0';
} else { } else {
// Decimal // Decimal
mpmovecfix(&ten, 10); mpmovecfix(&ten, 10);
for(;;) { for(;;) {
mpdivmodfixfix(&q, &r, &q, &ten); mpdivmodfixfix(&q, &r, &q, &ten);
*--p = mpgetfix(&r) + '0'; buf[--p] = mpgetfix(&r) + '0';
if(mptestfix(&q) <= 0) if(mptestfix(&q) <= 0)
break; break;
} }
} }
if(f) if(f)
*--p = '-'; buf[--p] = '-';
return fmtstrcpy(fp, p); return fmtstrcpy(fp, &buf[p]);
} }
int int
......
...@@ -14,12 +14,10 @@ static int ...@@ -14,12 +14,10 @@ static int
mplen(Mpint *a) mplen(Mpint *a)
{ {
int i, n; int i, n;
long *a1;
n = -1; n = -1;
a1 = &a->a[0];
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
if(*a1++ != 0) if(a->a[i] != 0)
n = i; n = i;
} }
return n+1; return n+1;
...@@ -32,19 +30,18 @@ mplen(Mpint *a) ...@@ -32,19 +30,18 @@ mplen(Mpint *a)
static void static void
mplsh(Mpint *a, int quiet) mplsh(Mpint *a, int quiet)
{ {
long *a1, x; long x;
int i, c; int i, c;
c = 0; c = 0;
a1 = &a->a[0];
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = (*a1 << 1) + c; x = (a->a[i] << 1) + c;
c = 0; c = 0;
if(x >= Mpbase) { if(x >= Mpbase) {
x -= Mpbase; x -= Mpbase;
c = 1; c = 1;
} }
*a1++ = x; a->a[i] = x;
} }
a->ovf = c; a->ovf = c;
if(a->ovf && !quiet) if(a->ovf && !quiet)
...@@ -58,20 +55,17 @@ mplsh(Mpint *a, int quiet) ...@@ -58,20 +55,17 @@ mplsh(Mpint *a, int quiet)
static void static void
mplshw(Mpint *a, int quiet) mplshw(Mpint *a, int quiet)
{ {
long *a1;
int i; int i;
a1 = &a->a[Mpprec-1]; i = Mpprec-1;
if(*a1) { if(a->a[i]) {
a->ovf = 1; a->ovf = 1;
if(!quiet) if(!quiet)
yyerror("constant shift overflow"); yyerror("constant shift overflow");
} }
for(i=1; i<Mpprec; i++) { for(; i > 0; i--)
a1[0] = a1[-1]; a->a[i] = a->a[i-1];
a1--; a->a[i] = 0;
}
a1[0] = 0;
} }
// //
...@@ -81,15 +75,14 @@ mplshw(Mpint *a, int quiet) ...@@ -81,15 +75,14 @@ mplshw(Mpint *a, int quiet)
static void static void
mprsh(Mpint *a) mprsh(Mpint *a)
{ {
long *a1, x, lo; long x, lo;
int i, c; int i, c;
c = 0; c = 0;
lo = a->a[0] & 1; lo = a->a[0] & 1;
a1 = &a->a[Mpprec]; for(i=Mpprec-1; i>=0; i--) {
for(i=0; i<Mpprec; i++) { x = a->a[i];
x = *--a1; a->a[i] = (x + c) >> 1;
*a1 = (x + c) >> 1;
c = 0; c = 0;
if(x & 1) if(x & 1)
c = Mpbase; c = Mpbase;
...@@ -105,16 +98,14 @@ mprsh(Mpint *a) ...@@ -105,16 +98,14 @@ mprsh(Mpint *a)
static void static void
mprshw(Mpint *a) mprshw(Mpint *a)
{ {
long *a1, lo; long lo;
int i; int i;
lo = a->a[0]; lo = a->a[0];
a1 = &a->a[0]; for(i=0; i<Mpprec-1; i++) {
for(i=1; i<Mpprec; i++) { a->a[i] = a->a[i+1];
a1[0] = a1[1];
a1++;
} }
a1[0] = 0; a->a[i] = 0;
if(a->neg && lo != 0) if(a->neg && lo != 0)
mpaddcfix(a, -1); mpaddcfix(a, -1);
} }
...@@ -125,7 +116,7 @@ mprshw(Mpint *a) ...@@ -125,7 +116,7 @@ mprshw(Mpint *a)
static int static int
mpcmp(Mpint *a, Mpint *b) mpcmp(Mpint *a, Mpint *b)
{ {
long x, *a1, *b1; long x;
int i; int i;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
...@@ -134,11 +125,8 @@ mpcmp(Mpint *a, Mpint *b) ...@@ -134,11 +125,8 @@ mpcmp(Mpint *a, Mpint *b)
return 0; return 0;
} }
a1 = &a->a[0] + Mpprec; for(i=Mpprec-1; i>=0; i--) {
b1 = &b->a[0] + Mpprec; x = a->a[i] - b->a[i];
for(i=0; i<Mpprec; i++) {
x = *--a1 - *--b1;
if(x > 0) if(x > 0)
return +1; return +1;
if(x < 0) if(x < 0)
...@@ -154,19 +142,18 @@ mpcmp(Mpint *a, Mpint *b) ...@@ -154,19 +142,18 @@ mpcmp(Mpint *a, Mpint *b)
static void static void
mpneg(Mpint *a) mpneg(Mpint *a)
{ {
long x, *a1; long x;
int i, c; int i, c;
a1 = &a->a[0];
c = 0; c = 0;
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = -*a1 -c; x = -a->a[i] -c;
c = 0; c = 0;
if(x < 0) { if(x < 0) {
x += Mpbase; x += Mpbase;
c = 1; c = 1;
} }
*a1++ = x; a->a[i] = x;
} }
} }
...@@ -202,7 +189,7 @@ void ...@@ -202,7 +189,7 @@ void
mpaddfixfix(Mpint *a, Mpint *b, int quiet) mpaddfixfix(Mpint *a, Mpint *b, int quiet)
{ {
int i, c; int i, c;
long x, *a1, *b1; long x;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
if(nsavederrors+nerrors == 0) if(nsavederrors+nerrors == 0)
...@@ -212,20 +199,18 @@ mpaddfixfix(Mpint *a, Mpint *b, int quiet) ...@@ -212,20 +199,18 @@ mpaddfixfix(Mpint *a, Mpint *b, int quiet)
} }
c = 0; c = 0;
a1 = &a->a[0];
b1 = &b->a[0];
if(a->neg != b->neg) if(a->neg != b->neg)
goto sub; goto sub;
// perform a+b // perform a+b
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = *a1 + *b1++ + c; x = a->a[i] + b->a[i] + c;
c = 0; c = 0;
if(x >= Mpbase) { if(x >= Mpbase) {
x -= Mpbase; x -= Mpbase;
c = 1; c = 1;
} }
*a1++ = x; a->a[i] = x;
} }
a->ovf = c; a->ovf = c;
if(a->ovf && !quiet) if(a->ovf && !quiet)
...@@ -242,26 +227,26 @@ sub: ...@@ -242,26 +227,26 @@ sub:
case 1: case 1:
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = *a1 - *b1++ - c; x = a->a[i] - b->a[i] - c;
c = 0; c = 0;
if(x < 0) { if(x < 0) {
x += Mpbase; x += Mpbase;
c = 1; c = 1;
} }
*a1++ = x; a->a[i] = x;
} }
break; break;
case -1: case -1:
a->neg ^= 1; a->neg ^= 1;
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = *b1++ - *a1 - c; x = b->a[i] - a->a[i] - c;
c = 0; c = 0;
if(x < 0) { if(x < 0) {
x += Mpbase; x += Mpbase;
c = 1; c = 1;
} }
*a1++ = x; a->a[i] = x;
} }
break; break;
} }
...@@ -272,8 +257,9 @@ mpmulfixfix(Mpint *a, Mpint *b) ...@@ -272,8 +257,9 @@ mpmulfixfix(Mpint *a, Mpint *b)
{ {
int i, j, na, nb; int i, j, na, nb;
long *a1, x; long x;
Mpint s, q; Mpint s, q;
Mpint *c;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
if(nsavederrors+nerrors == 0) if(nsavederrors+nerrors == 0)
...@@ -288,17 +274,17 @@ mpmulfixfix(Mpint *a, Mpint *b) ...@@ -288,17 +274,17 @@ mpmulfixfix(Mpint *a, Mpint *b)
nb = mplen(b); nb = mplen(b);
if(na > nb) { if(na > nb) {
mpmovefixfix(&s, a); mpmovefixfix(&s, a);
a1 = &b->a[0]; c = b;
na = nb; na = nb;
} else { } else {
mpmovefixfix(&s, b); mpmovefixfix(&s, b);
a1 = &a->a[0]; c = a;
} }
s.neg = 0; s.neg = 0;
mpmovecfix(&q, 0); mpmovecfix(&q, 0);
for(i=0; i<na; i++) { for(i=0; i<na; i++) {
x = *a1++; x = c->a[i];
for(j=0; j<Mpscale; j++) { for(j=0; j<Mpscale; j++) {
if(x & 1) { if(x & 1) {
if(s.ovf) { if(s.ovf) {
...@@ -326,7 +312,7 @@ mpmulfract(Mpint *a, Mpint *b) ...@@ -326,7 +312,7 @@ mpmulfract(Mpint *a, Mpint *b)
{ {
int i, j; int i, j;
long *a1, x; long x;
Mpint s, q; Mpint s, q;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
...@@ -337,16 +323,16 @@ mpmulfract(Mpint *a, Mpint *b) ...@@ -337,16 +323,16 @@ mpmulfract(Mpint *a, Mpint *b)
} }
mpmovefixfix(&s, b); mpmovefixfix(&s, b);
a1 = &a->a[Mpprec];
s.neg = 0; s.neg = 0;
mpmovecfix(&q, 0); mpmovecfix(&q, 0);
x = *--a1; i = Mpprec-1;
x = a->a[i];
if(x != 0) if(x != 0)
yyerror("mpmulfract not normal"); yyerror("mpmulfract not normal");
for(i=0; i<Mpprec-1; i++) { for(i--; i >= 0; i--) {
x = *--a1; x = a->a[i];
if(x == 0) { if(x == 0) {
mprshw(&s); mprshw(&s);
continue; continue;
...@@ -369,7 +355,7 @@ void ...@@ -369,7 +355,7 @@ void
mporfixfix(Mpint *a, Mpint *b) mporfixfix(Mpint *a, Mpint *b)
{ {
int i; int i;
long x, *a1, *b1; long x;
x = 0; x = 0;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
...@@ -386,11 +372,9 @@ mporfixfix(Mpint *a, Mpint *b) ...@@ -386,11 +372,9 @@ mporfixfix(Mpint *a, Mpint *b)
if(b->neg) if(b->neg)
mpneg(b); mpneg(b);
a1 = &a->a[0];
b1 = &b->a[0];
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = *a1 | *b1++; x = a->a[i] | b->a[i];
*a1++ = x; a->a[i] = x;
} }
if(b->neg) if(b->neg)
...@@ -405,7 +389,7 @@ void ...@@ -405,7 +389,7 @@ void
mpandfixfix(Mpint *a, Mpint *b) mpandfixfix(Mpint *a, Mpint *b)
{ {
int i; int i;
long x, *a1, *b1; long x;
x = 0; x = 0;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
...@@ -422,11 +406,9 @@ mpandfixfix(Mpint *a, Mpint *b) ...@@ -422,11 +406,9 @@ mpandfixfix(Mpint *a, Mpint *b)
if(b->neg) if(b->neg)
mpneg(b); mpneg(b);
a1 = &a->a[0];
b1 = &b->a[0];
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = *a1 & *b1++; x = a->a[i] & b->a[i];
*a1++ = x; a->a[i] = x;
} }
if(b->neg) if(b->neg)
...@@ -441,7 +423,7 @@ void ...@@ -441,7 +423,7 @@ void
mpandnotfixfix(Mpint *a, Mpint *b) mpandnotfixfix(Mpint *a, Mpint *b)
{ {
int i; int i;
long x, *a1, *b1; long x;
x = 0; x = 0;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
...@@ -458,11 +440,9 @@ mpandnotfixfix(Mpint *a, Mpint *b) ...@@ -458,11 +440,9 @@ mpandnotfixfix(Mpint *a, Mpint *b)
if(b->neg) if(b->neg)
mpneg(b); mpneg(b);
a1 = &a->a[0];
b1 = &b->a[0];
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = *a1 & ~*b1++; x = a->a[i] & ~b->a[i];
*a1++ = x; a->a[i] = x;
} }
if(b->neg) if(b->neg)
...@@ -477,7 +457,7 @@ void ...@@ -477,7 +457,7 @@ void
mpxorfixfix(Mpint *a, Mpint *b) mpxorfixfix(Mpint *a, Mpint *b)
{ {
int i; int i;
long x, *a1, *b1; long x;
x = 0; x = 0;
if(a->ovf || b->ovf) { if(a->ovf || b->ovf) {
...@@ -494,11 +474,9 @@ mpxorfixfix(Mpint *a, Mpint *b) ...@@ -494,11 +474,9 @@ mpxorfixfix(Mpint *a, Mpint *b)
if(b->neg) if(b->neg)
mpneg(b); mpneg(b);
a1 = &a->a[0];
b1 = &b->a[0];
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
x = *a1 ^ *b1++; x = a->a[i] ^ b->a[i];
*a1++ = x; a->a[i] = x;
} }
if(b->neg) if(b->neg)
...@@ -585,7 +563,6 @@ void ...@@ -585,7 +563,6 @@ void
mpmovecfix(Mpint *a, vlong c) mpmovecfix(Mpint *a, vlong c)
{ {
int i; int i;
long *a1;
vlong x; vlong x;
a->neg = 0; a->neg = 0;
...@@ -597,9 +574,8 @@ mpmovecfix(Mpint *a, vlong c) ...@@ -597,9 +574,8 @@ mpmovecfix(Mpint *a, vlong c)
x = -(uvlong)x; x = -(uvlong)x;
} }
a1 = &a->a[0];
for(i=0; i<Mpprec; i++) { for(i=0; i<Mpprec; i++) {
*a1++ = x&Mpmask; a->a[i] = x&Mpmask;
x >>= Mpscale; x >>= Mpscale;
} }
} }
...@@ -658,13 +634,11 @@ mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d) ...@@ -658,13 +634,11 @@ mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d)
static int static int
mpiszero(Mpint *a) mpiszero(Mpint *a)
{ {
long *a1;
int i; int i;
a1 = &a->a[0] + Mpprec;
for(i=0; i<Mpprec; i++) { for(i=Mpprec-1; i>=0; i--)
if(*--a1 != 0) if(a->a[i] != 0)
return 0; return 0;
}
return 1; return 1;
} }
...@@ -673,16 +647,15 @@ mpdivfract(Mpint *a, Mpint *b) ...@@ -673,16 +647,15 @@ mpdivfract(Mpint *a, Mpint *b)
{ {
Mpint n, d; Mpint n, d;
int i, j, neg; int i, j, neg;
long *a1, x; long x;
mpmovefixfix(&n, a); // numerator mpmovefixfix(&n, a); // numerator
mpmovefixfix(&d, b); // denominator mpmovefixfix(&d, b); // denominator
a1 = &a->a[Mpprec]; // quotient
neg = n.neg ^ d.neg; neg = n.neg ^ d.neg;
n.neg = 0; n.neg = 0;
d.neg = 0; d.neg = 0;
for(i=0; i<Mpprec; i++) { for(i=Mpprec-1; i >= 0; i--) {
x = 0; x = 0;
for(j=0; j<Mpscale; j++) { for(j=0; j<Mpscale; j++) {
x <<= 1; x <<= 1;
...@@ -693,7 +666,7 @@ mpdivfract(Mpint *a, Mpint *b) ...@@ -693,7 +666,7 @@ mpdivfract(Mpint *a, Mpint *b)
} }
mprsh(&d); mprsh(&d);
} }
*--a1 = x; a->a[i] = x;
} }
a->neg = neg; a->neg = neg;
} }
......
...@@ -618,7 +618,8 @@ mergetemp(Prog *firstp) ...@@ -618,7 +618,8 @@ mergetemp(Prog *firstp)
nkill = 0; nkill = 0;
// Special case. // Special case.
for(v = var; v < var+nvar; v++) { for(i = 0; i < nvar; i++) {
v = &var[i];
if(v->addr) if(v->addr)
continue; continue;
// Used in only one instruction, which had better be a write. // Used in only one instruction, which had better be a write.
...@@ -665,7 +666,8 @@ mergetemp(Prog *firstp) ...@@ -665,7 +666,8 @@ mergetemp(Prog *firstp)
// Each flood uses a new value of gen so that we don't have // Each flood uses a new value of gen so that we don't have
// to clear all the r->active words after each variable. // to clear all the r->active words after each variable.
gen = 0; gen = 0;
for(v = var; v < var+nvar; v++) { for(i = 0; i < nvar; i++) {
v = &var[i];
gen++; gen++;
for(f = v->use; f != nil; f = (Flow*)f->data) for(f = v->use; f != nil; f = (Flow*)f->data)
mergewalk(v, f, gen); mergewalk(v, f, gen);
...@@ -740,7 +742,8 @@ mergetemp(Prog *firstp) ...@@ -740,7 +742,8 @@ mergetemp(Prog *firstp)
if(debugmerge > 0 && debug['v']) { if(debugmerge > 0 && debug['v']) {
print("%S [%d - %d]\n", curfn->nname->sym, nvar, nkill); print("%S [%d - %d]\n", curfn->nname->sym, nvar, nkill);
for(v=var; v<var+nvar; v++) { for(i = 0; i < nvar; i++) {
v = &var[i];
print("var %#N %T %lld-%lld", v->node, v->node->type, v->start, v->end); print("var %#N %T %lld-%lld", v->node, v->node->type, v->start, v->end);
if(v->addr) if(v->addr)
print(" addr=1"); print(" addr=1");
...@@ -779,8 +782,10 @@ mergetemp(Prog *firstp) ...@@ -779,8 +782,10 @@ mergetemp(Prog *firstp)
} }
// Clear aux structures. // Clear aux structures.
for(v=var; v<var+nvar; v++) for(i = 0; i < nvar; i++) {
v = &var[i];
v->node->opt = nil; v->node->opt = nil;
}
free(var); free(var);
free(bystart); free(bystart);
free(inuse); free(inuse);
......
...@@ -103,6 +103,7 @@ regopt(Prog *firstp) ...@@ -103,6 +103,7 @@ regopt(Prog *firstp)
int nreg; int nreg;
char **regnames; char **regnames;
Bits bit; Bits bit;
Rgn *rgp;
if(first) { if(first) {
fmtinstall('Q', Qconv); fmtinstall('Q', Qconv);
...@@ -198,7 +199,8 @@ regopt(Prog *firstp) ...@@ -198,7 +199,8 @@ regopt(Prog *firstp)
} }
for(i=0; i<nvar; i++) { for(i=0; i<nvar; i++) {
Var *v = var+i; Var *v;
v = var+i;
if(v->addr) { if(v->addr) {
bit = blsh(i); bit = blsh(i);
for(z=0; z<BITS; z++) for(z=0; z<BITS; z++)
...@@ -206,7 +208,7 @@ regopt(Prog *firstp) ...@@ -206,7 +208,7 @@ regopt(Prog *firstp)
} }
if(debug['R'] && debug['v']) if(debug['R'] && debug['v'])
print("bit=%2d addr=%d et=%-6E w=%-2d s=%N + %lld\n", print("bit=%2d addr=%d et=%E w=%-2d s=%N + %lld\n",
i, v->addr, v->etype, v->width, v->node, v->offset); i, v->addr, v->etype, v->width, v->node, v->offset);
} }
...@@ -334,7 +336,6 @@ loop2: ...@@ -334,7 +336,6 @@ loop2:
} }
for(f = firstf; f != nil; f = f->link) for(f = firstf; f != nil; f = f->link)
((Reg*)f->data)->act = zbits; ((Reg*)f->data)->act = zbits;
rgp = region;
nregion = 0; nregion = 0;
for(f = firstf; f != nil; f = f->link) { for(f = firstf; f != nil; f = f->link) {
r = (Reg*)f->data; r = (Reg*)f->data;
...@@ -361,10 +362,10 @@ loop2: ...@@ -361,10 +362,10 @@ loop2:
print("too many regions\n"); print("too many regions\n");
goto brk; goto brk;
} }
rgp = &region[nregion];
rgp->enter = f; rgp->enter = f;
rgp->varno = i; rgp->varno = i;
rgp->cost = change; rgp->cost = change;
rgp++;
nregion++; nregion++;
} }
} }
...@@ -379,10 +380,10 @@ brk: ...@@ -379,10 +380,10 @@ brk:
* determine used registers (paint2) * determine used registers (paint2)
* replace code (paint3) * replace code (paint3)
*/ */
rgp = region;
if(debug['R'] && debug['v']) if(debug['R'] && debug['v'])
print("\nregisterizing\n"); print("\nregisterizing\n");
for(i=0; i<nregion; i++) { for(i=0; i<nregion; i++) {
rgp = &region[i];
if(debug['R'] && debug['v']) if(debug['R'] && debug['v'])
print("region %d: cost %d varno %d enter %lld\n", i, rgp->cost, rgp->varno, rgp->enter->prog->pc); print("region %d: cost %d varno %d enter %lld\n", i, rgp->cost, rgp->varno, rgp->enter->prog->pc);
bit = blsh(rgp->varno); bit = blsh(rgp->varno);
...@@ -393,12 +394,11 @@ brk: ...@@ -393,12 +394,11 @@ brk:
Var *v; Var *v;
v = var + rgp->varno; v = var + rgp->varno;
print("registerize %N+%lld (bit=%2d et=%2E) in %R usedreg=%#llx vreg=%#llx\n", print("registerize %N+%lld (bit=%2d et=%E) in %R usedreg=%#llx vreg=%#llx\n",
v->node, v->offset, rgp->varno, v->etype, rgp->regno, usedreg, vreg); v->node, v->offset, rgp->varno, v->etype, rgp->regno, usedreg, vreg);
} }
paint3(rgp->enter, rgp->varno, vreg, rgp->regno); paint3(rgp->enter, rgp->varno, vreg, rgp->regno);
} }
rgp++;
} }
/* /*
...@@ -477,7 +477,7 @@ walkvardef(Node *n, Flow *f, int active) ...@@ -477,7 +477,7 @@ walkvardef(Node *n, Flow *f, int active)
if(f1->prog->as == AVARKILL && f1->prog->to.node == n) if(f1->prog->as == AVARKILL && f1->prog->to.node == n)
break; break;
for(v=n->opt; v!=nil; v=v->nextinnode) { for(v=n->opt; v!=nil; v=v->nextinnode) {
bn = v - var; bn = v->id;
biset(&((Reg*)f1->data)->act, bn); biset(&((Reg*)f1->data)->act, bn);
} }
if(f1->prog->as == ACALL) if(f1->prog->as == ACALL)
...@@ -680,6 +680,7 @@ mkvar(Flow *f, Adr *a) ...@@ -680,6 +680,7 @@ mkvar(Flow *f, Adr *a)
i = nvar; i = nvar;
nvar++; nvar++;
v = var+i; v = var+i;
v->id = i;
v->offset = o; v->offset = o;
v->name = n; v->name = n;
v->etype = et; v->etype = et;
...@@ -739,7 +740,7 @@ mkvar(Flow *f, Adr *a) ...@@ -739,7 +740,7 @@ mkvar(Flow *f, Adr *a)
v->addr = 1; v->addr = 1;
if(debug['R']) if(debug['R'])
print("bit=%2d et=%2E w=%lld+%lld %#N %D flag=%d\n", i, et, o, w, node, a, v->addr); print("bit=%2d et=%E w=%lld+%lld %#N %D flag=%d\n", i, et, o, w, node, a, v->addr);
ostats.nvar++; ostats.nvar++;
return bit; return bit;
...@@ -753,7 +754,7 @@ prop(Flow *f, Bits ref, Bits cal) ...@@ -753,7 +754,7 @@ prop(Flow *f, Bits ref, Bits cal)
{ {
Flow *f1, *f2; Flow *f1, *f2;
Reg *r, *r1; Reg *r, *r1;
int z, i, j; int z, i;
Var *v, *v1; Var *v, *v1;
for(f1 = f; f1 != nil; f1 = f1->p1) { for(f1 = f; f1 != nil; f1 = f1->p1) {
...@@ -820,11 +821,9 @@ prop(Flow *f, Bits ref, Bits cal) ...@@ -820,11 +821,9 @@ prop(Flow *f, Bits ref, Bits cal)
// v is the head of the list or if the head's bit is not yet turned on. // v is the head of the list or if the head's bit is not yet turned on.
// This will set the bits at most twice, keeping the overall loop linear. // This will set the bits at most twice, keeping the overall loop linear.
v1 = v->node->opt; v1 = v->node->opt;
j = v1 - var; if(v == v1 || !btest(&cal, v1->id)) {
if(v == v1 || !btest(&cal, j)) {
for(; v1 != nil; v1 = v1->nextinnode) { for(; v1 != nil; v1 = v1->nextinnode) {
j = v1 - var; biset(&cal, v1->id);
biset(&cal, j);
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment