X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=0434ea0190362064cd917ed4dd270071c03524bd;hb=6e53662159f26dc290834c15c2cdf741bbca8a5e;hp=a8e0e005468661be1145a973781061bac8d6cb3b;hpb=fa957afc1b80b11a18e973e8249dfa40b59ce280;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index a8e0e005..0434ea01 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -272,19 +272,6 @@ DEFSETFUNC (findCheaperOp) take into consideration if right side an induction variable */ - -#if SomeOneUnderStandsThis - /* This causes the bug: - - void test (unsigned u) { - // the following cast is ignored - for (; (int) u >= 0;) - ++u; - } - } - - where casts are ignored */ - if (!POINTER_SET (cdp->diCode) && IS_ITEMP (IC_RESULT (cdp->diCode)) && IS_ITEMP (IC_RIGHT (cdp->diCode)) && @@ -297,7 +284,6 @@ DEFSETFUNC (findCheaperOp) *opp = IC_RESULT (cdp->diCode); else *opp = IC_RIGHT (cdp->diCode); -#endif } } else @@ -314,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) && @@ -341,7 +329,7 @@ DEFSETFUNC (findCheaperOp) return 1; } - + *opp=NULL; return 0; } @@ -833,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 = '='; @@ -1173,9 +1161,9 @@ deleteGetPointers (set ** cseSet, set ** pss, operand * op, eBBlock * ebb) iTemp1 = iTemp0 + 8; iTemp2 = iTemp1 + 8; */ if (isinSetWith (compItems, (void*)IC_LEFT (cdp->diCode), - (void*)isOperandEqual) || + (insetwithFunc)isOperandEqual) || isinSetWith (compItems, (void*)IC_RIGHT (cdp->diCode), - (void*)isOperandEqual)) + (insetwithFunc)isOperandEqual)) { addSet (&compItems, IC_RESULT (cdp->diCode)); } @@ -1236,7 +1224,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); } @@ -1508,7 +1496,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; }