{
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);
+ applyToSet (bEdges, createLoop, &allRegion, ebbs,count);
/* 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, int fromLevel)
+setToRange (operand * op, int to, bool check)
{
/* 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, ebp->entryLabel->level);
+ setToRange (op, torange, FALSE);
}
ic->uses = bitVectSetBit (ic->uses, op->key);
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,
- ebp->entryLabel->level);
+ setToRange (IC_RESULT (ic), ic->seq, FALSE);
bitVectUnSetBit (ebp->defSet, ic->key);
}
}
defUsedAfterLoop (IC_RESULT (dic), ebp->lSeq))
continue;
- setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE,
- ebp->entryLabel->level);
+ setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE);
}
}
}
if (bitVectBitValue (defsNotUsed, i) &&
(dic = hTabItemWithKey (iCodehTab, i)))
{
- setToRange (IC_RESULT (dic), (ebp->fSeq - 1), TRUE,
- ebp->entryLabel->level);
+ setToRange (IC_RESULT (dic), (ebp->fSeq - 1), TRUE);
}
}
}
void computeLiveRanges (eBBlock **, int);
void setFromRange (operand *, int);
-void setToRange (operand *, int, bool, int);
+void setToRange (operand *, int, bool);
#endif
/* update the sym's liverange */
if ( OP_LIVETO(op) < ic->seq )
- setToRange(op, ic->seq, FALSE, OP_SYMBOL(op)->level);
+ setToRange(op, ic->seq, FALSE);
/* remove the assignment iCode now that its result is unused */
remiCodeFromeBBlock (ebp, assignment);