X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=456db5121be50cd3eef6a068f2285b2999c3e201;hb=18164f9abb336d8dd61c150a8fe12fcf9a170f8c;hp=5e09ba08dab41ec7683cfcf04884bf9b43b04c83;hpb=29779804200986ce903b5086441b49265a122dc5;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index 5e09ba08..456db512 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -253,26 +253,25 @@ DEFSETFUNC (findCheaperOp) /* do a special check this will help in */ /* constant propagation & dead code elim */ /* for assignments only */ - if (cdp->diCode->op == '=') - { - /* if the result is volatile then return result */ - if (IS_OP_VOLATILE (IC_RESULT (cdp->diCode))) - *opp = IC_RESULT (cdp->diCode); - else - /* if this is a straight assignment and - left is a temp then prefer the temporary to the - true symbol */ - if (!POINTER_SET (cdp->diCode) && - IS_ITEMP (IC_RESULT (cdp->diCode)) && - IS_TRUE_SYMOP (IC_RIGHT (cdp->diCode))) + if (cdp->diCode->op == '=') { + /* if the result is volatile then return result */ + if (IS_OP_VOLATILE (IC_RESULT (cdp->diCode))) + *opp = IC_RESULT (cdp->diCode); + else + /* if this is a straight assignment and + left is a temp then prefer the temporary to the + true symbol */ + if (!POINTER_SET (cdp->diCode) && + IS_ITEMP (IC_RESULT (cdp->diCode)) && + IS_TRUE_SYMOP (IC_RIGHT (cdp->diCode))) *opp = IC_RESULT (cdp->diCode); - else + else { /* if straight assignement && and both are temps then prefer the one that will not need extra space to spil, also take into consideration if right side an induction variable - */ + */ if (!POINTER_SET (cdp->diCode) && IS_ITEMP (IC_RESULT (cdp->diCode)) && IS_ITEMP (IC_RIGHT (cdp->diCode)) && @@ -281,12 +280,12 @@ DEFSETFUNC (findCheaperOp) SPIL_LOC (IC_RESULT (cdp->diCode))) || (SPIL_LOC (IC_RESULT (cdp->diCode)) && SPIL_LOC (IC_RESULT (cdp->diCode)) == - SPIL_LOC (IC_RIGHT (cdp->diCode)))) - ) - *opp = IC_RESULT (cdp->diCode); - else - *opp = IC_RIGHT (cdp->diCode); - } + SPIL_LOC (IC_RIGHT (cdp->diCode))))) + *opp = IC_RESULT (cdp->diCode); + else + *opp = IC_RIGHT (cdp->diCode); + } + } else *opp = IC_RESULT (cdp->diCode); } @@ -301,7 +300,9 @@ DEFSETFUNC (findCheaperOp) IS_ITEMP (IC_RESULT (cdp->diCode))) *opp = IC_RESULT (cdp->diCode); - if (*opp) + if ((*opp) && + (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp))) && + (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp)))) { if ((isGlobalInNearSpace (cop) && @@ -328,7 +329,7 @@ DEFSETFUNC (findCheaperOp) return 1; } - + *opp=NULL; return 0; } @@ -820,7 +821,7 @@ algebraicOpts (iCode * ic) SET_ISADDR (IC_RESULT (ic), 0); } /* if casting to the same */ - if (checkType (operandType (IC_RESULT (ic)), + if (compareType (operandType (IC_RESULT (ic)), operandType (IC_RIGHT (ic))) == 1) { ic->op = '='; @@ -868,6 +869,8 @@ updateSpillLocation (iCode * ic) if (!IC_RIGHT (ic)->noSpilLoc && !IS_VOLATILE (setype) && !IN_FARSPACE (SPEC_OCLS (setype)) && + /* PENDING */ + !TARGET_IS_Z80 && !OTHERS_PARM (OP_SYMBOL (IC_RESULT (ic)))) SPIL_LOC (IC_RIGHT (ic)) = @@ -885,6 +888,8 @@ updateSpillLocation (iCode * ic) if (!IC_RIGHT (ic)->noSpilLoc && !IS_VOLATILE (setype) && !IN_FARSPACE (SPEC_OCLS (setype)) && + /* PENDING */ + !TARGET_IS_Z80 && !OTHERS_PARM (OP_SYMBOL (IC_RESULT (ic)))) SPIL_LOC (IC_RIGHT (ic)) = @@ -1159,8 +1164,10 @@ deleteGetPointers (set ** cseSet, set ** pss, operand * op, eBBlock * ebb) list . This will take care of situations like iTemp1 = iTemp0 + 8; iTemp2 = iTemp1 + 8; */ - if (isinSetWith (compItems, IC_LEFT (cdp->diCode), isOperandEqual) || - isinSetWith (compItems, IC_RIGHT (cdp->diCode), isOperandEqual)) + if (isinSetWith (compItems, (void*)IC_LEFT (cdp->diCode), + (insetwithFunc)isOperandEqual) || + isinSetWith (compItems, (void*)IC_RIGHT (cdp->diCode), + (insetwithFunc)isOperandEqual)) { addSet (&compItems, IC_RESULT (cdp->diCode)); } @@ -1212,7 +1219,7 @@ fixUpTypes (iCode * ic) { sym_link *t1 = operandType (IC_LEFT (ic)), *t2; - if (IS_DS390_PORT) + if (TARGET_IS_DS390) { /* hack-o-matic! */ return; @@ -1221,7 +1228,7 @@ fixUpTypes (iCode * ic) /* for pointer_gets if the types of result & left r the same then change it type of result to next */ if (IS_PTR (t1) && - checkType (t2 = operandType (IC_RESULT (ic)), t1) == 1) + compareType (t2 = operandType (IC_RESULT (ic)), t1) == 1) { setOperandType (IC_RESULT (ic), t2->next); } @@ -1493,7 +1500,7 @@ cseBBlock (eBBlock * ebb, int computeOnly, !computeOnly) { applyToSet (cseSet, findPrevIc, ic, &pdic); - if (pdic && checkType (operandType (IC_RESULT (pdic)), + if (pdic && compareType (operandType (IC_RESULT (pdic)), operandType (IC_RESULT (ic))) != 1) pdic = NULL; }