{
cseDef *cdp = item;
V_ARG(operand *,op);
+ iCode *dic = cdp->diCode;
+ operand *left = IC_LEFT(cdp->diCode);
- if (POINTER_GET(cdp->diCode) &&
- IC_LEFT(cdp->diCode)->key == op->key)
+ if (POINTER_GET(dic) && left->key == op->key)
return 1;
return 0;
/* will delete from cseSet all get pointers computed from this */
/* pointer. A simple ifOperandsHave is not good enough here */
/*-----------------------------------------------------------------*/
-static void deleteGetPointers (set **cseSet,operand *op,eBBlock *ebb)
+static void deleteGetPointers (set **cseSet, set **pss, operand *op,eBBlock *ebb)
{
set *compItems = NULL;
cseDef *cdp ;
operand *cop;
/* easy return */
- if (!*cseSet)
+ if (!*cseSet && !*pss)
return ;
/* first find all items computed from this operand .
/* now delete all pointer gets with this op */
deleteItemIf(cseSet,ifPointerGet,op);
+ deleteItemIf(pss,ifPointerSet,op);
+
/* set the bit vector used by dataFlow computation later */
ebb->ptrsSet = bitVectSetBit(ebb->ptrsSet,op->key);
/* now for the computed items */
for (cop = setFirstItem(compItems); cop ; cop = setNextItem(compItems)) {
ebb->ptrsSet = bitVectSetBit(ebb->ptrsSet,cop->key);
deleteItemIf(cseSet,ifPointerGet,cop);
+ deleteItemIf(pss,ifPointerSet,cop);
}
}
setUsesDefs(IC_LEFT(ic),ebb->defSet,
ebb->outDefs,&ebb->usesDefs);
}
+
+
/* if we a sending a pointer as a parameter
then kill all cse since the pointed to item
might be changed in the function being called */
- if (IS_PTR(operandType(IC_LEFT(ic)))) {
- deleteGetPointers(&cseSet,IC_LEFT(ic),ebb);
+ if ((ic->op == IPUSH || ic->op == SEND) &&
+ IS_PTR(operandType(IC_LEFT(ic)))) {
+ deleteGetPointers(&cseSet,&ptrSetSet,IC_LEFT(ic),ebb);
+ ebb->ptrsSet = bitVectSetBit(ebb->ptrsSet,IC_LEFT(ic)->key);
+ for (i = 0 ; i < count ;ebbs[i++]->visited = 0);
+ applyToSet(ebb->succList,delGetPointerSucc,IC_LEFT(ic),ebb->dfnum);
}
continue;
}
if (ASSIGNMENT(ic) &&
OTHERS_PARM(OP_SYMBOL(IC_RESULT(ic))) &&
IS_PTR(operandType(IC_RESULT(ic)))) {
- deleteGetPointers(&cseSet,IC_RIGHT(ic),ebb);
+ deleteGetPointers(&cseSet,&ptrSetSet,IC_RIGHT(ic),ebb);
+ for (i = 0 ; i < count ;ebbs[i++]->visited = 0);
+ applyToSet(ebb->succList,delGetPointerSucc,IC_RIGHT(ic),ebb->dfnum);
+ ebb->ptrsSet = bitVectSetBit(ebb->ptrsSet,IC_RIGHT(ic)->key);
}
/* if this is a pointerget then see if we can replace