From a6d6e6a047c0f429ae043d763dce7080dad8839b Mon Sep 17 00:00:00 2001 From: epetrich Date: Thu, 12 Aug 2004 04:42:43 +0000 Subject: [PATCH] * src/SDCClrange.c (findPrevUse): fixed bug #1007371 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3437 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 4 ++++ src/SDCClrange.c | 26 +++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6128f494..cb132395 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-08-12 Erik Petrich + + * src/SDCClrange.c (findPrevUse): fixed bug #1007371 + 2004-08-12 Erik Petrich * src/SDCCsymt.h, diff --git a/src/SDCClrange.c b/src/SDCClrange.c index 31a678b2..d99df74c 100644 --- a/src/SDCClrange.c +++ b/src/SDCClrange.c @@ -367,17 +367,33 @@ findPrevUse (eBBlock *ebp, iCode *ic, operand *op, eBBlock **ebbs, int count) int i; bitVect * succVect; bitVect * predVect; - + eBBlock * pred; + /* If liveness is already known, then a previous call to findNextUse() */ /* has already taken care of everything. */ if (ic && bitVectBitValue(ic->rlive, op->key)) return; - + + if (!ic) + { + /* We are at the start of a block. If the operand is alive at the */ + /* end of all predecessors, then a previous call to findNextUse() */ + /* has already taken care of everything. */ + + pred = setFirstItem (ebp->predList); + for (; pred; pred = setNextItem (ebp->predList)) + if (pred->ech && !bitVectBitValue(pred->ech->rlive, op->key)) + break; + + if (!pred) + return; + } + if (op->isaddr) OP_SYMBOL (op)->isptr = 1; OP_SYMBOL (op)->key = op->key; - + /* Otherwise, it appears that this symbol was used prior to definition. */ /* Just fix the live range; we'll deal with a diagnostic message elsewhere. */ /* If the symbol use was in a loop, we need to extend the live range to the */ @@ -388,7 +404,7 @@ findPrevUse (eBBlock *ebp, iCode *ic, operand *op, eBBlock **ebbs, int count) unvisitBlocks (ebbs, count); predVect = newBitVect (count); applyToSet (ebp->predList, findRecursivePred, predVect); - + /* Blocks that are both recursively predecessors and successors are in */ /* a loop with the current iCode. Mark the operand as alive in them. */ for (i = 0; i < count; i++) @@ -396,7 +412,7 @@ findPrevUse (eBBlock *ebp, iCode *ic, operand *op, eBBlock **ebbs, int count) if (bitVectBitValue(succVect, i) && bitVectBitValue(predVect, i)) markAlive (ebbs[i]->sch, ebbs[i]->ech, op->key); } - + freeBitVect (succVect); freeBitVect (predVect); } -- 2.30.2