X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=18ca4ea6e50376b63322d57ae775607cb9ae08cf;hb=56a9e990dcc18d296ee20344d96bde03dad9e8a2;hp=fb96762c03899966b3a6846f7861ce34f1456e97;hpb=69e8757cd0893be33d4cdd725da79ab40d5f570a;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index fb96762c..18ca4ea6 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; @@ -301,8 +301,9 @@ DEFSETFUNC (findCheaperOp) *opp = IC_RESULT (cdp->diCode); if ((*opp) && - (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp))) && - (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp)))) + (isOperandLiteral(*opp) || + (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp)) && + (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp)))))) { if ((isGlobalInNearSpace (cop) && @@ -393,6 +394,20 @@ DEFSETFUNC (findPrevIc) return 0; } +/*-------------------------------------------------------------------*/ +/* ifAssignedFromGlobal - if definition is an assignment from global */ +/*-------------------------------------------------------------------*/ +DEFSETFUNC (ifAssignedFromGlobal) +{ + cseDef *cdp = item; + iCode *dic=cdp->diCode; + + if (dic->op=='=' && isOperandGlobal(IC_RIGHT(dic))) { + return 1; + } + return 0; +} + /*-----------------------------------------------------------------*/ /* ifDefGlobal - if definition is global */ /*-----------------------------------------------------------------*/ @@ -810,25 +825,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))) { @@ -893,6 +911,7 @@ updateSpillLocation (iCode * ic, int induction) /* 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)); } @@ -1012,7 +1031,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; } @@ -1026,7 +1047,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; } @@ -1220,7 +1243,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; @@ -1307,6 +1331,10 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* delete global variables from the cseSet since they can be modified by the function call */ deleteItemIf (&cseSet, ifDefGlobal); + + /* and also itemps assigned from globals */ + deleteItemIf (&cseSet, ifAssignedFromGlobal); + /* delete all getpointer iCodes from cseSet, this should be done only for global arrays & pointers but at this point we don't know if globals, so to be safe do all */ @@ -1464,7 +1492,6 @@ cseBBlock (eBBlock * ebb, int computeOnly, applyToSetFTrue (cseSet, findCheaperOp, IC_RIGHT (ic), &pdop); if (pdop) { - IC_RIGHT (ic) = pdop; change = 1; } @@ -1506,15 +1533,15 @@ cseBBlock (eBBlock * ebb, int computeOnly, pdic = NULL; } +#if 0 /* if found then eliminate this and add to */ /* to cseSet an element containing result */ /* 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 @@ -1563,7 +1590,23 @@ cseBBlock (eBBlock * ebb, int computeOnly, defic = ic; } +#else + /* Alternate code */ + if (pdic && IS_ITEMP(IC_RESULT(ic))) { + /* if previous definition found change this to an assignment */ + ic->op = '='; + IC_LEFT(ic) = NULL; + IC_RIGHT(ic) = operandFromOperand(IC_RESULT(pdic)); + SET_ISADDR(IC_RESULT(ic),0); + SET_ISADDR(IC_RIGHT (ic),0); + } + if (!(POINTER_SET (ic)) && IC_RESULT (ic)) { + deleteItemIf (&cseSet, ifDefSymIsX, IC_RESULT (ic)); + addSetHead (&cseSet, newCseDef (IC_RESULT (ic), ic)); + } + defic = ic; +#endif /* if assignment to a parameter which is not mine and type is a pointer then delete pointerGets to take care of aliasing */