for (i = 0; i < count; i++)
{
fprintf (of, "\n----------------------------------------------------------------\n");
- fprintf (of, "Basic Block %s (df:%d bb:%d): loop Depth = %d noPath = %d lastinLoop = %d\n",
+ fprintf (of, "Basic Block %s (df:%d bb:%d lvl:%d): loop Depth = %d noPath = %d lastinLoop = %d\n",
ebbs[i]->entryLabel->name,
- ebbs[i]->dfnum, ebbs[i]->bbnum,
+ ebbs[i]->dfnum, ebbs[i]->bbnum, ebbs[i]->entryLabel->level,
ebbs[i]->depth,
ebbs[i]->noPath,
ebbs[i]->isLastInLoop);
{
edge *ep = item;
V_ARG (set **, allRegion);
- V_ARG (eBBlock **,ebbs);
- V_ARG (int,count);
region *aloop = newRegion ();
eBBlock *block;
- int dfMin = count ,dfMax =0, i;
/* make sure regionStack is empty */
while (!STACK_EMPTY (regionStack))
aloop->entry = ep->to;
- /* set max & min dfNum for loopRegion */
- for ( block = setFirstItem(aloop->regBlocks); block;
- block = setNextItem(aloop->regBlocks)) {
- if (block->dfnum > dfMax) dfMax = block->dfnum;
- if (block->dfnum < dfMin) dfMin = block->dfnum;
- }
-
- /* all blocks that have dfnumbers between dfMin & dfMax are also
- part of loop */
- for (i = 0 ; i < count ; i++) {
- if (ebbs[i]->dfnum > dfMin &&
- ebbs[i]->dfnum < dfMax &&
- !isinSet(aloop->regBlocks,ebbs[i])) {
- if (!ebbs[i]->partOfLoop) {
- ebbs[i]->partOfLoop = aloop;
- }
- }
- }
-
- /* and if this is a conditional block, the other side of the IFX
- (if any, that could have a greater dfnum) is too */
- {
- // just a burp, but I'm getting close :)
- }
-
-
/* now add it to the set */
addSetHead (allRegion, aloop);
return 0;
/* for each of these back edges get the blocks that */
/* constitute the loops */
- applyToSet (bEdges, createLoop, &allRegion, ebbs,count);
+ applyToSet (bEdges, createLoop, &allRegion);
/* now we will create regions from these loops */
/* loops with the same entry points are considered to be the */
/* setToRange - set the range to for an operand */
/*-----------------------------------------------------------------*/
void
-setToRange (operand * op, int to, bool check)
+setToRange (operand * op, int to, bool check, int fromLevel)
{
/* only for compiler defined temps */
if (!IS_ITEMP (op))
return;
+ if (fromLevel > OP_SYMBOL(op)->level) {
+ // this is from an inner block and thus has no authority
+ return;
+ }
+
OP_SYMBOL (op)->key = op->key;
hTabAddItemIfNotP (&liveRanges, op->key, OP_SYMBOL (op));
/* found it : mark */
if (lic) torange = lic->prev->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 */
- if (ebp->partOfLoop
- && hasIncomingDefs (ebp->partOfLoop, op))
- {
- torange = findLoopEndSeq (ebp->partOfLoop);
- }
-
+
op = operandFromOperand (op);
- setToRange (op, torange, FALSE);
+ setToRange (op, torange, FALSE, ebp->entryLabel->level);
}
ic->uses = bitVectSetBit (ic->uses, op->key);
bitVect *defsUsed = NULL;
bitVect *defsNotUsed = NULL;
int i;
+
/* for all the instructions */
for (ic = ebp->sch; ic; ic = ic->next)
{
-
if (ic->op == CALL || ic->op == PCALL)
{
setFromRange (IC_RESULT (ic), ic->seq);
and take it away from the defs for the block */
if (bitVectIsZero (OP_SYMBOL (IC_RESULT (ic))->uses))
{
- setToRange (IC_RESULT (ic), ic->seq, FALSE);
+ setToRange (IC_RESULT (ic), ic->seq, FALSE,
+ ebp->entryLabel->level);
bitVectUnSetBit (ebp->defSet, ic->key);
}
}
defUsedAfterLoop (IC_RESULT (dic), ebp->lSeq))
continue;
- setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE);
+ setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE,
+ ebp->entryLabel->level);
}
}
}
if (bitVectBitValue (defsNotUsed, i) &&
(dic = hTabItemWithKey (iCodehTab, i)))
{
-
- setToRange (IC_RESULT (dic), (ebp->fSeq - 1), TRUE);
+ setToRange (IC_RESULT (dic), (ebp->fSeq - 1), TRUE,
+ ebp->entryLabel->level);
}
}
}
void computeLiveRanges (eBBlock **, int);
void setFromRange (operand *, int);
-void setToRange (operand *, int, bool);
+void setToRange (operand *, int, bool, int);
#endif
/* update the sym's liverange */
if ( OP_LIVETO(op) < ic->seq )
- setToRange(op, ic->seq, FALSE);
+ setToRange(op, ic->seq, FALSE, OP_SYMBOL(op)->level);
/* remove the assignment iCode now that its result is unused */
remiCodeFromeBBlock (ebp, assignment);