+//#define LIVERANGEHUNT
+#ifdef LIVERANGEHUNT
+ #define LRH(x) x
+#else
+ #define LRH(x)
+#endif
/*-------------------------------------------------------------------------
SDCCcse.c - source file for Common Subexpressions and other utility
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 */
{
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;
{
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;
{
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;
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 */
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);
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;
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;
*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;
}
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;
}
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;
}
void
updateSpillLocation (iCode * ic, int induction)
{
-
sym_link *setype;
if (POINTER_SET (ic))
applyToSetFTrue (cseSet, findCheaperOp, IC_COND (ic), &pdop, 0);
if (pdop)
{
- IC_COND (ic) = pdop;
+ ReplaceOpWithCheaperOp(&IC_COND (ic), pdop);
(*change)++;
}
}
/* 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;
}
return 0;
}
}
+
/*-----------------------------------------------------------------*/
/* cseBBlock - common subexpression elimination for basic blocks */
/* this is the hackiest kludgiest routine in the whole */
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);
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);
}
/* 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;
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);
}
}
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
{
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;
}
}
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)
{
/* 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);
}
/* 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);
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);