X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCClrange.c;h=a85c5ff19b64fa6c5eb532e1058650473e4c6375;hb=633d4639c3ebce5f6b7ef04223e5d7842f841a6b;hp=9675329467c89ab75194df9af2798ec2a1d62689;hpb=bc04edccb1ca8d1dafb8ae5c96b047005029b866;p=fw%2Fsdcc diff --git a/src/SDCClrange.c b/src/SDCClrange.c index 96753294..a85c5ff1 100644 --- a/src/SDCClrange.c +++ b/src/SDCClrange.c @@ -175,17 +175,12 @@ setFromRange (operand * op, int from) /* 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)); @@ -320,9 +315,17 @@ operandLUse (operand * op, eBBlock ** ebbs, /* 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); @@ -436,8 +439,7 @@ markLiveRanges (eBBlock * ebp, eBBlock ** ebbs, int count) 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); } } @@ -509,8 +511,7 @@ markLiveRanges (eBBlock * ebp, eBBlock ** ebbs, int count) defUsedAfterLoop (IC_RESULT (dic), ebp->lSeq)) continue; - setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE, - ebp->entryLabel->level); + setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE); } } } @@ -540,8 +541,7 @@ markLiveRanges (eBBlock * ebp, eBBlock ** ebbs, int count) 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); } } }