reimplemented function inCalleeSaveList() by using sets instead fixed width array...
[fw/sdcc] / src / SDCCcse.c
index 8942590efaa793ca29e633f76590d7e36fadaa51..081250a1207687086c55b42ff20e7fb61156ad25 100644 (file)
@@ -83,9 +83,9 @@ pcseDef (void *item, va_list ap)
 
 void ReplaceOpWithCheaperOp(operand **op, operand *cop) {
 #ifdef RANGEHUNT
-  printf ("ReplaceOpWithCheaperOp (%s:%d with %s:%d): ", 
-         OP_SYMBOL((*op))->name, OP_SYMBOL((*op))->isreqv,
-         OP_SYMBOL(cop)->name, OP_SYMBOL(cop)->isreqv);
+  printf ("ReplaceOpWithCheaperOp %s with %s: ", 
+         IS_SYMOP((*op)) ? OP_SYMBOL((*op))->name : "!SYM", 
+         IS_SYMOP(cop) ? OP_SYMBOL(cop)->name : "!SYM");
   // if op is a register equivalent
   if (IS_ITEMP(cop) && OP_SYMBOL((*op))->isreqv) {
     operand **rop = &OP_SYMBOL((*op))->usl.spillLoc->reqv;
@@ -281,7 +281,7 @@ DEFSETFUNC (findCheaperOp)
        /* if the result is volatile then return result */
        if (IS_OP_VOLATILE (IC_RESULT (cdp->diCode)))
          *opp = IC_RESULT (cdp->diCode);
-       else 
+       else
          /* if this is a straight assignment and
             left is a temp then prefer the temporary to the
             true symbol */
@@ -624,7 +624,7 @@ iCode *findBackwardDef(operand *op,iCode *ic)
     iCode *lic;
 
     for (lic = ic; lic ; lic = lic->prev) {
-       if (IC_RESULT(lic) && isOperandEqual(op,IC_RESULT(lic))) 
+       if (IC_RESULT(lic) && isOperandEqual(op,IC_RESULT(lic)))
            return lic;
     }
     return NULL;
@@ -812,9 +812,21 @@ algebraicOpts (iCode * ic)
            }
          if (operandLitValue (IC_LEFT (ic)) == 1.0)
            {
-             ic->op = '=';
-             IC_LEFT (ic) = NULL;
-             SET_RESULT_RIGHT (ic);
+             /* '*' can have two unsigned chars as operands */
+             /* and an unsigned int as result.              */
+             if (compareType (operandType (IC_RESULT (ic)),
+                              operandType (IC_RIGHT (ic))) == 1)
+               {
+                 ic->op = '=';
+                 IC_LEFT (ic) = NULL;
+                 SET_RESULT_RIGHT (ic);
+               }
+             else
+               {
+                 ic->op = CAST;
+                 IC_LEFT (ic)->type = TYPE;
+                 setOperandType (IC_LEFT (ic), operandType (IC_RESULT (ic)));
+               }
              return;
            }
        }
@@ -832,10 +844,27 @@ algebraicOpts (iCode * ic)
 
          if (operandLitValue (IC_RIGHT (ic)) == 1.0)
            {
-             ic->op = '=';
-             IC_RIGHT (ic) = IC_LEFT (ic);
-             IC_LEFT (ic) = NULL;
-             SET_RESULT_RIGHT (ic);
+             /* '*' can have two unsigned chars as operands */
+             /* and an unsigned int as result.              */
+             if (compareType (operandType (IC_RESULT (ic)),
+                              operandType (IC_LEFT (ic))) == 1)
+               {
+                 ic->op = '=';
+                 IC_RIGHT (ic) = IC_LEFT (ic);
+                 IC_LEFT (ic) = NULL;
+                 SET_RESULT_RIGHT (ic);
+               }
+             else
+               {
+                  operand *op;
+
+                 ic->op = CAST;
+                 op = IC_RIGHT (ic);
+                 IC_RIGHT (ic) = IC_LEFT (ic);
+                 IC_LEFT (ic) = op;
+                 IC_LEFT (ic)->type = TYPE;
+                 setOperandType (IC_LEFT (ic), operandType (IC_RESULT (ic)));
+               }
              return;
            }
        }
@@ -1559,12 +1588,13 @@ cseBBlock (eBBlock * ebb, int computeOnly,
          /* update the spill location for this */
          updateSpillLocation (ic,0);
 
-         if (POINTER_SET (ic) &&
+         if (POINTER_SET (ic) && 
              !(IS_BITFIELD (OP_SYMBOL (IC_RESULT (ic))->etype)))
            {
              pdop = NULL;
              applyToSetFTrue (cseSet, findCheaperOp, IC_RESULT (ic), &pdop, 0);
-             if (pdop && IS_ITEMP (pdop) && !computeOnly)
+             if (pdop && !computeOnly &&
+                 IS_ITEMP (pdop) && IS_PTR(operandType(pdop)))
                ReplaceOpWithCheaperOp (&IC_RESULT(ic), pdop);
            }
        }