]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: do not compute dead value maps if they will not be used
authorRuss Cox <rsc@golang.org>
Sat, 21 Dec 2013 00:14:42 +0000 (19:14 -0500)
committerRuss Cox <rsc@golang.org>
Sat, 21 Dec 2013 00:14:42 +0000 (19:14 -0500)
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

index 23f39c5c513b77d2e3b3d0a397d7dc8e0807c68c..00a06e4f95f40d9291e3a74a9694f78ae73e4528 100644 (file)
@@ -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);