From d8c236efd1a19e0622511f35efb1de0c181eab29 Mon Sep 17 00:00:00 2001 From: kflittner Date: Sun, 23 Nov 2003 12:43:30 +0000 Subject: [PATCH] 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 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3025 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 16 +++++++++++++++ src/SDCCbitv.c | 13 ++++++++++++ src/SDCCbitv.h | 1 + src/SDCClrange.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ src/SDCClrange.h | 1 + src/avr/ralloc.c | 4 ++++ src/ds390/ralloc.c | 4 ++++ src/hc08/ralloc.c | 4 ++++ src/mcs51/ralloc.c | 5 ++++- src/pic/ralloc.c | 4 ++++ src/pic16/ralloc.c | 4 ++++ src/xa51/ralloc.c | 6 +++++- src/z80/ralloc.c | 4 ++++ 13 files changed, 114 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 63aa3a67..f9ad25cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2003-11-23 Klaus Flittner + + 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 * src/SDCCloop.c (newInduction): fixed bug #845630 diff --git a/src/SDCCbitv.c b/src/SDCCbitv.c index da8c692a..987d5bef 100644 --- a/src/SDCCbitv.c +++ b/src/SDCCbitv.c @@ -49,6 +49,19 @@ newBitVect (int size) 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 */ /*-----------------------------------------------------------------*/ diff --git a/src/SDCCbitv.h b/src/SDCCbitv.h index c6115cac..b20744ba 100644 --- a/src/SDCCbitv.h +++ b/src/SDCCbitv.h @@ -44,6 +44,7 @@ extern int bitVectDefault; /*-----------------------------------------------------------------*/ /* bitvector related functions */ bitVect *newBitVect (int); +void freeBitVect (bitVect *); bitVect *bitVectResize (bitVect *, int); bitVect *bitVectSetBit (bitVect *, int); void bitVectUnSetBit (bitVect *, int); diff --git a/src/SDCClrange.c b/src/SDCClrange.c index b33428c3..58e2f616 100644 --- a/src/SDCClrange.c +++ b/src/SDCClrange.c @@ -332,6 +332,28 @@ incUsed (iCode *ic, operand *op) 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 */ /*-----------------------------------------------------------------*/ @@ -648,3 +670,31 @@ computeLiveRanges (eBBlock ** ebbs, int count) 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); +} + diff --git a/src/SDCClrange.h b/src/SDCClrange.h index 73453527..a422e1f4 100644 --- a/src/SDCClrange.h +++ b/src/SDCClrange.h @@ -33,6 +33,7 @@ extern hTab *iCodeSeqhTab; 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); diff --git a/src/avr/ralloc.c b/src/avr/ralloc.c index 134286c4..abecd394 100644 --- a/src/avr/ralloc.c +++ b/src/avr/ralloc.c @@ -2230,6 +2230,10 @@ avr_assignRegisters (eBBlock ** ebbs, int 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); diff --git a/src/ds390/ralloc.c b/src/ds390/ralloc.c index 4a18d00d..042eb500 100644 --- a/src/ds390/ralloc.c +++ b/src/ds390/ralloc.c @@ -3026,6 +3026,10 @@ ds390_assignRegisters (eBBlock ** ebbs, int 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); diff --git a/src/hc08/ralloc.c b/src/hc08/ralloc.c index 606fed3e..82abbb0f 100644 --- a/src/hc08/ralloc.c +++ b/src/hc08/ralloc.c @@ -2994,6 +2994,10 @@ hc08_assignRegisters (eBBlock ** ebbs, int 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); diff --git a/src/mcs51/ralloc.c b/src/mcs51/ralloc.c index 11ddf374..163c2c54 100644 --- a/src/mcs51/ralloc.c +++ b/src/mcs51/ralloc.c @@ -2881,7 +2881,10 @@ mcs51_assignRegisters (eBBlock ** ebbs, int 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); diff --git a/src/pic/ralloc.c b/src/pic/ralloc.c index 3fa1870e..f191dd51 100644 --- a/src/pic/ralloc.c +++ b/src/pic/ralloc.c @@ -3848,6 +3848,10 @@ pic14_assignRegisters (eBBlock ** ebbs, int count) } + /* liveranges probably changed by register packing + so we compute them again */ + recomputeLiveRanges (ebbs, count); + if (options.dump_pack) dumpEbbsToFileExt (DUMP_PACK, ebbs, count); diff --git a/src/pic16/ralloc.c b/src/pic16/ralloc.c index c2de61d9..41de32e8 100644 --- a/src/pic16/ralloc.c +++ b/src/pic16/ralloc.c @@ -3842,6 +3842,10 @@ pic16_assignRegisters (eBBlock ** ebbs, int count) } + /* liveranges probably changed by register packing + so we compute them again */ + recomputeLiveRanges (ebbs, count); + if (options.dump_pack) dumpEbbsToFileExt (DUMP_PACK, ebbs, count); diff --git a/src/xa51/ralloc.c b/src/xa51/ralloc.c index aace8579..1f530ece 100755 --- a/src/xa51/ralloc.c +++ b/src/xa51/ralloc.c @@ -2054,7 +2054,11 @@ xa51_assignRegisters (eBBlock ** ebbs, int 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); diff --git a/src/z80/ralloc.c b/src/z80/ralloc.c index 99513386..0b7b03d3 100644 --- a/src/z80/ralloc.c +++ b/src/z80/ralloc.c @@ -3014,6 +3014,10 @@ z80_assignRegisters (eBBlock ** ebbs, int 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); -- 2.47.2