X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=af3d2ce94a0372abbfc4b8bcac47fcb002eecb51;hb=3a3d180872da2b1b50c4fa85621a859b3ff72a64;hp=4b6eadcc50c357866b0fb47df78552f6063a9e04;hpb=a77899caba78f1dd210c84a175ff372cf552567d;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index 4b6eadcc..af3d2ce9 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -118,7 +118,9 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) { iCode *lic; - LRH(printf ("replaceAllSymBySym: from %s to %s\n", OP_SYMBOL(from)->name, OP_SYMBOL(to)->name)); + LRH(printf ("replaceAllSymBySym: from %s to %s\n", + OP_SYMBOL(from)->name, + IS_SYMOP(to) ? OP_SYMBOL(to)->name) : "!SYM"); for (lic = ic; lic; lic = lic->next) { int siaddr; @@ -131,7 +133,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); + OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key); siaddr = IC_COND (lic)->isaddr; IC_COND (lic) = operandFromOperand (to); IC_COND (lic)->isaddr = siaddr; @@ -147,7 +149,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); + OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key); siaddr = IC_COND (lic)->isaddr; IC_JTCOND (lic) = operandFromOperand (to); IC_JTCOND (lic)->isaddr = siaddr; @@ -156,13 +158,14 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) continue; } - if (IC_RESULT (lic) && IC_RESULT (lic)->key == from->key) + if (IS_SYMOP(to) && + IC_RESULT (lic) && IC_RESULT (lic)->key == from->key) { /* maintain du chains */ if (POINTER_SET (lic)) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); + OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key); /* also check if the "from" was in the non-dominating pointer sets and replace it with "to" in the bitVector */ @@ -176,7 +179,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) else { bitVectUnSetBit (OP_DEFS (from), lic->key); - OP_DEFS_SET ((to), bitVectSetBit (OP_DEFS (to), lic->key)); + OP_DEFS(to)=bitVectSetBit (OP_DEFS (to), lic->key); } siaddr = IC_RESULT (lic)->isaddr; IC_RESULT (lic) = operandFromOperand (to); @@ -187,7 +190,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) IC_RIGHT (lic) && IC_RIGHT (lic)->key == from->key) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); + OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key); siaddr = IC_RIGHT (lic)->isaddr; IC_RIGHT (lic) = operandFromOperand (to); IC_RIGHT (lic)->isaddr = siaddr; @@ -197,7 +200,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) IC_LEFT (lic) && IC_LEFT (lic)->key == from->key) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); + OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key); siaddr = IC_LEFT (lic)->isaddr; IC_LEFT (lic) = operandFromOperand (to); IC_LEFT (lic)->isaddr = siaddr; @@ -334,6 +337,7 @@ DEFSETFUNC (findCheaperOp) if ((*opp) && (isOperandLiteral(*opp) || !checkSign || (checkSign && + IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) && (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp)) && (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp))))))) { @@ -358,6 +362,28 @@ DEFSETFUNC (findCheaperOp) *opp = operandFromOperand (*opp); (*opp)->isaddr = cop->isaddr; } + + if (IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) && + SPEC_NOUN(operandType(cop)) != SPEC_NOUN(operandType(*opp))) + { + // special case: we can make an unsigned char literal + // into an int literal with no cost. + if (isOperandLiteral(*opp) + && SPEC_NOUN(operandType(*opp)) == V_CHAR + && SPEC_NOUN(operandType(cop)) == V_INT) + { + *opp = operandFromOperand (*opp); + SPEC_NOUN(operandType(*opp)) = V_INT; + } + else + { + // No clue... + *opp = NULL; + return 0; + } + + } + LRH(printf ("findCheaperOp: %s < %s\n",\ IS_SYMOP((*opp)) ? OP_SYMBOL((*opp))->name : "!SYM",\ OP_SYMBOL(cop)->name)); @@ -1117,7 +1143,7 @@ ifxOptimize (iCode * ic, set * cseSet, /* if it remains an IFX the update the use Set */ - OP_USES_SET ((IC_COND (ic)), bitVectSetBit (OP_USES (IC_COND (ic)), ic->key)); + OP_USES(IC_COND (ic))=bitVectSetBit (OP_USES (IC_COND (ic)), ic->key); setUsesDefs (IC_COND (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); return; } @@ -1410,7 +1436,6 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* for all the instructions in this block do */ for (ic = ebb->sch; ic; ic = ic->next) { - iCode *pdic; operand *pdop; iCode *defic; @@ -1436,8 +1461,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, if (ic->op == PCALL || ic->op == CALL || ic->op == RECEIVE) { /* add to defSet of the symbol */ - OP_DEFS_SET ((IC_RESULT (ic)), - bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key)); + OP_DEFS(IC_RESULT (ic))= + bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key); /* add to the definition set of this block */ ebb->defSet = bitVectSetBit (ebb->defSet, ic->key); ebb->ldefs = bitVectSetBit (ebb->ldefs, ic->key); @@ -1475,8 +1500,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* the lookup could have changed it */ if (IS_SYMOP (IC_LEFT (ic))) { - OP_USES_SET ((IC_LEFT (ic)), - bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key)); + OP_USES(IC_LEFT (ic))= + bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key); setUsesDefs (IC_LEFT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); } @@ -1500,8 +1525,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* if jumptable then mark the usage */ if (ic->op == JUMPTABLE) { - OP_USES_SET ((IC_JTCOND (ic)), - bitVectSetBit (OP_USES (IC_JTCOND (ic)), ic->key)); + OP_USES(IC_JTCOND (ic))= + bitVectSetBit (OP_USES (IC_JTCOND (ic)), ic->key); setUsesDefs (IC_JTCOND (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); continue; @@ -1720,16 +1745,16 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* add the left & right to the defUse set */ if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic))) { - OP_USES_SET ((IC_LEFT (ic)), - bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key)); + OP_USES(IC_LEFT (ic))= + bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key); setUsesDefs (IC_LEFT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); } if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic))) { - OP_USES_SET ((IC_RIGHT (ic)), - bitVectSetBit (OP_USES (IC_RIGHT (ic)), ic->key)); + OP_USES(IC_RIGHT (ic))= + bitVectSetBit (OP_USES (IC_RIGHT (ic)), ic->key); setUsesDefs (IC_RIGHT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); } @@ -1738,8 +1763,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* in the defuseSet if it a pointer or array access */ if (POINTER_SET (defic)) { - OP_USES_SET ((IC_RESULT (ic)), - bitVectSetBit (OP_USES (IC_RESULT (ic)), ic->key)); + OP_USES(IC_RESULT (ic))= + bitVectSetBit (OP_USES (IC_RESULT (ic)), ic->key); setUsesDefs (IC_RESULT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); deleteItemIf (&cseSet, ifPointerGet, IC_RESULT (ic)); ebb->ptrsSet = bitVectSetBit (ebb->ptrsSet, IC_RESULT (ic)->key); @@ -1757,8 +1782,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, else /* add the result to defintion set */ if (IC_RESULT (ic)) { - OP_DEFS_SET ((IC_RESULT (ic)), - bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key)); + OP_DEFS(IC_RESULT (ic))= + bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key); ebb->defSet = bitVectSetBit (ebb->defSet, ic->key); ebb->outDefs = bitVectCplAnd (ebb->outDefs, OP_DEFS (IC_RESULT (ic))); ebb->ldefs = bitVectSetBit (ebb->ldefs, ic->key);