fixed problem with temporary DEALLOCATES: sometimes a register was
used for stacking, that was only temporarily deallocated
This commit is contained in:
		
							parent
							
								
									7aca78dc21
								
							
						
					
					
						commit
						f0d3a648af
					
				
					 4 changed files with 8 additions and 8 deletions
				
			
		|  | @ -569,7 +569,7 @@ normalfailed:	if (stackpad!=tokpatlen) { | |||
| 		do { | ||||
| 			npos=exactmatch=0; | ||||
| 			for(rpp=reglist[propno];rp= *rpp; rpp++) | ||||
| 				if (getrefcount(rp-machregs)==0) { | ||||
| 				if (getrefcount(rp-machregs, FALSE)==0) { | ||||
| 					pos[npos++] = rp-machregs; | ||||
| 					if (eqtoken(&rp->r_contents,&token)) | ||||
| 						exactmatch++; | ||||
|  | @ -651,7 +651,7 @@ normalfailed:	if (stackpad!=tokpatlen) { | |||
| 		} | ||||
| 	} else { | ||||
| 		decision = forced; | ||||
| 		if (getrefcount(decision)!=0) | ||||
| 		if (getrefcount(decision, FALSE)!=0) | ||||
| 			BROKE(); | ||||
| 		token2.t_token = -1; | ||||
| 	} | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ tuples(regls,nregneeded) rl_p *regls; { | |||
| 
 | ||||
| 	for (i=0;i<NREGS;i++) { | ||||
| 		regclass[i] = class++; | ||||
| 		if (getrefcount(i) == 0) { | ||||
| 		if (getrefcount(i, FALSE) == 0) { | ||||
| 			for (j=0;j<i;j++) { | ||||
| 				if (eqregclass(i,j) && | ||||
| 				    eqtoken(&machregs[i].r_contents, | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ chrefcount(regno,amount,tflag) { | |||
| #endif | ||||
| } | ||||
| 
 | ||||
| getrefcount(regno) { | ||||
| getrefcount(regno, tflag) { | ||||
| 	register struct reginfo *rp; | ||||
| #if MAXMEMBERS != 0 | ||||
| 	register i,maxcount; | ||||
|  | @ -50,13 +50,13 @@ getrefcount(regno) { | |||
| #if MAXMEMBERS!=0 | ||||
| 	if (rp->r_members[0]==0) | ||||
| #endif | ||||
| 		return(rp->r_refcount); | ||||
| 		return(rp->r_refcount - (tflag ? rp->r_tcount : 0)); | ||||
| #if MAXMEMBERS!=0 | ||||
| 	else { | ||||
| 		maxcount=0; | ||||
| 		for (i=0;i<MAXMEMBERS;i++) | ||||
| 			if (rp->r_members[i]!=0) | ||||
| 				maxcount=max(maxcount,getrefcount(rp->r_members[i])); | ||||
| 				maxcount=max(maxcount,getrefcount(rp->r_members[i], tflag)); | ||||
| 		return(maxcount); | ||||
| 	} | ||||
| #endif | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ match(tp,tep,optexp) register token_p tp; register set_p tep; { | |||
| 	if (tp->t_token == -1) {        /* register frame */ | ||||
| 		bitno = tp->t_att[0].ar; | ||||
| 		if (tep->set_val[bitno>>4]&(1<<(bitno&017))) | ||||
| 			if (tep->set_val[0]&1 || getrefcount(tp->t_att[0].ar)<=1) | ||||
| 			if (tep->set_val[0]&1 || getrefcount(tp->t_att[0].ar, FALSE)<=1) | ||||
| 				goto oklabel; | ||||
| 		return(0); | ||||
| 	} else {                /* token frame */ | ||||
|  | @ -534,7 +534,7 @@ unsigned stackupto(limit,ply,toplevel) token_p limit; { | |||
| 				if (cp->c1_prop>=0) { | ||||
| 					for (rpp=reglist[cp->c1_prop]; | ||||
| 					       (rp = *rpp)!=0 && | ||||
| 					       getrefcount(rp-machregs)!=0; | ||||
| 					       getrefcount(rp-machregs, TRUE)!=0; | ||||
| 						  rpp++) | ||||
| 						; | ||||
| 					if (rp==0) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue