From 145edc283fab61d732457ddd431e45a10da0f4d8 Mon Sep 17 00:00:00 2001
From: Russ Cox <rsc@golang.org>
Date: Fri, 20 Dec 2013 19:14:42 -0500
Subject: [PATCH] cmd/gc: do not compute dead value maps if they will not be
 used

Reduces 6g big.go memory usage from 251 MB to 242 MB.
Reduces 6g slow.go memory usage from 529 MB to 453 MB.

Mostly a memory savings; 6g slow.go is only about 5% faster.

The test programs are at
https://rsc.googlecode.com/hg/testdata/big.go (36k lines, 276kB)
https://rsc.googlecode.com/hg/testdata/slow.go (7k lines, 352kB)

R=golang-codereviews, bradfitz, iant
CC=golang-codereviews
https://golang.org/cl/42280045
---
 src/cmd/gc/plive.c | 47 ++++++++++++++++++++++++++++------------------
 1 file changed, 29 insertions(+), 18 deletions(-)

diff --git a/src/cmd/gc/plive.c b/src/cmd/gc/plive.c
index 23f39c5c51..00a06e4f95 100644
--- a/src/cmd/gc/plive.c
+++ b/src/cmd/gc/plive.c
@@ -690,7 +690,7 @@ progeffects(Prog *prog, Array *vars, Bvec *uevar, Bvec *varkill)
 // liveness computation.  The cfg argument is an array of BasicBlock*s and the
 // vars argument is an array of Node*s.
 static Liveness*
-newliveness(Node *fn, Prog *ptxt, Array *cfg, Array *vars)
+newliveness(Node *fn, Prog *ptxt, Array *cfg, Array *vars, int computedead)
 {
 	Liveness *result;
 	int32 i;
@@ -719,8 +719,13 @@ newliveness(Node *fn, Prog *ptxt, Array *cfg, Array *vars)
 
 	result->livepointers = arraynew(0, sizeof(Bvec*));
 	result->argslivepointers = arraynew(0, sizeof(Bvec*));
-	result->deadvalues = arraynew(0, sizeof(Bvec*));
-	result->argsdeadvalues = arraynew(0, sizeof(Bvec*));
+	if(computedead) {
+		result->deadvalues = arraynew(0, sizeof(Bvec*));
+		result->argsdeadvalues = arraynew(0, sizeof(Bvec*));
+	} else {
+		result->deadvalues = nil;
+		result->argsdeadvalues = nil;
+	}
 	return result;
 }
 
@@ -741,13 +746,15 @@ freeliveness(Liveness *lv)
 		free(*(Bvec**)arrayget(lv->argslivepointers, i));
 	arrayfree(lv->argslivepointers);
 
-	for(i = 0; i < arraylength(lv->deadvalues); i++)
-		free(*(Bvec**)arrayget(lv->deadvalues, i));
-	arrayfree(lv->deadvalues);
-
-	for(i = 0; i < arraylength(lv->argsdeadvalues); i++)
-		free(*(Bvec**)arrayget(lv->argsdeadvalues, i));
-	arrayfree(lv->argsdeadvalues);
+	if(lv->deadvalues != nil) {
+		for(i = 0; i < arraylength(lv->deadvalues); i++)
+			free(*(Bvec**)arrayget(lv->deadvalues, i));
+		arrayfree(lv->deadvalues);
+	
+		for(i = 0; i < arraylength(lv->argsdeadvalues); i++)
+			free(*(Bvec**)arrayget(lv->argsdeadvalues, i));
+		arrayfree(lv->argsdeadvalues);
+	}
 
 	for(i = 0; i < arraylength(lv->cfg); i++) {
 		free(lv->uevar[i]);
@@ -1333,10 +1340,12 @@ livenessepilogue(Liveness *lv)
 			arrayadd(lv->livepointers, &locals);
 
 			// Dead stuff second.
-			args = bvalloc(argswords() * BitsPerPointer);
-			arrayadd(lv->argsdeadvalues, &args);
-			locals = bvalloc(localswords() * BitsPerPointer);
-			arrayadd(lv->deadvalues, &locals);
+			if(lv->deadvalues != nil) {
+				args = bvalloc(argswords() * BitsPerPointer);
+				arrayadd(lv->argsdeadvalues, &args);
+				locals = bvalloc(localswords() * BitsPerPointer);
+				arrayadd(lv->deadvalues, &locals);
+			}
 		}
 
 		// walk backward, emit pcdata and populate the maps
@@ -1391,9 +1400,11 @@ livenessepilogue(Liveness *lv)
 				twobitlivepointermap(lv, liveout, lv->vars, args, locals);
 
 				// Record dead values.
-				args = *(Bvec**)arrayget(lv->argsdeadvalues, pos);
-				locals = *(Bvec**)arrayget(lv->deadvalues, pos);
-				twobitdeadvaluemap(lv, liveout, lv->vars, args, locals);
+				if(lv->deadvalues != nil) {
+					args = *(Bvec**)arrayget(lv->argsdeadvalues, pos);
+					locals = *(Bvec**)arrayget(lv->deadvalues, pos);
+					twobitdeadvaluemap(lv, liveout, lv->vars, args, locals);
+				}
 
 				pos--;
 			}
@@ -1487,7 +1498,7 @@ liveness(Node *fn, Prog *firstp, Sym *argssym, Sym *livesym, Sym *deadsym)
 	cfg = newcfg(firstp);
 	if(0) printcfg(cfg);
 	vars = getvariables(fn);
-	lv = newliveness(fn, firstp, cfg, vars);
+	lv = newliveness(fn, firstp, cfg, vars, deadsym != nil);
 
 	// Run the dataflow framework.
 	livenessprologue(lv);
-- 
2.30.9