{
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;
}
+/*-----------------------------------------------------------------*/
+/* findBackwardDef - scan backwards to find deinition of operand */
+/*-----------------------------------------------------------------*/
+iCode *findBackwardDef(operand *op,iCode *ic)
+{
+ iCode *lic;
+
+ for (lic = ic; lic ; lic = lic->prev) {
+ if (IC_RESULT(lic) && isOperandEqual(op,IC_RESULT(lic)))
+ return lic;
+ }
+ return NULL;
+}
+
/*-----------------------------------------------------------------*/
/* algebraicOpts - does some algebraic optimizations */
/*-----------------------------------------------------------------*/
IC_LEFT (ic) = NULL;
IC_RESULT (ic) = operandFromOperand (IC_RESULT (ic));
IC_RESULT (ic)->isaddr = 0;
+ break;
}
/* if this is a division then check if right */
/* is one then change it to an assignment */
IC_RESULT (ic)->operand.symOperand;
}
+#if 0 /* this needs furthur investigation can save a lot of code */
+ if (ASSIGN_SYM_TO_ITEMP(ic) &&
+ !SPIL_LOC(IC_RESULT(ic))) {
+ if (!OTHERS_PARM (OP_SYMBOL (IC_RIGHT (ic))))
+ SPIL_LOC (IC_RESULT (ic)) =
+ IC_RIGHT (ic)->operand.symOperand;
+ }
+#endif
if (ASSIGN_ITEMP_TO_ITEMP (ic)) {
if (!SPIL_LOC (IC_RIGHT (ic)) &&
/* 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;
}
/* this check is a hueristic to prevent live ranges
from becoming too long */
if (IS_PTR (operandType (IC_RESULT (ic))))
- return 0;
+ return 0;
/* check if operation with a literal */
if (!IS_OP_LITERAL (IC_RIGHT (ic)))
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);
/* 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;
{
if (IS_ITEMP (pdop) || IS_OP_LITERAL (pdop))
{
+ /* some non dominating block does POINTER_SET with
+ 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;
change = 1;
}
/* if after all this it becomes a assignment to self
then delete it and continue */
- if (ASSIGNMENT_TO_SELF (ic))
+ if (ASSIGNMENT_TO_SELF (ic) && !OTHERS_PARM(OP_SYMBOL(IC_RESULT(ic))))
{
remiCodeFromeBBlock (ebb, ic);
continue;
/* Alternate code */
if (pdic && IS_ITEMP(IC_RESULT(ic))) {
+ if (POINTER_GET(ic) && bitVectBitValue(ebb->ptrsSet,IC_LEFT(ic)->key)) {
+ /* Mmm, found an equivalent pointer get at a lower level.
+ This could be a loop however with the same pointer set
+ later on */
+ } else {
/* 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)) {
/* 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);