X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2FSDCCcse.c;h=01f5ed656b84234a2a93b2b647646bde9aac4b92;hb=43b2ad2eaedf25d3b9e0b873951bb645fd9ea96d;hp=e98b3724522cc7253bd646930e214ab45a1172f1;hpb=9a33d11ed4da527058a0407d9ae493865430f316;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index e98b3724..01f5ed65 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -276,6 +276,7 @@ DEFSETFUNC (findCheaperOp) IS_ITEMP (IC_RESULT (cdp->diCode)) && IS_ITEMP (IC_RIGHT (cdp->diCode)) && !OP_SYMBOL (IC_RIGHT (cdp->diCode))->isind && + !OP_SYMBOL(IC_RIGHT (cdp->diCode))->isreqv && ((!SPIL_LOC (IC_RIGHT (cdp->diCode)) && SPIL_LOC (IC_RESULT (cdp->diCode))) || (SPIL_LOC (IC_RESULT (cdp->diCode)) && @@ -301,8 +302,14 @@ DEFSETFUNC (findCheaperOp) *opp = IC_RESULT (cdp->diCode); if ((*opp) && - (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp))) && - (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp)))) + (isOperandLiteral(*opp) || +#if 0 // jwk: because of bug #480645, this is clumsy anyway. E.g. + getSize(operandType(*opp)) == getSize(operandType(cop)) || + (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp)) && + (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp)))))) +#else + compareType(operandType(*opp), operandType(cop))==1)) +#endif { if ((isGlobalInNearSpace (cop) && @@ -375,7 +382,7 @@ DEFSETFUNC (findPrevIc) if (isiCodeEqual (ic, cdp->diCode) && isOperandEqual (cdp->sym, IC_RESULT (cdp->diCode))) { - *icp = cdp->diCode; + *icp = cdp->diCode; return 1; } @@ -393,6 +400,20 @@ DEFSETFUNC (findPrevIc) return 0; } +/*-------------------------------------------------------------------*/ +/* ifAssignedFromGlobal - if definition is an assignment from global */ +/*-------------------------------------------------------------------*/ +DEFSETFUNC (ifAssignedFromGlobal) +{ + cseDef *cdp = item; + iCode *dic=cdp->diCode; + + if (dic->op=='=' && isOperandGlobal(IC_RIGHT(dic))) { + return 1; + } + return 0; +} + /*-----------------------------------------------------------------*/ /* ifDefGlobal - if definition is global */ /*-----------------------------------------------------------------*/ @@ -1287,6 +1308,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, iCode *pdic; operand *pdop; iCode *defic; + + ic->eBBlockNum = ebb->bbnum; if (SKIP_IC2 (ic)) continue; @@ -1316,6 +1339,10 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* delete global variables from the cseSet since they can be modified by the function call */ deleteItemIf (&cseSet, ifDefGlobal); + + /* and also itemps assigned from globals */ + deleteItemIf (&cseSet, ifAssignedFromGlobal); + /* delete all getpointer iCodes from cseSet, this should be done only for global arrays & pointers but at this point we don't know if globals, so to be safe do all */ @@ -1473,7 +1500,6 @@ cseBBlock (eBBlock * ebb, int computeOnly, applyToSetFTrue (cseSet, findCheaperOp, IC_RIGHT (ic), &pdop); if (pdop) { - IC_RIGHT (ic) = pdop; change = 1; } @@ -1509,73 +1535,29 @@ cseBBlock (eBBlock * ebb, int computeOnly, IS_ITEMP (IC_RESULT (ic)) && !computeOnly) { - applyToSet (cseSet, findPrevIc, ic, &pdic); + applyToSet (cseSet, findPrevIc, ic, &pdic); if (pdic && compareType (operandType (IC_RESULT (pdic)), operandType (IC_RESULT (ic))) != 1) pdic = NULL; + if (pdic && port->cseOk && (*port->cseOk)(ic,pdic) == 0) + pdic = NULL; } - /* if found then eliminate this and add to */ - /* to cseSet an element containing result */ - /* of this with previous opcode */ - if (pdic) - { - if (IS_ITEMP (IC_RESULT (ic))) - { - - if (pdic->level > ic->level) { - // pdic was inside an inner loop - continue; - } - - /* replace in the remaining of this block */ - replaceAllSymBySym (ic->next, IC_RESULT (ic), IC_RESULT (pdic), &ebb->ndompset); - /* remove this iCode from inexpressions of all - its successors, it cannot be in the in expressions - of any of the predecessors */ - for (i = 0; i < count; ebbs[i++]->visited = 0); - applyToSet (ebb->succList, removeFromInExprs, ic, IC_RESULT (ic), - IC_RESULT (pdic), ebb); - - /* if this was moved from another block */ - /* then replace in those blocks too */ - if (ic->movedFrom) - { - eBBlock *owner; - for (owner = setFirstItem (ic->movedFrom); owner; - owner = setNextItem (ic->movedFrom)) - replaceAllSymBySym (owner->sch, IC_RESULT (ic), IC_RESULT (pdic), &owner->ndompset); - } - pdic->movedFrom = unionSets (pdic->movedFrom, ic->movedFrom, THROW_NONE); - } - else - addSetHead (&cseSet, newCseDef (IC_RESULT (ic), pdic)); - - if (!computeOnly) - /* eliminate this */ - remiCodeFromeBBlock (ebb, ic); - - defic = pdic; - change++; - - if (IS_ITEMP (IC_RESULT (ic))) - continue; - - } - else - { - - /* just add this as a previous expression except in */ - /* case of a pointer access in which case this is a */ - /* usage not a definition */ - if (!(POINTER_SET (ic)) && IC_RESULT (ic)) - { - deleteItemIf (&cseSet, ifDefSymIsX, IC_RESULT (ic)); - addSetHead (&cseSet, newCseDef (IC_RESULT (ic), ic)); - } - defic = ic; + /* Alternate code */ + if (pdic && IS_ITEMP(IC_RESULT(ic))) { + /* if previous definition found change this to an assignment */ + ic->op = '='; + IC_LEFT(ic) = NULL; + IC_RIGHT(ic) = operandFromOperand(IC_RESULT(pdic)); + SET_ISADDR(IC_RESULT(ic),0); + SET_ISADDR(IC_RIGHT (ic),0); + } - } + if (!(POINTER_SET (ic)) && IC_RESULT (ic)) { + deleteItemIf (&cseSet, ifDefSymIsX, IC_RESULT (ic)); + addSetHead (&cseSet, newCseDef (IC_RESULT (ic), ic)); + } + defic = ic; /* if assignment to a parameter which is not mine and type is a pointer then delete