changed 'uses REG=%1' behaviour: if no REG containing %1 is found, an

attempt is made to find an empty one
This commit is contained in:
ceriel 1990-10-26 18:18:53 +00:00
parent 54cc752a9e
commit 32f21c2bfa

View file

@ -563,7 +563,7 @@ normalfailed: if (stackpad!=tokpatlen) {
int npos,npos2,pos[NREGS],pos2[NREGS]; int npos,npos2,pos[NREGS],pos2[NREGS];
unsigned mincost,t; unsigned mincost,t;
struct reginfo *rp,**rpp; struct reginfo *rp,**rpp;
token_t token,mtoken,token2; token_t token,token2;
int propno; int propno;
int exactmatch; int exactmatch;
int decision; int decision;
@ -585,7 +585,7 @@ normalfailed: if (stackpad!=tokpatlen) {
if (getrefcount(rp-machregs, FALSE)==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++; pos2[exactmatch++] = rp-machregs;
} }
/* /*
* Now pos[] contains all free registers with desired * Now pos[] contains all free registers with desired
@ -606,6 +606,21 @@ normalfailed: if (stackpad!=tokpatlen) {
CHKCOST(); CHKCOST();
} }
} while (npos==0); } while (npos==0);
if (!exactmatch && tinstno!=0) {
/*
* No exact match, but we were looking for a particular
* token. Now try to find registers of which no
* known contents is available (the others might still
* be useful).
*/
instance(0,&token2);
for (i=0;i<npos;i++)
if (eqtoken(&machregs[pos[i]].r_contents,&token2)) {
pos2[exactmatch++] = pos[i];
}
}
if (!exactmatch) { if (!exactmatch) {
npos2=npos; npos2=npos;
for(i=0;i<npos;i++) for(i=0;i<npos;i++)
@ -616,17 +631,15 @@ normalfailed: if (stackpad!=tokpatlen) {
* We take only one equally likely register out of every * We take only one equally likely register out of every
* equivalence class as given by set of properties. * equivalence class as given by set of properties.
*/ */
mtoken = token;
npos2=0; npos2=0;
for(i=0;i<npos;i++) for(i=0;i<exactmatch;i++) {
if (eqtoken(&machregs[pos[i]].r_contents,&mtoken)) { pos2[npos2++] = pos2[i];
pos2[npos2++] = pos[i]; for(j=0;j<npos2-1;j++)
for(j=0;j<npos2-1;j++) if (eqregclass(pos2[j],pos2[i])) {
if (eqregclass(pos2[j],pos[i])) { npos2--;
npos2--; break;
break; }
} }
}
} }
/* /*
* Now pos2[] contains all possibilities to try, if more than * Now pos2[] contains all possibilities to try, if more than