diff --git a/mach/proto/ncg/codegen.c b/mach/proto/ncg/codegen.c index ff02718f6..cffb11a8b 100644 --- a/mach/proto/ncg/codegen.c +++ b/mach/proto/ncg/codegen.c @@ -563,7 +563,7 @@ normalfailed: if (stackpad!=tokpatlen) { int npos,npos2,pos[NREGS],pos2[NREGS]; unsigned mincost,t; struct reginfo *rp,**rpp; - token_t token,mtoken,token2; + token_t token,token2; int propno; int exactmatch; int decision; @@ -585,7 +585,7 @@ normalfailed: if (stackpad!=tokpatlen) { if (getrefcount(rp-machregs, FALSE)==0) { pos[npos++] = rp-machregs; if (eqtoken(&rp->r_contents,&token)) - exactmatch++; + pos2[exactmatch++] = rp-machregs; } /* * Now pos[] contains all free registers with desired @@ -606,6 +606,21 @@ normalfailed: if (stackpad!=tokpatlen) { CHKCOST(); } } 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