X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=df360ff09f15c35e2b404f836038c15a54ef321f;hb=bb939d05cb3f6e3e8f8d5cb10a63b8d48e07a085;hp=05c6e2e6ca5fa892d86a3accdec7452e07848938;hpb=ea914976dfeb8f841e6530ef6d81a778c8bc0e88;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index 05c6e2e6..df360ff0 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -144,11 +144,13 @@ pcseDef (void *item, va_list ap) void ReplaceOpWithCheaperOp(operand **op, operand *cop) { #ifdef RANGEHUNT - printf ("ReplaceOpWithCheaperOp %s with %s: ", - IS_SYMOP((*op)) ? OP_SYMBOL((*op))->name : "!SYM", - IS_SYMOP(cop) ? OP_SYMBOL(cop)->name : "!SYM"); + printf ("ReplaceOpWithCheaperOp\n\t"); + printOperand (*op, stdout); + printf ("\nwith\t"); + printOperand (cop, stdout); + // if op is a register equivalent - if (IS_ITEMP(cop) && OP_SYMBOL((*op))->isreqv) { + if (IS_ITEMP(cop) && IS_SYMOP((*op)) && OP_SYMBOL((*op))->isreqv) { operand **rop = &OP_SYMBOL((*op))->usl.spillLoc->reqv; if (isOperandEqual(*rop, *op)) { printf ("true"); @@ -173,6 +175,13 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) { iCode *lic; +#ifdef RANGEHUNT + printf ("replaceAllSymBySym\n\t"); + printOperand (from, stdout); + printf ("\nwith\t"); + printOperand (to, stdout); + printf ("\n"); +#endif for (lic = ic; lic; lic = lic->next) { int siaddr; @@ -415,6 +424,15 @@ DEFSETFUNC (findCheaperOp) (*opp)->isaddr = cop->isaddr; } + /* copy signedness to literal operands */ + if (IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) + && isOperandLiteral(*opp) + && SPEC_NOUN(operandType(*opp)) == SPEC_NOUN(operandType(cop)) + && SPEC_USIGN(operandType(*opp)) != SPEC_USIGN(operandType(cop))) + { + SPEC_USIGN(operandType(*opp)) = SPEC_USIGN(operandType(cop)); + } + if (IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) && SPEC_NOUN(operandType(cop)) != SPEC_NOUN(operandType(*opp))) { @@ -460,6 +478,16 @@ DEFSETFUNC (findPointerSet) getSize (operandType (IC_RIGHT (cdp->diCode))) == getSize (operandType (rop))) { + if (IS_SPEC (operandType (IC_RIGHT (cdp->diCode))) && + SPEC_USIGN (operandType (IC_RIGHT (cdp->diCode))) != + SPEC_USIGN (operandType (rop))) + { + /* bug #1493710 + Reminder for Bernhard: check of signedness + could be unnecessary together with 'checkSign', if + signedness of operation is stored in ic */ + return 0; + } *opp = IC_RIGHT (cdp->diCode); return 1; } @@ -492,7 +520,7 @@ DEFSETFUNC (findPrevIc) /* if iCodes are not the same */ /* see the operands maybe interchanged */ if (ic->op == cdp->diCode->op && - (ic->op == '+' || ic->op == '*') && + IS_ASSOCIATIVE(ic) && isOperandEqual (IC_LEFT (ic), IC_RIGHT (cdp->diCode)) && isOperandEqual (IC_RIGHT (ic), IC_LEFT (cdp->diCode))) { @@ -818,7 +846,8 @@ algebraicOpts (iCode * ic, eBBlock * ebp) case '+': /* if adding the same thing change to left shift by 1 */ if (IC_LEFT (ic)->key == IC_RIGHT (ic)->key && - !IS_FLOAT (operandType (IC_RESULT (ic)))) + !(IS_FLOAT (operandType (IC_RESULT (ic))) + || IS_FIXED(operandType (IC_RESULT (ic))))) { ic->op = LEFT_OP; IC_RIGHT (ic) = operandFromLit (1); @@ -829,8 +858,10 @@ algebraicOpts (iCode * ic, eBBlock * ebp) if (IS_OP_LITERAL (IC_LEFT (ic)) && operandLitValue (IC_LEFT (ic)) == 0.0) { - if (compareType (operandType (IC_RESULT (ic)), - operandType (IC_RIGHT (ic)))<0) + int typematch; + typematch = compareType (operandType (IC_RESULT (ic)), + operandType (IC_RIGHT (ic))); + if (typematch<0) { ic->op = CAST; IC_LEFT (ic) = operandFromLink (operandType (IC_RESULT (ic))); @@ -839,6 +870,12 @@ algebraicOpts (iCode * ic, eBBlock * ebp) { ic->op = '='; IC_LEFT (ic) = NULL; + if (typematch==0) + { + /* for completely different types, preserve the source type */ + IC_RIGHT (ic) = operandFromOperand (IC_RIGHT (ic)); + setOperandType (IC_RIGHT (ic), operandType (IC_RESULT (ic))); + } } SET_ISADDR (IC_RESULT (ic), 0); SET_ISADDR (IC_RIGHT (ic), 0); @@ -847,8 +884,10 @@ algebraicOpts (iCode * ic, eBBlock * ebp) if (IS_OP_LITERAL (IC_RIGHT (ic)) && operandLitValue (IC_RIGHT (ic)) == 0.0) { - if (compareType (operandType (IC_RESULT (ic)), - operandType (IC_LEFT (ic)))<0) + int typematch; + typematch = compareType (operandType (IC_RESULT (ic)), + operandType (IC_LEFT (ic))); + if (typematch<0) { ic->op = CAST; IC_RIGHT (ic) = IC_LEFT (ic); @@ -859,6 +898,12 @@ algebraicOpts (iCode * ic, eBBlock * ebp) ic->op = '='; IC_RIGHT (ic) = IC_LEFT (ic); IC_LEFT (ic) = NULL; + if (typematch==0) + { + /* for completely different types, preserve the source type */ + IC_RIGHT (ic) = operandFromOperand (IC_RIGHT (ic)); + setOperandType (IC_RIGHT (ic), operandType (IC_RESULT (ic))); + } } SET_ISADDR (IC_RIGHT (ic), 0); SET_ISADDR (IC_RESULT (ic), 0); @@ -1393,7 +1438,7 @@ void ifxOptimize (iCode * ic, set * cseSet, int computeOnly, eBBlock * ebb, int *change, - eBBlock ** ebbs, int count) + ebbIndex * ebbi) { operand *pdop; symbol *label; @@ -1445,7 +1490,7 @@ ifxOptimize (iCode * ic, set * cseSet, /* this is very expensive but it does not happen */ /* too often, if it does happen then the user pays */ /* the price */ - computeControlFlow (ebbs, count, 1); + computeControlFlow (ebbi); if (!options.lessPedantic) { werrorfl (ic->filename, ic->lineno, W_CONTROL_FLOW); } @@ -1457,7 +1502,7 @@ ifxOptimize (iCode * ic, set * cseSet, we can remove this conditional statement */ label = (IC_TRUE (ic) ? IC_TRUE (ic) : IC_FALSE (ic)); if (elementsInSet (ebb->succList) == 1 && - isinSet (ebb->succList, eBBWithEntryLabel (ebbs, label, count))) + isinSet (ebb->succList, eBBWithEntryLabel (ebbi, label))) { if (!options.lessPedantic) { @@ -1473,7 +1518,7 @@ ifxOptimize (iCode * ic, set * cseSet, else { remiCodeFromeBBlock (ebb, ic); - computeControlFlow (ebbs, count, 1); + computeControlFlow (ebbi); return; } } @@ -1535,7 +1580,7 @@ constFold (iCode * ic, set * cseSet) ic->op != '-') return 0; - /* this check is a hueristic to prevent live ranges + /* this check is a heuristic to prevent live ranges from becoming too long */ if (IS_PTR (operandType (IC_RESULT (ic)))) return 0; @@ -1545,7 +1590,7 @@ constFold (iCode * ic, set * cseSet) return 0; /* check if we can find a definition for the - right hand side */ + left hand side */ if (!(applyToSet (cseSet, diCodeForSym, IC_LEFT (ic), &dic))) return 0; @@ -1735,6 +1780,9 @@ static int isSignedOp (iCode *ic) case RRC: case RLC: case GETHBIT: + case GETABIT: + case GETBYTE: + case GETWORD: case RIGHT_OP: case CAST: case ARRAYINIT: @@ -1768,8 +1816,10 @@ dumpCseSet(set *cseSet) /*-----------------------------------------------------------------*/ int cseBBlock (eBBlock * ebb, int computeOnly, - eBBlock ** ebbs, int count) + ebbIndex * ebbi) { + eBBlock ** ebbs = ebbi->bbOrder; + int count = ebbi->count; set *cseSet; iCode *ic; int change = 0; @@ -1957,7 +2007,7 @@ cseBBlock (eBBlock * ebb, int computeOnly, { ifxOptimize (ic, cseSet, computeOnly, ebb, &change, - ebbs, count); + ebbi); continue; } @@ -2225,15 +2275,17 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* cseAllBlocks - will sequentially go thru & do cse for all blocks */ /*-----------------------------------------------------------------*/ int -cseAllBlocks (eBBlock ** ebbs, int count, int computeOnly) +cseAllBlocks (ebbIndex * ebbi, int computeOnly) { + eBBlock ** ebbs = ebbi->dfOrder; + int count = ebbi->count; int i; int change = 0; /* if optimization turned off */ for (i = 0; i < count; i++) - change += cseBBlock (ebbs[i], computeOnly, ebbs, count); + change += cseBBlock (ebbs[i], computeOnly, ebbi); return change; }