From 6401e66edb7cff7794e45b323eddab1a5de0e0af Mon Sep 17 00:00:00 2001 From: epetrich Date: Thu, 23 Sep 2004 05:11:43 +0000 Subject: [PATCH] * src/SDCCicode.h, * src/SDCCicode.c (isiCodeInFunctionCall), * src/avr/ralloc.c (selectSpil), * src/pic/ralloc.c (selectSpil), * src/pic16/ralloc.c (selectSpil), * src/ds390/ralloc.c (selectSpil), * src/hc08/ralloc.c (selectSpil), * src/xa51/ralloc.c (selectSpil), * src/mcs51/ralloc.c (selectSpil): Don't use remainSpil to spill to the stack in the middle of a function call sequence (fixes bug #1020268) * src/SDCCicode.c (geniCodeJumpTable): fixed error in computing the costs associated with the minimum switch case. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3505 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 15 +++++++++++++ src/SDCCicode.c | 55 ++++++++++++++++++++++++++++++++++++++++++---- src/SDCCicode.h | 1 + src/avr/ralloc.c | 3 ++- src/ds390/ralloc.c | 4 +++- src/hc08/ralloc.c | 4 +++- src/mcs51/ralloc.c | 6 ++++- src/pic/ralloc.c | 4 +++- src/pic16/ralloc.c | 4 +++- src/xa51/ralloc.c | 4 +++- 10 files changed, 89 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9f001e7c..aff7f576 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2004-09-23 Erik Petrich + + * src/SDCCicode.h, + * src/SDCCicode.c (isiCodeInFunctionCall), + * src/avr/ralloc.c (selectSpil), + * src/pic/ralloc.c (selectSpil), + * src/pic16/ralloc.c (selectSpil), + * src/ds390/ralloc.c (selectSpil), + * src/hc08/ralloc.c (selectSpil), + * src/xa51/ralloc.c (selectSpil), + * src/mcs51/ralloc.c (selectSpil): Don't use remainSpil to spill to the + stack in the middle of a function call sequence (fixes bug #1020268) + * src/SDCCicode.c (geniCodeJumpTable): fixed error in computing the + costs associated with the minimum switch case. + 2004-09-19 Erik Petrich * src/SDCC.lex: fixed bug #1030549 diff --git a/src/SDCCicode.c b/src/SDCCicode.c index 6c217d45..fb6c0224 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -399,6 +399,9 @@ PRINTFUNC (picGenericOne) if (ic->op == SEND || ic->op == RECEIVE) { fprintf(of,"{argreg = %d}",ic->argreg); } + if (ic->op == IPUSH) { + fprintf(of,"{parmPush = %d}",ic->parmPush); + } fprintf (of, "\n"); } @@ -1039,6 +1042,40 @@ isOclsExpensive (struct memmap *oclass) return IN_FARSPACE (oclass); } +/*-----------------------------------------------------------------*/ +/* isiCodeInFunctionCall - return TRUE if an iCode is between a */ +/* CALL/PCALL and the first IPUSH/SEND associated with the call */ +/*-----------------------------------------------------------------*/ +int +isiCodeInFunctionCall (iCode * ic) +{ + iCode * lic = ic; + + /* Find the next CALL/PCALL */ + while (lic) + { + if (lic->op == CALL || lic->op == PCALL) + break; + lic = lic->next; + } + + if (!lic) + return FALSE; + + /* A function call was found. Scan backwards and see if an */ + /* IPUSH or SEND is encountered */ + while (ic) + { + if (lic != ic && (ic->op == CALL || ic->op == PCALL)) + return FALSE; + if (ic->op == SEND || (ic->op == IPUSH && ic->parmPush)) + return TRUE; + ic = ic->prev; + } + + return FALSE; +} + /*-----------------------------------------------------------------*/ /* operandLitValue - literal value of an operand */ /*-----------------------------------------------------------------*/ @@ -3491,7 +3528,7 @@ geniCodeJumpTable (operand * cond, value * caseVals, ast * tree) int needRangeCheck = !optimize.noJTabBoundary || tree->values.switchVals.swDefault; sym_link *cetype = getSpec (operandType (cond)); - int sizeofMinCost, sizeofMaxCost; + int sizeofMinCost, sizeofZeroMinCost, sizeofMaxCost; int sizeofMatchJump, sizeofJumpTable; int sizeIndex; @@ -3527,11 +3564,14 @@ geniCodeJumpTable (operand * cond, value * caseVals, ast * tree) /* Compute the size cost of the range check and subtraction. */ sizeofMinCost = 0; + sizeofZeroMinCost = 0; sizeofMaxCost = 0; if (needRangeCheck) { if (!(min==0 && IS_UNSIGNED (cetype))) sizeofMinCost = port->jumptableCost.sizeofRangeCompare[sizeIndex]; + if (!IS_UNSIGNED (cetype)) + sizeofZeroMinCost = port->jumptableCost.sizeofRangeCompare[sizeIndex]; sizeofMaxCost = port->jumptableCost.sizeofRangeCompare[sizeIndex]; } if (min) @@ -3540,11 +3580,18 @@ geniCodeJumpTable (operand * cond, value * caseVals, ast * tree) /* If the size cost of handling a non-zero minimum exceeds the */ /* cost of extending the range down to zero, then it might be */ /* better to extend the range to zero. */ - if (min > 0 && sizeofMinCost >= (min * port->jumptableCost.sizeofElement)) + if (min > 0 && (sizeofMinCost-sizeofZeroMinCost) + >= (min * port->jumptableCost.sizeofElement)) { /* Only extend the jump table if it would still be manageable. */ if (1 + max <= port->jumptableCost.maxCount) - min = 0; + { + min = 0; + if (IS_UNSIGNED (cetype)) + sizeofMinCost = 0; + else + sizeofMinCost = port->jumptableCost.sizeofRangeCompare[sizeIndex]; + } } /* Compute the total size cost of a jump table. */ @@ -3554,7 +3601,7 @@ geniCodeJumpTable (operand * cond, value * caseVals, ast * tree) /* Compute the total size cost of a match & jump sequence */ sizeofMatchJump = cnt * port->jumptableCost.sizeofMatchJump[sizeIndex]; - + /* If the size cost of the jump table is uneconomical then exit */ if (sizeofMatchJump < sizeofJumpTable) return 0; diff --git a/src/SDCCicode.h b/src/SDCCicode.h index e5dbe9d8..98469dba 100644 --- a/src/SDCCicode.h +++ b/src/SDCCicode.h @@ -326,6 +326,7 @@ operand *opFromOpWithDU (operand *, bitVect *, bitVect *); iCode *copyiCode (iCode *); operand *newiTempFromOp (operand *); iCode *getBuiltinParms (iCode *,int *, operand **); +int isiCodeInFunctionCall (iCode *); /*-----------------------------------------------------------------*/ /* declaration of exported variables */ /*-----------------------------------------------------------------*/ diff --git a/src/avr/ralloc.c b/src/avr/ralloc.c index 706ae3ce..4724d789 100644 --- a/src/avr/ralloc.c +++ b/src/avr/ralloc.c @@ -901,7 +901,8 @@ selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) /* check if there are any live ranges that not used in the remainder of the block */ if (!_G.blockSpil && - (selectS = + !isiCodeInFunctionCall (ic) && + (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) { sym = leastUsedLR (selectS); if (sym != forSym) { diff --git a/src/ds390/ralloc.c b/src/ds390/ralloc.c index e75a587f..def06af2 100644 --- a/src/ds390/ralloc.c +++ b/src/ds390/ralloc.c @@ -685,7 +685,9 @@ selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) /* check if there are any live ranges that not used in the remainder of the block */ - if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) + if (!_G.blockSpil && + !isiCodeInFunctionCall (ic) && + (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) { sym = leastUsedLR (selectS); if (sym != forSym) diff --git a/src/hc08/ralloc.c b/src/hc08/ralloc.c index a4dc8526..175f83dd 100644 --- a/src/hc08/ralloc.c +++ b/src/hc08/ralloc.c @@ -738,7 +738,9 @@ selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) /* check if there are any live ranges that not used in the remainder of the block */ - if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) + if (!_G.blockSpil && + !isiCodeInFunctionCall (ic) && + (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) { sym = leastUsedLR (selectS); if (sym != forSym) diff --git a/src/mcs51/ralloc.c b/src/mcs51/ralloc.c index 0d4181a2..5ec469ba 100644 --- a/src/mcs51/ralloc.c +++ b/src/mcs51/ralloc.c @@ -620,6 +620,8 @@ spillThis (symbol * sym) return; } + + /*-----------------------------------------------------------------*/ /* selectSpil - select a iTemp to spil : rather a simple procedure */ /*-----------------------------------------------------------------*/ @@ -675,7 +677,9 @@ selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) /* check if there are any live ranges that not used in the remainder of the block */ - if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) + if (!_G.blockSpil && + !isiCodeInFunctionCall (ic) && + (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) { sym = leastUsedLR (selectS); if (sym != forSym) diff --git a/src/pic/ralloc.c b/src/pic/ralloc.c index fcf12608..87680630 100644 --- a/src/pic/ralloc.c +++ b/src/pic/ralloc.c @@ -1800,7 +1800,9 @@ selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) /* check if there are any live ranges that not used in the remainder of the block */ - if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) + if (!_G.blockSpil && + !isiCodeInFunctionCall (ic) && + (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) { sym = leastUsedLR (selectS); if (!sym->remat) diff --git a/src/pic16/ralloc.c b/src/pic16/ralloc.c index d06ecc89..3e6c3f03 100644 --- a/src/pic16/ralloc.c +++ b/src/pic16/ralloc.c @@ -1734,7 +1734,9 @@ selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) /* check if there are any live ranges that not used in the remainder of the block */ - if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) + if (!_G.blockSpil && + !isiCodeInFunctionCall (ic) && + (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) { sym = leastUsedLR (selectS); if (!sym->remat) diff --git a/src/xa51/ralloc.c b/src/xa51/ralloc.c index 27c88a44..364895bd 100755 --- a/src/xa51/ralloc.c +++ b/src/xa51/ralloc.c @@ -655,7 +655,9 @@ selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) /* check if there are any live ranges that not used in the remainder of the block */ - if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) + if (!_G.blockSpil && + !isiCodeInFunctionCall (ic) && + (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) { sym = leastUsedLR (selectS); if (sym != forSym) -- 2.30.2