// 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;
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;
}
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]);
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
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--;
}
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);