106 lines · 1.7 KB · C
RawDownload
#include "java.h"#include "javaisa.h" /* * "Unify" results that are produced in one basic block and consumed * in another.  I.e., ensure that producers and consumers access results * through consistent fp offsets. */ static voidpushsucc(BB *bb){	BBList *l; 	for(l = bb->succ; l; l = l->next) {		if(l->bb->state == BB_POSTSIM)			bbput(l->bb);	}} static intpass1(StkSnap *s){	Jinst *j;	int i;	int fpoff; 	fpoff = -1;	for(i = 0; i < s->npc; i++) {		j = &code->j[s->pc[i]];		if((isload(j) && j->movsrc.mode != Anone)		|| (!isload(j) && j->dst.u.offset != -1)) {			if(fpoff == -1)				fpoff = j->dst.u.offset;			else if(fpoff != j->dst.u.offset)				fatal("pass1: can't\n");		}	}	if(fpoff == -1)		fpoff = getreg(j2dtype(s->jtype));	return fpoff;} static voidpass2(StkSnap *s, int fpoff){	Jinst *j;	int i; 	for(i = 0; i < s->npc; i++) {		j = &code->j[s->pc[i]];		if(isload(j) && j->movsrc.mode == Anone) {			j->movsrc = j->dst;			j->dst.mode = Afp;		}		j->dst.u.offset = fpoff;	}} static voidunifybb(BB *bb){	StkSnap *s;	int n, m; 	if(bb->state == BB_POSTUNIFY)		fatal("unifybb: BB_POSTUNIFY\n"); 	if(bb->entrystk == nil) {		pushsucc(bb);		return;	} 	clearreg();	reservereg(bb->entrystk, bb->entrysz);	reservereg(bb->exitstk, bb->exitsz); 	for(n = 0; n < bb->entrysz; n++) {		s = &bb->entrystk[n];		for(m = 0; m < s->npc; m++) {			reservereg(code->j[s->pc[m]].bb->entrystk,				code->j[s->pc[m]].bb->entrysz);		}	} 	for(n = 0; n < bb->entrysz; n++) {		s = &bb->entrystk[n];		if(s->npc == 1)			dstreg(&code->j[s->pc[0]].dst, j2dtype(s->jtype));		else			pass2(s, pass1(s));	} 	bb->state = BB_POSTUNIFY;	pushsucc(bb);} voidunify(void){	BB *bb; 	bbinit();	while(bb = bbget())		unifybb(bb);}