git: 9front

Download patch

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 = &region[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 = &region[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 = &region[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 = &region[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 = &region[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 = &region[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 = &region[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 = &region[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 = &region[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 = &region[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 = &region[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);
 
 	/*
--