From 3c9e14cbfc4a5438052fa94f16842286188557fa Mon Sep 17 00:00:00 2001 From: sandeep Date: Fri, 21 Dec 2001 05:08:22 +0000 Subject: [PATCH] Fixed a bug major in FillGaps , have to check uses for positioning also. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1720 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/ds390/ralloc.c | 19 +++++++++++++++++-- src/mcs51/ralloc.c | 25 ++++++++++++++++++++----- src/z80/ralloc.c | 17 ++++++++++++++++- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/ds390/ralloc.c b/src/ds390/ralloc.c index 527ffeb8..14b254db 100644 --- a/src/ds390/ralloc.c +++ b/src/ds390/ralloc.c @@ -1365,7 +1365,7 @@ static void fillGaps() sym->regs[i] = getRegGprNoSpil (); } - /* for all its definitions check if the registers + /* for all its definitions & uses check if the registers allocated needs positioning NOTE: we can position only ONCE if more than One positioning required then give up */ @@ -1388,10 +1388,25 @@ static void fillGaps() if (pdone > 1) break; } } + for (i = 0 ; i < sym->uses->size ; i++ ) { + if (bitVectBitValue(sym->uses,i)) { + iCode *ic; + if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ; + if (SKIP_IC(ic)) continue; + if (!IS_ASSIGN_ICODE(ic)) continue ; + + /* if result is assigned to registers */ + if (IS_SYMOP(IC_RESULT(ic)) && + bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) { + pdone += positionRegs(sym,OP_SYMBOL(IC_RESULT(ic))); + } + if (pdone > 1) break; + } + } /* had to position more than once GIVE UP */ if (pdone > 1) { /* UNDO all the changes we made to try this */ - sym->isspilt = 0; + sym->isspilt = 1; for (i=0; i < sym->nRegs ; i++ ) { sym->regs[i] = NULL; } diff --git a/src/mcs51/ralloc.c b/src/mcs51/ralloc.c index 1578ae1d..fcc86572 100644 --- a/src/mcs51/ralloc.c +++ b/src/mcs51/ralloc.c @@ -1316,6 +1316,9 @@ static void fillGaps() /* THERE IS HOPE !!!! */ for (i=0; i < sym->nRegs ; i++ ) { + if (sym->regType == REG_PTR) + sym->regs[i] = getRegPtrNoSpil (); + else sym->regs[i] = getRegGprNoSpil (); } @@ -1342,15 +1345,27 @@ static void fillGaps() if (pdone > 1) break; } } + for (i = 0 ; i < sym->uses->size ; i++ ) { + if (bitVectBitValue(sym->uses,i)) { + iCode *ic; + if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ; + if (SKIP_IC(ic)) continue; + if (!IS_ASSIGN_ICODE(ic)) continue ; + + /* if result is assigned to registers */ + if (IS_SYMOP(IC_RESULT(ic)) && + bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) { + pdone += positionRegs(sym,OP_SYMBOL(IC_RESULT(ic))); + } + if (pdone > 1) break; + } + } /* had to position more than once GIVE UP */ if (pdone > 1) { /* UNDO all the changes we made to try this */ - sym->isspilt = 0; + sym->isspilt = 1; for (i=0; i < sym->nRegs ; i++ ) { - if (sym->regType == REG_PTR) - sym->regs[i] = getRegPtrNoSpil (); - else - sym->regs[i] = getRegGprNoSpil (); + sym->regs[i] = NULL; } freeAllRegs(); D(printf ("Fill Gap gave up due to positioning for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN")); diff --git a/src/z80/ralloc.c b/src/z80/ralloc.c index b23b4b22..d73acaa0 100644 --- a/src/z80/ralloc.c +++ b/src/z80/ralloc.c @@ -1308,10 +1308,25 @@ static void fillGaps() if (pdone > 1) break; } } + for (i = 0 ; i < sym->uses->size ; i++ ) { + if (bitVectBitValue(sym->uses,i)) { + iCode *ic; + if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ; + if (SKIP_IC(ic)) continue; + if (!IS_ASSIGN_ICODE(ic)) continue ; + + /* if result is assigned to registers */ + if (IS_SYMOP(IC_RESULT(ic)) && + bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) { + pdone += positionRegs(sym,OP_SYMBOL(IC_RESULT(ic))); + } + if (pdone > 1) break; + } + } /* had to position more than once GIVE UP */ if (pdone > 1) { /* UNDO all the changes we made to try this */ - sym->isspilt = 0; + sym->isspilt = 1; for (i=0; i < sym->nRegs ; i++ ) { sym->regs[i] = NULL; } -- 2.47.2