fixed problem with temporary DEALLOCATES: sometimes a register was
authorceriel <none@none>
Fri, 15 Jul 1988 11:23:44 +0000 (11:23 +0000)
committerceriel <none@none>
Fri, 15 Jul 1988 11:23:44 +0000 (11:23 +0000)
used for stacking, that was only temporarily deallocated

mach/proto/cg/codegen.c
mach/proto/cg/equiv.c
mach/proto/cg/reg.c
mach/proto/cg/subr.c

index 93f6a5f..4da1fe0 100644 (file)
@@ -287,9 +287,14 @@ if (Debug)
                i++; tp--;
        }
        if (tokpatlen>stackheight) {
+               int k;
                stackpad = tokpatlen-stackheight;
-               for (j=stackheight-1;j>=0;j--)
-                       fakestack[j+stackpad] = fakestack[j];
+               for (j=stackheight-1, k = j + stackpad;j>=0;j--, k--) {
+                       fakestack[k] = fakestack[j];
+                       /* fakestack[j+stackpad] = fakestack[j]; does not
+                          compile under Xenix
+                       */
+               }
                for (j=0;j<stackpad;j++)
                        fakestack[j].t_token=0;
                stackheight += stackpad;
@@ -457,7 +462,7 @@ if (Debug > 1) fprintf(stderr, "cost after coercions: %u\n", t);
                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++;
@@ -539,7 +544,7 @@ if (Debug > 1) fprintf(stderr, "cost after coercions: %u\n", t);
                }
        } else {
                decision = forced;
-               if (getrefcount(decision)!=0) {
+               if (getrefcount(decision, FALSE)!=0) {
                        totalcost = INFINITY;
                        BROKE();
                }
@@ -606,7 +611,11 @@ if (Debug > 1) fprintf(stderr, "cost after coercions: %u\n", t);
        }
        for (i=0;i<repllen;i++) {
                assert(stackheight<MAXFSTACK);
-               fakestack[stackheight++] = reptoken[i];
+               fakestack[stackheight] = reptoken[i];
+               stackheight++;
+               /* do not combine previous two statements; that does not
+                  compile under Xenix V3.2
+               */
        }
        for(i=0;i<nallreg;i++)
                chrefcount(allreg[i],-1,FALSE);
@@ -616,9 +625,10 @@ if (Debug > 1) fprintf(stderr, "cost after coercions: %u\n", t);
        emrepllen=(codep[-1]>>5)&07;
        j=emp-emlines;
        if (emrepllen>j) {
-               assert(nemlines+emrepllen-j<MAXEMLINES);
-               for (i=nemlines;i>=0;i--)
-                       emlines[i+emrepllen-j] = emlines[i];
+               int k = nemlines + emrepllen - j;
+               assert(k<MAXEMLINES);
+               for (i=nemlines;i>=0;i--, k--)
+                       emlines[k] = emlines[i];
                nemlines += emrepllen-j;
                emp += emrepllen-j;
        }
index 73d8b6a..3ed2005 100644 (file)
@@ -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,
index 50caf56..a0443c7 100644 (file)
@@ -38,7 +38,7 @@ chrefcount(regno,amount,tflag) {
 #endif
 }
 
-getrefcount(regno) {
+getrefcount(regno, tflag) {
        register struct reginfo *rp;
        register i,maxcount;
 
@@ -46,13 +46,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
index 82c98ef..27b10dc 100644 (file)
@@ -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+1;
                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 */
@@ -432,7 +432,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)