*opp = IC_RESULT (cdp->diCode);
if ((*opp) &&
- (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp))) &&
- (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp))))
+ (isOperandLiteral(*opp) ||
+ (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp)) &&
+ (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp))))))
{
if ((isGlobalInNearSpace (cop) &&
return 0;
}
+/*-------------------------------------------------------------------*/
+/* ifAssignedFromGlobal - if definition is an assignment from global */
+/*-------------------------------------------------------------------*/
+DEFSETFUNC (ifAssignedFromGlobal)
+{
+ cseDef *cdp = item;
+ iCode *dic=cdp->diCode;
+
+ if (dic->op=='=' && isOperandGlobal(IC_RIGHT(dic))) {
+ return 1;
+ }
+ return 0;
+}
+
/*-----------------------------------------------------------------*/
/* ifDefGlobal - if definition is global */
/*-----------------------------------------------------------------*/
/* delete global variables from the cseSet
since they can be modified by the function call */
deleteItemIf (&cseSet, ifDefGlobal);
+
+ /* and also itemps assigned from globals */
+ deleteItemIf (&cseSet, ifAssignedFromGlobal);
+
/* delete all getpointer iCodes from cseSet, this should
be done only for global arrays & pointers but at this
point we don't know if globals, so to be safe do all */
applyToSetFTrue (cseSet, findCheaperOp, IC_RIGHT (ic), &pdop);
if (pdop)
{
-
IC_RIGHT (ic) = pdop;
change = 1;
}
pdic = NULL;
}
-#if 0
+#if 0
/* if found then eliminate this and add to */
/* to cseSet an element containing result */
/* of this with previous opcode */
if (pdic && IS_ITEMP(IC_RESULT(ic))) {
/* 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);