cseDef *cdp = item;
iCodeTable *icTab ;
+ (void)ap;
+
if (!cdp->sym)
fprintf(stdout,"**null op**");
printOperand(cdp->sym,stdout);
cseDef *cdp = item;
V_ARG(operand *,op);
V_ARG(operand **,opp);
+ V_ARG(operand *,rop);
if (POINTER_SET(cdp->diCode) &&
IC_RESULT(cdp->diCode)->key == op->key &&
!isOperandVolatile(IC_RESULT(cdp->diCode),TRUE) &&
- !isOperandVolatile(IC_RIGHT(cdp->diCode),TRUE)) {
+ !isOperandVolatile(IC_RIGHT(cdp->diCode),TRUE) &&
+ getSize(operandType(IC_RIGHT(cdp->diCode))) ==
+ getSize(operandType(rop))) {
*opp = IC_RIGHT(cdp->diCode);
return 1;
}
{
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;
if (ASSIGN_ITEMP_TO_ITEMP(ic) &&
!SPIL_LOC(IC_RIGHT(ic)) &&
+ !bitVectBitsInCommon(OP_DEFS(IC_RIGHT(ic)),OP_USES(IC_RESULT(ic))) &&
OP_SYMBOL(IC_RESULT(ic))->isreqv) {
setype = getSpec(operandType(IC_RESULT(ic)));
*oud = bitVectUnion(*oud,adefs);
}
+/*-----------------------------------------------------------------*/
+/* unsetDefsAndUses - clear this operation for the operands */
+/*-----------------------------------------------------------------*/
+void unsetDefsAndUses ( iCode *ic )
+{
+ if ( ic->op == JUMPTABLE)
+ return ;
+
+ /* take away this definition from the def chain of the */
+ /* result & take away from use set of the operands */
+ if (ic->op != IFX) {
+ /* turn off def set */
+ if (IS_SYMOP(IC_RESULT(ic))) {
+ if ( !POINTER_SET(ic))
+ bitVectUnSetBit(OP_DEFS(IC_RESULT(ic)),ic->key);
+ else
+ bitVectUnSetBit(OP_USES(IC_RESULT(ic)),ic->key);
+ }
+ /* turn off the useSet for the operands */
+ if (IS_SYMOP(IC_LEFT(ic)))
+ bitVectUnSetBit (OP_USES(IC_LEFT(ic)),ic->key);
+
+ if (IS_SYMOP(IC_RIGHT(ic)))
+ bitVectUnSetBit (OP_USES(IC_RIGHT(ic)),ic->key);
+ }
+ else /* must be ifx turn off the use */
+ if (IS_SYMOP(IC_COND(ic)))
+ bitVectUnSetBit (OP_USES(IC_COND(ic)),ic->key);
+}
+
/*-----------------------------------------------------------------*/
/* ifxOptimize - changes ifx conditions if it can */
/*-----------------------------------------------------------------*/
/* if the conditional is a literal then */
if (IS_OP_LITERAL(IC_COND(ic))) {
- if ( operandLitValue(IC_COND(ic)) && IC_TRUE(ic)) {
+ if ( (operandLitValue(IC_COND(ic)) != 0.0) && IC_TRUE(ic)) {
/* change to a goto */
ic->op = GOTO ;
return ;
}
-/*-----------------------------------------------------------------*/
-/* unsetDefsAndUses - clear this operation for the operands */
-/*-----------------------------------------------------------------*/
-void unsetDefsAndUses ( iCode *ic )
-{
- if ( ic->op == JUMPTABLE)
- return ;
-
- /* take away this definition from the def chain of the */
- /* result & take away from use set of the operands */
- if (ic->op != IFX) {
- /* turn off def set */
- if (IS_SYMOP(IC_RESULT(ic))) {
- if ( !POINTER_SET(ic))
- bitVectUnSetBit(OP_DEFS(IC_RESULT(ic)),ic->key);
- else
- bitVectUnSetBit(OP_USES(IC_RESULT(ic)),ic->key);
- }
- /* turn off the useSet for the operands */
- if (IS_SYMOP(IC_LEFT(ic)))
- bitVectUnSetBit (OP_USES(IC_LEFT(ic)),ic->key);
-
- if (IS_SYMOP(IC_RIGHT(ic)))
- bitVectUnSetBit (OP_USES(IC_RIGHT(ic)),ic->key);
- }
- else /* must be ifx turn off the use */
- if (IS_SYMOP(IC_COND(ic)))
- bitVectUnSetBit (OP_USES(IC_COND(ic)),ic->key);
-}
-
/*-----------------------------------------------------------------*/
/* diCodeForSym - finds the definiting instruction for a symbol */
/*-----------------------------------------------------------------*/
/* 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;
}
algebraicOpts (ic);
while (constFold(ic,cseSet));
+ /* small klugde */
+ if (POINTER_GET(ic) && !IS_PTR(operandType(IC_LEFT(ic)))) {
+ setOperandType(IC_LEFT(ic),
+ aggrToPtr(operandType(IC_LEFT(ic)),FALSE));
+ }
+ if (POINTER_SET(ic) && !IS_PTR(operandType(IC_RESULT(ic)))) {
+ setOperandType(IC_RESULT(ic),
+ aggrToPtr(operandType(IC_RESULT(ic)),FALSE));
+ }
+
/* if this is a condition statment then */
/* check if the condition can be replaced */
if (ic->op == IFX ) {
for the same pointer visible if yes
then change this into an assignment */
pdop = NULL;
- if (applyToSetFTrue(cseSet,findPointerSet,IC_LEFT(ic),&pdop)){
+ if (applyToSetFTrue(cseSet,findPointerSet,IC_LEFT(ic),&pdop,IC_RESULT(ic)) &&
+ !bitVectBitValue(ebb->ptrsSet,pdop->key)){
ic->op = '=';
IC_LEFT(ic) = NULL;
IC_RIGHT(ic) = pdop;
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
!(IS_BITFIELD(OP_SYMBOL(IC_RESULT(ic))->etype) ||
isOperandVolatile(IC_LEFT(ic),TRUE))) {
pdop = NULL;
- applyToSet(ptrSetSet,findPointerSet,IC_LEFT(ic),&pdop);
+ applyToSet(ptrSetSet,findPointerSet,IC_LEFT(ic),&pdop,IC_RESULT(ic));
/* if we find it then locally replace all
references to the result with what we assigned */
if (pdop) {