int iCodeSeq = 0;
hTab *liveRanges = NULL;
hTab *iCodehTab = NULL;
+hTab *iCodeSeqhTab = NULL;
/*-----------------------------------------------------------------*/
/* sequenceiCode - creates a sequence number for the iCode & add */
ic->seq = ++iCodeSeq;
ic->depth = ebbs[i]->depth;
hTabAddItem (&iCodehTab, ic->key, ic);
+ hTabAddItem (&iCodeSeqhTab, ic->seq, ic);
}
ebbs[i]->lSeq = iCodeSeq;
}
(OP_LIVETO (op) && OP_LIVETO (op) < ic->seq))
{
int torange = ic->seq;
+
+ /* if this is a SEND then the toRange should be extended
+ to the call */
+ if (ic->op == SEND) {
+ iCode *lic ;
+ for (lic = ic->next ; lic ; lic = lic->next) {
+ if (lic->op == CALL || lic->op == PCALL) break;
+ }
+ /* found it : mark */
+ if (lic) torange = lic->seq;
+ }
/* if this is the last use then if this block belongs
to a loop & some definition comes into the loop
then extend the live range to the end of the loop */
{
torange = findLoopEndSeq (ebp->partOfLoop);
}
+
op = operandFromOperand (op);
setToRange (op, torange, FALSE);
}
ic->rlive = bitVectSetBit (ic->rlive, lrange->key);
}
}
+ /* overlapping live ranges should be eliminated */
+ if (ASSIGN_ITEMP_TO_ITEMP (ic)) {
+ if (SPIL_LOC(IC_RIGHT(ic)) == SPIL_LOC(IC_RESULT(ic)) && /* left & right share the same spil location */
+ OP_SYMBOL(IC_RESULT(ic))->isreqv && /* left of assign is a register requivalent */
+ !OP_SYMBOL(IC_RIGHT(ic))->isreqv && /* right side is not */
+ OP_SYMBOL(IC_RIGHT(ic))->liveTo > ic->key && /* right side live beyond this point */
+ bitVectnBitsOn(OP_DEFS(IC_RESULT(ic))) > 1 ) { /* left has multiple definitions */
+ SPIL_LOC(IC_RIGHT(ic)) = NULL; /* then cannot share */
+ }
+ }
}
}
}
/* so they overlap : set both their clashes */
inner->clashes = bitVectSetBit(inner->clashes,outer->key);
outer->clashes = bitVectSetBit(outer->clashes,inner->key);
-
+
/* check if they share the same spillocation */
- if (SYM_SPIL_LOC(inner) && SYM_SPIL_LOC(outer)) {
+ if (SYM_SPIL_LOC(inner) && SYM_SPIL_LOC(outer) &&
+ SYM_SPIL_LOC(inner) == SYM_SPIL_LOC(outer)) {
if (inner->reqv && !outer->reqv) SYM_SPIL_LOC(outer)=NULL;
else if (outer->reqv && !inner->reqv) SYM_SPIL_LOC(inner)=NULL;
else if (inner->used > outer->used) SYM_SPIL_LOC(outer)=NULL;
else SYM_SPIL_LOC(inner)=NULL;
}
+
}
}
}
iCodeSeq = 0;
setToNull ((void **) &iCodehTab);
iCodehTab = newHashTable (iCodeKey);
+ setToNull ((void **) &iCodeSeqhTab);
+ iCodeSeqhTab = newHashTable (iCodeKey);
sequenceiCode (ebbs, count);
/* call routine to mark the from & to live ranges for