X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=f3c27a55d521356f4bfe78a6a8c21be52135a95c;hb=f760fda1275f579b0ad76473b287533a4448bdc7;hp=0434ea0190362064cd917ed4dd270071c03524bd;hpb=9388b031d56edbb7a48626d6fb573d3a411f61fd;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index 0434ea01..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,51 +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 (!IC_RIGHT (ic)->noSpilLoc && - !IS_VOLATILE (setype) && - !IN_FARSPACE (SPEC_OCLS (setype)) && - !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 (!IC_RIGHT (ic)->noSpilLoc && - !IS_VOLATILE (setype) && - !IN_FARSPACE (SPEC_OCLS (setype)) && - !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 */ /*-----------------------------------------------------------------*/ @@ -1007,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; } @@ -1021,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; } @@ -1119,7 +1132,7 @@ constFold (iCode * ic, set * cseSet) if (IS_ITEMP (IC_RESULT (ic))) { SPIL_LOC (IC_RESULT (ic)) = NULL; - IC_RESULT (ic)->noSpilLoc = 1; + OP_SYMBOL(IC_RESULT (ic))->noSpilLoc = 1; } @@ -1215,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; @@ -1396,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))) @@ -1499,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 */ @@ -1506,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