git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3437
4a8a32a2-be11-0410-ad9d-
d568d2c75423
+2004-08-12 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
+
+ * src/SDCClrange.c (findPrevUse): fixed bug #1007371
+
2004-08-12 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
* src/SDCCsymt.h,
2004-08-12 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
* src/SDCCsymt.h,
int i;
bitVect * succVect;
bitVect * predVect;
int i;
bitVect * succVect;
bitVect * predVect;
/* 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 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;
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 */
/* 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 */
unvisitBlocks (ebbs, count);
predVect = newBitVect (count);
applyToSet (ebp->predList, findRecursivePred, predVect);
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++)
/* 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++)
if (bitVectBitValue(succVect, i) && bitVectBitValue(predVect, i))
markAlive (ebbs[i]->sch, ebbs[i]->ech, op->key);
}
if (bitVectBitValue(succVect, i) && bitVectBitValue(predVect, i))
markAlive (ebbs[i]->sch, ebbs[i]->ech, op->key);
}
freeBitVect (succVect);
freeBitVect (predVect);
}
freeBitVect (succVect);
freeBitVect (predVect);
}