{
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;
{
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;
{
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;
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 */
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);
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;
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;
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)))))))
{
*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));
/* 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;
}
/* for all the instructions in this block do */
for (ic = ebb->sch; ic; ic = ic->next)
{
-
iCode *pdic;
operand *pdop;
iCode *defic;
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);
/* 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);
}
/* 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;
/* 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);
}
/* 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);
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);