X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=f3c27a55d521356f4bfe78a6a8c21be52135a95c;hb=62298aa56bebc07b254ae6a5b69c9585ae9f23d2;hp=8787bd48405ab9bb5dbf51b80f67e492eb200714;hpb=a12dad7dfe654ada025ae6752fca404d58edc2fa;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index 8787bd48..f3c27a55 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -34,7 +34,7 @@ newCseDef (operand * sym, iCode * ic) cseDef *cdp; assert (sym); - cdp = Safe_calloc (1, sizeof (cseDef)); + cdp = Safe_alloc (sizeof (cseDef)); cdp->sym = sym; cdp->diCode = ic; @@ -810,25 +810,28 @@ algebraicOpts (iCode * ic) } break; case CAST: - /* if this is a cast of a literal value */ - if (IS_OP_LITERAL (IC_RIGHT (ic))) - { - ic->op = '='; - IC_RIGHT (ic) = - operandFromValue (valCastLiteral (operandType (IC_LEFT (ic)), - operandLitValue (IC_RIGHT (ic)))); - IC_LEFT (ic) = NULL; - SET_ISADDR (IC_RESULT (ic), 0); - } - /* if casting to the same */ - if (compareType (operandType (IC_RESULT (ic)), - operandType (IC_RIGHT (ic))) == 1) - { - ic->op = '='; - IC_LEFT (ic) = NULL; - SET_ISADDR (IC_RESULT (ic), 0); - } - break; + { + sym_link *otype = operandType(IC_RIGHT(ic)); + sym_link *ctype = operandType(IC_LEFT(ic)); + /* if this is a cast of a literal value */ + if (IS_OP_LITERAL (IC_RIGHT (ic)) && + !(IS_GENPTR(ctype) && (IS_PTR(otype) && !IS_GENPTR(otype)))) { + ic->op = '='; + IC_RIGHT (ic) = + operandFromValue (valCastLiteral (operandType (IC_LEFT (ic)), + operandLitValue (IC_RIGHT (ic)))); + IC_LEFT (ic) = NULL; + SET_ISADDR (IC_RESULT (ic), 0); + } + /* if casting to the same */ + if (compareType (operandType (IC_RESULT (ic)), + operandType (IC_RIGHT (ic))) == 1) { + ic->op = '='; + IC_LEFT (ic) = NULL; + SET_ISADDR (IC_RESULT (ic), 0); + } + } + break; case '!': if (IS_OP_LITERAL (IC_LEFT (ic))) { @@ -848,55 +851,57 @@ algebraicOpts (iCode * ic) /* updateSpillLocation - keeps track of register spill location */ /*-----------------------------------------------------------------*/ void -updateSpillLocation (iCode * ic) +updateSpillLocation (iCode * ic, int induction) { - sym_link *setype; - - if (POINTER_SET (ic)) - return; - - if (ic->nosupdate) - return; + sym_link *setype; - /* for the form true_symbol := iTempNN */ - if (ASSIGN_ITEMP_TO_SYM (ic) - && !SPIL_LOC (IC_RIGHT (ic))) - { + if (POINTER_SET (ic)) + return; - setype = getSpec (operandType (IC_RESULT (ic))); + if (ic->nosupdate) + return; - if (!OP_SYMBOL(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)) = - IC_RESULT (ic)->operand.symOperand; - } + /* for the form true_symbol := iTempNN */ + if (ASSIGN_ITEMP_TO_SYM (ic) && + !SPIL_LOC (IC_RIGHT (ic))) { - if (ASSIGN_ITEMP_TO_ITEMP (ic) && - !SPIL_LOC (IC_RIGHT (ic)) && - !bitVectBitsInCommon (OP_DEFS (IC_RIGHT (ic)), OP_USES (IC_RESULT (ic))) && - OP_SYMBOL (IC_RESULT (ic))->isreqv) - { + setype = getSpec (operandType (IC_RESULT (ic))); - setype = getSpec (operandType (IC_RESULT (ic))); + if (!OP_SYMBOL(IC_RIGHT (ic))->noSpilLoc && + !IS_VOLATILE (setype) && + !IN_FARSPACE (SPEC_OCLS (setype)) && + !OTHERS_PARM (OP_SYMBOL (IC_RESULT (ic)))) - if (!OP_SYMBOL(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)) = + IC_RESULT (ic)->operand.symOperand; + } - SPIL_LOC (IC_RIGHT (ic)) = - SPIL_LOC (IC_RESULT (ic)); - } + if (ASSIGN_ITEMP_TO_ITEMP (ic)) { + + if (!SPIL_LOC (IC_RIGHT (ic)) && + !bitVectBitsInCommon (OP_DEFS (IC_RIGHT (ic)), OP_USES (IC_RESULT (ic))) && + OP_SYMBOL (IC_RESULT (ic))->isreqv) { + + setype = getSpec (operandType (IC_RESULT (ic))); + + if (!OP_SYMBOL(IC_RIGHT (ic))->noSpilLoc && + !IS_VOLATILE (setype) && + !IN_FARSPACE (SPEC_OCLS (setype)) && + !OTHERS_PARM (OP_SYMBOL (IC_RESULT (ic)))) + + SPIL_LOC (IC_RIGHT (ic)) = + SPIL_LOC (IC_RESULT (ic)); + } + /* special case for inductions */ + if (induction && + OP_SYMBOL(IC_RIGHT(ic))->isreqv && + !OP_SYMBOL(IC_RESULT (ic))->noSpilLoc && + !SPIL_LOC(IC_RESULT(ic))) { + SPIL_LOC (IC_RESULT (ic)) = SPIL_LOC (IC_RIGHT (ic)); + } + } } - /*-----------------------------------------------------------------*/ /* setUsesDef - sets the uses def bitvector for a given operand */ /*-----------------------------------------------------------------*/ @@ -1011,7 +1016,9 @@ ifxOptimize (iCode * ic, set * cseSet, /* too often, if it does happen then the user pays */ /* the price */ computeControlFlow (ebbs, count, 1); - werror (W_CONTROL_FLOW, ic->filename, ic->lineno); + if (!options.lessPedantic) { + werror (W_CONTROL_FLOW, ic->filename, ic->lineno); + } return; } @@ -1025,7 +1032,9 @@ ifxOptimize (iCode * ic, set * cseSet, remiCodeFromeBBlock (ebb, ic); computeControlFlow (ebbs, count, 1); - werror (W_CONTROL_FLOW, ic->filename, ic->lineno); + if (!options.lessPedantic) { + werror (W_CONTROL_FLOW, ic->filename, ic->lineno); + } return; } @@ -1219,7 +1228,8 @@ fixUpTypes (iCode * ic) { sym_link *t1 = operandType (IC_LEFT (ic)), *t2; - if (TARGET_IS_DS390) + /* if (TARGET_IS_DS390) */ + if (options.model == MODEL_FLAT24) { /* hack-o-matic! */ return; @@ -1400,7 +1410,7 @@ cseBBlock (eBBlock * ebb, int computeOnly, { /* update the spill location for this */ - updateSpillLocation (ic); + updateSpillLocation (ic,0); if (POINTER_SET (ic) && !(IS_BITFIELD (OP_SYMBOL (IC_RESULT (ic))->etype))) @@ -1503,6 +1513,13 @@ cseBBlock (eBBlock * ebb, int computeOnly, if (pdic && compareType (operandType (IC_RESULT (pdic)), operandType (IC_RESULT (ic))) != 1) pdic = NULL; + + // TODO: this must go, a weak fix for bug #467035 + if (pdic && (pdic->level > ic->level)) { + // pdic was inside an inner loop + pdic = NULL; + } + } /* if found then eliminate this and add to */ @@ -1510,10 +1527,9 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* of this with previous opcode */ if (pdic) { - if (IS_ITEMP (IC_RESULT (ic))) { - + /* 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