X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=2854a5bf956afe04e4ee431ea4836b4af29f7016;hb=7244108809a2adebffbbff1ceb28fef3550b8d6d;hp=a5ea44f393830ed470c338d37be4d7b054051f5a;hpb=67004551c261d35b69228d8d356e1d277b71c071;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index a5ea44f3..2854a5bf 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -1,3 +1,9 @@ +//#define LIVERANGEHUNT +#ifdef LIVERANGEHUNT + #define LRH(x) x +#else + #define LRH(x) +#endif /*------------------------------------------------------------------------- SDCCcse.c - source file for Common Subexpressions and other utility @@ -81,6 +87,28 @@ pcseDef (void *item, va_list ap) return 1; } +void ReplaceOpWithCheaperOp(operand **op, operand *cop) { +#ifdef RANGEHUNT + printf ("ReplaceOpWithCheaperOp (%s:%d with %s:%d): ", + OP_SYMBOL((*op))->name, OP_SYMBOL((*op))->isreqv, + OP_SYMBOL(cop)->name, OP_SYMBOL(cop)->isreqv); + // if op is a register equivalent + if (IS_ITEMP(cop) && OP_SYMBOL((*op))->isreqv) { + operand **rop = &OP_SYMBOL((*op))->usl.spillLoc->reqv; + if (isOperandEqual(*rop, *op)) { + printf ("true"); + *rop=cop; + OP_SYMBOL((*op))->isreqv=0; + OP_SYMBOL(cop)->isreqv=1; + } else { + printf ("false"); + } + } + printf ("\n"); +#endif + *op=cop; +} + /*-----------------------------------------------------------------*/ /* replaceAllSymBySym - replaces all operands by operand in an */ /* instruction chain */ @@ -90,6 +118,7 @@ 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)); for (lic = ic; lic; lic = lic->next) { int siaddr; @@ -102,7 +131,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES (to) = bitVectSetBit (OP_USES (to), lic->key); + OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); siaddr = IC_COND (lic)->isaddr; IC_COND (lic) = operandFromOperand (to); IC_COND (lic)->isaddr = siaddr; @@ -118,7 +147,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES (to) = bitVectSetBit (OP_USES (to), lic->key); + OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); siaddr = IC_COND (lic)->isaddr; IC_JTCOND (lic) = operandFromOperand (to); IC_JTCOND (lic)->isaddr = siaddr; @@ -133,7 +162,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) if (POINTER_SET (lic)) { bitVectUnSetBit (OP_USES (from), lic->key); - OP_USES (to) = bitVectSetBit (OP_USES (to), lic->key); + OP_USES_SET ((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 */ @@ -147,7 +176,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset) else { bitVectUnSetBit (OP_DEFS (from), lic->key); - OP_DEFS (to) = bitVectSetBit (OP_DEFS (to), lic->key); + OP_DEFS_SET ((to), bitVectSetBit (OP_DEFS (to), lic->key)); } siaddr = IC_RESULT (lic)->isaddr; IC_RESULT (lic) = operandFromOperand (to); @@ -158,7 +187,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 (to) = bitVectSetBit (OP_USES (to), lic->key); + OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); siaddr = IC_RIGHT (lic)->isaddr; IC_RIGHT (lic) = operandFromOperand (to); IC_RIGHT (lic)->isaddr = siaddr; @@ -168,7 +197,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 (to) = bitVectSetBit (OP_USES (to), lic->key); + OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key)); siaddr = IC_LEFT (lic)->isaddr; IC_LEFT (lic) = operandFromOperand (to); IC_LEFT (lic)->isaddr = siaddr; @@ -329,7 +358,9 @@ DEFSETFUNC (findCheaperOp) *opp = operandFromOperand (*opp); (*opp)->isaddr = cop->isaddr; } - + LRH(printf ("findCheaperOp: %s < %s\n",\ + IS_SYMOP((*opp)) ? OP_SYMBOL((*opp))->name : "!SYM",\ + OP_SYMBOL(cop)->name)); return 1; } @@ -379,6 +410,7 @@ DEFSETFUNC (findPrevIc) if (isiCodeEqual (ic, cdp->diCode) && isOperandEqual (cdp->sym, IC_RESULT (cdp->diCode))) { + LRH(printf ("findPrevIc same: %d %d\n", ic->key, cdp->diCode->key)); *icp = cdp->diCode; return 1; } @@ -390,6 +422,7 @@ DEFSETFUNC (findPrevIc) isOperandEqual (IC_LEFT (ic), IC_RIGHT (cdp->diCode)) && isOperandEqual (IC_RIGHT (ic), IC_LEFT (cdp->diCode))) { + LRH(printf ("findPrevIc inter: %d %d\n", ic->key, cdp->diCode->key)); *icp = cdp->diCode; return 1; } @@ -886,7 +919,6 @@ algebraicOpts (iCode * ic) void updateSpillLocation (iCode * ic, int induction) { - sym_link *setype; if (POINTER_SET (ic)) @@ -1016,7 +1048,7 @@ ifxOptimize (iCode * ic, set * cseSet, applyToSetFTrue (cseSet, findCheaperOp, IC_COND (ic), &pdop, 0); if (pdop) { - IC_COND (ic) = pdop; + ReplaceOpWithCheaperOp(&IC_COND (ic), pdop); (*change)++; } } @@ -1081,7 +1113,7 @@ ifxOptimize (iCode * ic, set * cseSet, /* if it remains an IFX the update the use Set */ - OP_USES (IC_COND (ic)) = bitVectSetBit (OP_USES (IC_COND (ic)), ic->key); + OP_USES_SET ((IC_COND (ic)), bitVectSetBit (OP_USES (IC_COND (ic)), ic->key)); setUsesDefs (IC_COND (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); return; } @@ -1334,6 +1366,7 @@ static int isSignedOp (iCode *ic) return 0; } } + /*-----------------------------------------------------------------*/ /* cseBBlock - common subexpression elimination for basic blocks */ /* this is the hackiest kludgiest routine in the whole */ @@ -1399,8 +1432,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, if (ic->op == PCALL || ic->op == CALL || ic->op == RECEIVE) { /* add to defSet of the symbol */ - OP_DEFS (IC_RESULT (ic)) = - bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key); + OP_DEFS_SET ((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); @@ -1433,13 +1466,13 @@ cseBBlock (eBBlock * ebb, int computeOnly, pdop = NULL; applyToSetFTrue (cseSet, findCheaperOp, IC_LEFT (ic), &pdop, 0); if (pdop) - IC_LEFT (ic) = pdop; + ReplaceOpWithCheaperOp(&IC_LEFT(ic), pdop); } /* the lookup could have changed it */ if (IS_SYMOP (IC_LEFT (ic))) { - OP_USES (IC_LEFT (ic)) = - bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key); + OP_USES_SET ((IC_LEFT (ic)), + bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key)); setUsesDefs (IC_LEFT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); } @@ -1463,8 +1496,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* if jumptable then mark the usage */ if (ic->op == JUMPTABLE) { - OP_USES (IC_JTCOND (ic)) = - bitVectSetBit (OP_USES (IC_JTCOND (ic)), ic->key); + OP_USES_SET ((IC_JTCOND (ic)), + bitVectSetBit (OP_USES (IC_JTCOND (ic)), ic->key)); setUsesDefs (IC_JTCOND (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); continue; @@ -1515,7 +1548,7 @@ cseBBlock (eBBlock * ebb, int computeOnly, pdop = NULL; applyToSetFTrue (cseSet, findCheaperOp, IC_RESULT (ic), &pdop, 0); if (pdop && IS_ITEMP (pdop) && !computeOnly) - IC_RESULT (ic) = pdop; + ReplaceOpWithCheaperOp (&IC_RESULT(ic), pdop); } } @@ -1543,7 +1576,7 @@ cseBBlock (eBBlock * ebb, int computeOnly, this variable .. unsafe to remove any POINTER_GETs */ if (bitVectBitValue(ebb->ndompset,IC_LEFT(ic)->key)) ebb->ptrsSet = bitVectSetBit(ebb->ptrsSet,pdop->key); - IC_LEFT (ic) = pdop; + ReplaceOpWithCheaperOp(&IC_LEFT(ic), pdop); change = 1; } /* check if there is a pointer set @@ -1555,14 +1588,14 @@ cseBBlock (eBBlock * ebb, int computeOnly, { ic->op = '='; IC_LEFT (ic) = NULL; - IC_RIGHT (ic) = pdop; + ReplaceOpWithCheaperOp(&IC_RIGHT(ic), pdop); SET_ISADDR (IC_RESULT (ic), 0); } } else { - IC_LEFT (ic) = pdop; + ReplaceOpWithCheaperOp(&IC_LEFT(ic), pdop); change = 1; } } @@ -1574,13 +1607,12 @@ cseBBlock (eBBlock * ebb, int computeOnly, pdop = NULL; applyToSetFTrue (cseSet, findCheaperOp, IC_RIGHT (ic), &pdop, checkSign); - if (pdop) - { - IC_RIGHT (ic) = pdop; - change = 1; - } + if (pdop) { + ReplaceOpWithCheaperOp(&IC_RIGHT(ic), pdop); + change = 1; + } } - + /* if left or right changed then do algebraic */ if (change) { @@ -1684,16 +1716,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 (IC_LEFT (ic)) = - bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key); + OP_USES_SET ((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 (IC_RIGHT (ic)) = - bitVectSetBit (OP_USES (IC_RIGHT (ic)), ic->key); + OP_USES_SET ((IC_RIGHT (ic)), + bitVectSetBit (OP_USES (IC_RIGHT (ic)), ic->key)); setUsesDefs (IC_RIGHT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs); } @@ -1702,8 +1734,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, /* in the defuseSet if it a pointer or array access */ if (POINTER_SET (defic)) { - OP_USES (IC_RESULT (ic)) = - bitVectSetBit (OP_USES (IC_RESULT (ic)), ic->key); + OP_USES_SET ((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); @@ -1721,8 +1753,8 @@ cseBBlock (eBBlock * ebb, int computeOnly, else /* add the result to defintion set */ if (IC_RESULT (ic)) { - OP_DEFS (IC_RESULT (ic)) = - bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key); + OP_DEFS_SET ((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);