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 { | 		do { | ||||||
| 			npos=exactmatch=0; | 			npos=exactmatch=0; | ||||||
| 			for(rpp=reglist[propno];rp= *rpp; rpp++) | 			for(rpp=reglist[propno];rp= *rpp; rpp++) | ||||||
| 				if (getrefcount(rp-machregs)==0) { | 				if (getrefcount(rp-machregs, FALSE)==0) { | ||||||
| 					pos[npos++] = rp-machregs; | 					pos[npos++] = rp-machregs; | ||||||
| 					if (eqtoken(&rp->r_contents,&token)) | 					if (eqtoken(&rp->r_contents,&token)) | ||||||
| 						exactmatch++; | 						exactmatch++; | ||||||
|  | @ -651,7 +651,7 @@ normalfailed:	if (stackpad!=tokpatlen) { | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		decision = forced; | 		decision = forced; | ||||||
| 		if (getrefcount(decision)!=0) | 		if (getrefcount(decision, FALSE)!=0) | ||||||
| 			BROKE(); | 			BROKE(); | ||||||
| 		token2.t_token = -1; | 		token2.t_token = -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -38,7 +38,7 @@ tuples(regls,nregneeded) rl_p *regls; { | ||||||
| 
 | 
 | ||||||
| 	for (i=0;i<NREGS;i++) { | 	for (i=0;i<NREGS;i++) { | ||||||
| 		regclass[i] = class++; | 		regclass[i] = class++; | ||||||
| 		if (getrefcount(i) == 0) { | 		if (getrefcount(i, FALSE) == 0) { | ||||||
| 			for (j=0;j<i;j++) { | 			for (j=0;j<i;j++) { | ||||||
| 				if (eqregclass(i,j) && | 				if (eqregclass(i,j) && | ||||||
| 				    eqtoken(&machregs[i].r_contents, | 				    eqtoken(&machregs[i].r_contents, | ||||||
|  |  | ||||||
|  | @ -40,7 +40,7 @@ chrefcount(regno,amount,tflag) { | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| getrefcount(regno) { | getrefcount(regno, tflag) { | ||||||
| 	register struct reginfo *rp; | 	register struct reginfo *rp; | ||||||
| #if MAXMEMBERS != 0 | #if MAXMEMBERS != 0 | ||||||
| 	register i,maxcount; | 	register i,maxcount; | ||||||
|  | @ -50,13 +50,13 @@ getrefcount(regno) { | ||||||
| #if MAXMEMBERS!=0 | #if MAXMEMBERS!=0 | ||||||
| 	if (rp->r_members[0]==0) | 	if (rp->r_members[0]==0) | ||||||
| #endif | #endif | ||||||
| 		return(rp->r_refcount); | 		return(rp->r_refcount - (tflag ? rp->r_tcount : 0)); | ||||||
| #if MAXMEMBERS!=0 | #if MAXMEMBERS!=0 | ||||||
| 	else { | 	else { | ||||||
| 		maxcount=0; | 		maxcount=0; | ||||||
| 		for (i=0;i<MAXMEMBERS;i++) | 		for (i=0;i<MAXMEMBERS;i++) | ||||||
| 			if (rp->r_members[i]!=0) | 			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); | 		return(maxcount); | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -30,7 +30,7 @@ match(tp,tep,optexp) register token_p tp; register set_p tep; { | ||||||
| 	if (tp->t_token == -1) {        /* register frame */ | 	if (tp->t_token == -1) {        /* register frame */ | ||||||
| 		bitno = tp->t_att[0].ar; | 		bitno = tp->t_att[0].ar; | ||||||
| 		if (tep->set_val[bitno>>4]&(1<<(bitno&017))) | 		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; | 				goto oklabel; | ||||||
| 		return(0); | 		return(0); | ||||||
| 	} else {                /* token frame */ | 	} else {                /* token frame */ | ||||||
|  | @ -534,7 +534,7 @@ unsigned stackupto(limit,ply,toplevel) token_p limit; { | ||||||
| 				if (cp->c1_prop>=0) { | 				if (cp->c1_prop>=0) { | ||||||
| 					for (rpp=reglist[cp->c1_prop]; | 					for (rpp=reglist[cp->c1_prop]; | ||||||
| 					       (rp = *rpp)!=0 && | 					       (rp = *rpp)!=0 && | ||||||
| 					       getrefcount(rp-machregs)!=0; | 					       getrefcount(rp-machregs, TRUE)!=0; | ||||||
| 						  rpp++) | 						  rpp++) | ||||||
| 						; | 						; | ||||||
| 					if (rp==0) | 					if (rp==0) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue