ref: 3ea08ad8394fd7172435ecaa0279c9789731ab70
parent: 13c0412184b045b45181d41ef8eb7ff606294591
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Dec 27 20:45:04 EST 2025
?c: grow regions dynamically we keep bumping region counts, let's just grow it dynamically from now on.
--- a/sys/src/cmd/1c/gc.h
+++ b/sys/src/cmd/1c/gc.h
@@ -15,7 +15,6 @@
#define SZ_DOUBLE 8
#define ALLOP OEND
-#define NRGN 300
#define FNX 100
#define INDEXED 9
@@ -190,8 +189,6 @@
EXTERN int nvar;
EXTERN Prog* p;
EXTERN long pc;
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
EXTERN char string[NSNAME];
EXTERN Sym* symrathole;
EXTERN Sym* symstatic;
--- a/sys/src/cmd/1c/reg.c
+++ b/sys/src/cmd/1c/reg.c
@@ -37,9 +37,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long val, initpc, npc;
ulong vreg;
Bits bit;
@@ -351,8 +354,11 @@
r->prog, r->set, r->refahead, r->calahead);
r->act = zbits;
}
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {for(z=0; z<BITS; z++)
bit.b[z] = r->set.b[z] &
@@ -368,6 +374,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
changer = 0;
@@ -386,14 +393,12 @@
rgp->costr = changer;
rgp->costa = changea;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/2c/gc.h
+++ b/sys/src/cmd/2c/gc.h
@@ -15,7 +15,6 @@
#define SZ_DOUBLE 8
#define ALLOP OEND
-#define NRGN 300
#define FNX 100
#define INDEXED 9
@@ -206,8 +205,6 @@
EXTERN int nvar;
EXTERN Prog* p;
EXTERN long pc;
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
EXTERN char string[NSNAME];
EXTERN Sym* symrathole;
EXTERN Sym* symstatic;
--- a/sys/src/cmd/2c/reg.c
+++ b/sys/src/cmd/2c/reg.c
@@ -37,9 +37,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long val, initpc, npc;
ulong vreg;
Bits bit;
@@ -351,8 +354,11 @@
r->prog, r->set, r->refahead, r->calahead);
r->act = zbits;
}
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {for(z=0; z<BITS; z++)
bit.b[z] = r->set.b[z] &
@@ -368,6 +374,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
changer = 0;
@@ -386,14 +393,12 @@
rgp->costr = changer;
rgp->costa = changea;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/5c/gc.h
+++ b/sys/src/cmd/5c/gc.h
@@ -126,7 +126,6 @@
};
#define R ((Reg*)0)
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -175,9 +174,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/5c/reg.c
+++ b/sys/src/cmd/5c/reg.c
@@ -35,9 +35,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -321,8 +324,11 @@
for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {for(z=0; z<BITS; z++)
bit.b[z] = r->set.b[z] &
@@ -338,6 +344,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -353,14 +360,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/6c/gc.h
+++ b/sys/src/cmd/6c/gc.h
@@ -122,7 +122,6 @@
Node* scope;
};
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -171,9 +170,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/6c/reg.c
+++ b/sys/src/cmd/6c/reg.c
@@ -33,9 +33,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -502,8 +505,11 @@
print("\nprop structure:\n");for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) { if(debug['R'] && debug['v']) { print("%P\t", r->prog);@@ -529,6 +535,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -544,14 +551,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/7c/gc.h
+++ b/sys/src/cmd/7c/gc.h
@@ -125,7 +125,6 @@
};
#define R ((Reg*)0)
-#define NRGN 1000 /* was 600; raised for paranoia.c */
struct Rgn
{Reg* enter;
@@ -177,9 +176,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/7c/reg.c
+++ b/sys/src/cmd/7c/reg.c
@@ -35,9 +35,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -316,8 +319,11 @@
for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {for(z=0; z<BITS; z++)
bit.b[z] = r->set.b[z] &
@@ -333,6 +339,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -348,14 +355,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/8c/gc.h
+++ b/sys/src/cmd/8c/gc.h
@@ -122,7 +122,6 @@
Node* scope;
};
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -170,9 +169,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/8c/reg.c
+++ b/sys/src/cmd/8c/reg.c
@@ -33,9 +33,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -433,8 +436,11 @@
print("\nprop structure:\n");for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) { if(debug['R'] && debug['v']) { print("%P\t", r->prog);@@ -460,6 +466,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -475,14 +482,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/9c/gc.h
+++ b/sys/src/cmd/9c/gc.h
@@ -123,7 +123,6 @@
};
#define R ((Reg*)0)
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -177,9 +176,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/9c/reg.c
+++ b/sys/src/cmd/9c/reg.c
@@ -33,9 +33,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -313,8 +316,11 @@
print("\nprop structure:\n");for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {if(debug['R'] && debug['v'])
print("%P\n set = %B; rah = %B; cal = %B\n",@@ -333,6 +339,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -348,14 +355,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/kc/gc.h
+++ b/sys/src/cmd/kc/gc.h
@@ -119,7 +119,6 @@
};
#define R ((Reg*)0)
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -170,9 +169,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/kc/reg.c
+++ b/sys/src/cmd/kc/reg.c
@@ -33,9 +33,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -296,8 +299,11 @@
print("\nprop structure:\n");for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {if(debug['R'] && debug['v'])
print("%P\n set = %B; rah = %B; cal = %B\n",@@ -316,6 +322,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -331,14 +338,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/qc/gc.h
+++ b/sys/src/cmd/qc/gc.h
@@ -124,7 +124,6 @@
};
#define R ((Reg*)0)
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -175,9 +174,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/qc/reg.c
+++ b/sys/src/cmd/qc/reg.c
@@ -33,9 +33,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -306,8 +309,11 @@
print("\nprop structure:\n");for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {if(debug['R'] && debug['v'])
print("%P\n set = %B; rah = %B; cal = %B\n",@@ -326,6 +332,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -341,14 +348,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/tc/gc.h
+++ b/sys/src/cmd/tc/gc.h
@@ -125,7 +125,6 @@
};
#define R ((Reg*)0)
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -174,9 +173,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/tc/reg.c
+++ b/sys/src/cmd/tc/reg.c
@@ -35,9 +35,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -322,8 +325,11 @@
for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {for(z=0; z<BITS; z++)
bit.b[z] = r->set.b[z] &
@@ -339,6 +345,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -354,14 +361,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--- a/sys/src/cmd/vc/gc.h
+++ b/sys/src/cmd/vc/gc.h
@@ -120,7 +120,6 @@
};
#define R ((Reg*)0)
-#define NRGN 600
struct Rgn
{Reg* enter;
@@ -168,9 +167,6 @@
#define CINF 1000
#define LOOP 3
-EXTERN Rgn region[NRGN];
-EXTERN Rgn* rgp;
-EXTERN int nregion;
EXTERN int nvar;
EXTERN Bits externs;
--- a/sys/src/cmd/vc/reg.c
+++ b/sys/src/cmd/vc/reg.c
@@ -35,9 +35,12 @@
void
regopt(Prog *p)
{+ static int maxregion;
+ static Rgn *region;
+ Rgn *rgp;
Reg *r, *r1, *r2;
Prog *p1;
- int i, z;
+ int i, z, nregion;
long initpc, val, npc;
ulong vreg;
Bits bit;
@@ -311,8 +314,12 @@
for(r = firstr; r != R; r = r->link)
r->act = zbits;
- rgp = region;
+
nregion = 0;
+ if(region == nil){+ maxregion = 300;
+ region = alloc(maxregion * sizeof(Rgn));
+ }
for(r = firstr; r != R; r = r->link) {for(z=0; z<BITS; z++)
bit.b[z] = r->set.b[z] &
@@ -328,6 +335,7 @@
bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
while(bany(&bit)) {i = bnum(bit);
+ rgp = ®ion[nregion];
rgp->enter = r;
rgp->varno = i;
change = 0;
@@ -343,14 +351,12 @@
}
rgp->cost = change;
nregion++;
- if(nregion >= NRGN) {- warn(Z, "too many regions");
- goto brk;
+ if(nregion >= maxregion) {+ region = allocn(region, maxregion * sizeof(Rgn), 128*sizeof(Rgn));
+ maxregion += 128;
}
- rgp++;
}
}
-brk:
qsort(region, nregion, sizeof(region[0]), rcmp);
/*
--
⑨