From 44eff090172fe33c4fa48eb88ed3f1bb2d10be28 Mon Sep 17 00:00:00 2001 From: johanknol Date: Tue, 25 Mar 2003 20:28:36 +0000 Subject: [PATCH] This should fix some, if not all, of the live range problems git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2416 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/SDCCBBlock.c | 4 ++-- src/SDCCloop.c | 31 +------------------------------ src/SDCClrange.c | 31 +++++++++++++++---------------- src/SDCClrange.h | 2 +- src/mcs51/ralloc.c | 2 +- 5 files changed, 20 insertions(+), 50 deletions(-) diff --git a/src/SDCCBBlock.c b/src/SDCCBBlock.c index dfa15ce2..5b12ef0a 100644 --- a/src/SDCCBBlock.c +++ b/src/SDCCBBlock.c @@ -188,9 +188,9 @@ dumpEbbsToFileExt (int id, eBBlock ** ebbs, int count) 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); diff --git a/src/SDCCloop.c b/src/SDCCloop.c index 55021f34..f43e4837 100644 --- a/src/SDCCloop.c +++ b/src/SDCCloop.c @@ -259,11 +259,8 @@ DEFSETFUNC (createLoop) { 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)) @@ -283,32 +280,6 @@ DEFSETFUNC (createLoop) 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; @@ -1183,7 +1154,7 @@ createLoopRegions (eBBlock ** ebbs, int count) /* 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 */ diff --git a/src/SDCClrange.c b/src/SDCClrange.c index 33dddbad..96753294 100644 --- a/src/SDCClrange.c +++ b/src/SDCClrange.c @@ -175,12 +175,17 @@ setFromRange (operand * op, int from) /* 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)); @@ -315,17 +320,9 @@ 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); + setToRange (op, torange, FALSE, ebp->entryLabel->level); } ic->uses = bitVectSetBit (ic->uses, op->key); @@ -427,10 +424,10 @@ markLiveRanges (eBBlock * ebp, eBBlock ** ebbs, int count) 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); @@ -439,7 +436,8 @@ 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); + setToRange (IC_RESULT (ic), ic->seq, FALSE, + ebp->entryLabel->level); bitVectUnSetBit (ebp->defSet, ic->key); } } @@ -511,7 +509,8 @@ markLiveRanges (eBBlock * ebp, eBBlock ** ebbs, int count) defUsedAfterLoop (IC_RESULT (dic), ebp->lSeq)) continue; - setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE); + setToRange (IC_RESULT (dic), (ebp->lSeq), FALSE, + ebp->entryLabel->level); } } } @@ -541,8 +540,8 @@ markLiveRanges (eBBlock * ebp, eBBlock ** ebbs, int count) 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); } } } diff --git a/src/SDCClrange.h b/src/SDCClrange.h index f1785407..6c2441d8 100644 --- a/src/SDCClrange.h +++ b/src/SDCClrange.h @@ -35,6 +35,6 @@ bool allDefsOutOfRange (bitVect *, int, int); void computeLiveRanges (eBBlock **, int); void setFromRange (operand *, int); -void setToRange (operand *, int, bool); +void setToRange (operand *, int, bool, int); #endif diff --git a/src/mcs51/ralloc.c b/src/mcs51/ralloc.c index bf3d162f..6be33c02 100644 --- a/src/mcs51/ralloc.c +++ b/src/mcs51/ralloc.c @@ -2007,7 +2007,7 @@ reassignAliasedSym (eBBlock *ebp, iCode *assignment, iCode *use, operand *op) /* 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); -- 2.30.2