+2003-11-23 Klaus Flittner <klaus_flittner@gmx.de>
+
+ fixed bug #845089
+ * src/SDCCbitv.h,
+ * src/SDCCbitv.c: added function to free a bitvector
+ * src/SDCClrange.h,
+ * src/SDCClrange.c: added function to recompute the liveranges
+ * src/avr/ralloc.c,
+ * src/ds390/ralloc.c,
+ * src/hc08/ralloc.c,
+ * src/mcs51/ralloc.c,
+ * src/pic/ralloc.c,
+ * src/pic16/ralloc.c,
+ * src/xa51/ralloc.c,
+ * src/z80/ralloc.c: recompute the liveranges after register packing
+
2003-11-21 Klaus Flittner <klaus_flittner@gmx.de>
* src/SDCCloop.c (newInduction): fixed bug #845630
return bvp;
}
+/*-----------------------------------------------------------------*/
+/* freeBitVect - frees the memory used by the bitVector */
+/*-----------------------------------------------------------------*/
+void
+freeBitVect (bitVect * bvp)
+{
+ if (!bvp)
+ return;
+
+ Safe_free (bvp->vect);
+ Safe_free (bvp);
+}
+
/*-----------------------------------------------------------------*/
/* bitVectResize - changes the size of a bit vector */
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
/* bitvector related functions */
bitVect *newBitVect (int);
+void freeBitVect (bitVect *);
bitVect *bitVectResize (bitVect *, int);
bitVect *bitVectSetBit (bitVect *, int);
void bitVectUnSetBit (bitVect *, int);
OP_SYMBOL (op)->used += 1;
}
+/*-----------------------------------------------------------------*/
+/* rliveClear - clears the rlive bitVectors */
+/*-----------------------------------------------------------------*/
+void
+rliveClear (eBBlock ** ebbs, int count)
+{
+ int i;
+
+ /* for all blocks do */
+ for (i = 0; i < count; i++)
+ {
+ iCode *ic;
+
+ /* for all instructions in this block do */
+ for (ic = ebbs[i]->sch; ic; ic = ic->next)
+ {
+ freeBitVect (ic->rlive);
+ ic->rlive = NULL;
+ }
+ }
+}
+
/*-----------------------------------------------------------------*/
/* rlivePoint - for each point compute the ranges that are alive */
/*-----------------------------------------------------------------*/
computeClash(ebbs, count);
}
+/*-----------------------------------------------------------------*/
+/* recomputeLiveRanges - recomputes the live ranges for variables */
+/*-----------------------------------------------------------------*/
+void
+recomputeLiveRanges (eBBlock ** ebbs, int count)
+{
+ symbol * sym;
+ int key;
+
+ /* clear all rlive bitVectors */
+ rliveClear (ebbs, count);
+
+ sym = hTabFirstItem (liveRanges, &key);
+ if (sym)
+ {
+ do {
+ sym->used = 0;
+ sym->liveFrom = 0;
+ sym->liveTo = 0;
+ freeBitVect (sym->clashes);
+ sym->clashes = NULL;
+ } while ( (sym = hTabNextItem (liveRanges, &key)));
+ }
+
+ /* do the LR computation again */
+ computeLiveRanges (ebbs, count);
+}
+
int notUsedInBlock (symbol *, eBBlock *, iCode *);
bool allDefsOutOfRange (bitVect *, int, int);
void computeLiveRanges (eBBlock **, int);
+void recomputeLiveRanges (eBBlock **, int);
void setFromRange (operand *, int);
void setToRange (operand *, int, bool);
for (i = 0; i < count; i++)
packRegisters (ebbs[i]);
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
+
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
for (i = 0; i < count; i++)
packRegisters (ebbs[i]);
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
+
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
for (i = 0; i < count; i++)
packRegisters (ebbs, i);
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
+
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
for (i = 0; i < count; i++)
packRegisters (ebbs, i);
-
+
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
}
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
+
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
}
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
+
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
live ranges reducing some register pressure */
for (i = 0; i < count; i++)
packRegisters (ebbs[i]);
-
+
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
+
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
for (i = 0; i < count; i++)
packRegisters (ebbs[i]);
+ /* liveranges probably changed by register packing
+ so we compute them again */
+ recomputeLiveRanges (ebbs, count);
+
if (options.dump_pack)
dumpEbbsToFileExt (DUMP_PACK, ebbs, count);