create/append dumpfiles on a per session base
[fw/sdcc] / src / SDCCcse.c
index 43c469a25e5b6298bda9034263fbc8e29cca0404..5345f49e03cd2c39eb9d17b6105f8d3751f9f2cd 100644 (file)
@@ -253,26 +253,25 @@ DEFSETFUNC (findCheaperOp)
       /* do a special check this will help in */
       /* constant propagation & dead code elim */
       /* for assignments only                 */
-      if (cdp->diCode->op == '=')
-       {
-         /* if the result is volatile then return result */
-         if (IS_OP_VOLATILE (IC_RESULT (cdp->diCode)))
-           *opp = IC_RESULT (cdp->diCode);
-         else
-           /* if this is a straight assignment and
-              left is a temp then prefer the temporary to the
-              true symbol */
-           if (!POINTER_SET (cdp->diCode) &&
-               IS_ITEMP (IC_RESULT (cdp->diCode)) &&
-               IS_TRUE_SYMOP (IC_RIGHT (cdp->diCode)))
+      if (cdp->diCode->op == '=') {
+       /* if the result is volatile then return result */
+       if (IS_OP_VOLATILE (IC_RESULT (cdp->diCode)))
+         *opp = IC_RESULT (cdp->diCode);
+       else 
+         /* if this is a straight assignment and
+            left is a temp then prefer the temporary to the
+            true symbol */
+         if (!POINTER_SET (cdp->diCode) &&
+             IS_ITEMP (IC_RESULT (cdp->diCode)) &&
+             IS_TRUE_SYMOP (IC_RIGHT (cdp->diCode)))
            *opp = IC_RESULT (cdp->diCode);
-         else
+         else {
            /* if straight assignement && and both
               are temps then prefer the one that
               will not need extra space to spil, also
               take into consideration if right side
               an induction variable
-            */
+           */
            if (!POINTER_SET (cdp->diCode) &&
                IS_ITEMP (IC_RESULT (cdp->diCode)) &&
                IS_ITEMP (IC_RIGHT (cdp->diCode)) &&
@@ -281,12 +280,12 @@ DEFSETFUNC (findCheaperOp)
                  SPIL_LOC (IC_RESULT (cdp->diCode))) ||
                 (SPIL_LOC (IC_RESULT (cdp->diCode)) &&
                  SPIL_LOC (IC_RESULT (cdp->diCode)) ==
-                 SPIL_LOC (IC_RIGHT (cdp->diCode))))
-           )
-           *opp = IC_RESULT (cdp->diCode);
-         else
-           *opp = IC_RIGHT (cdp->diCode);
-       }
+                 SPIL_LOC (IC_RIGHT (cdp->diCode)))))
+             *opp = IC_RESULT (cdp->diCode);
+           else
+             *opp = IC_RIGHT (cdp->diCode);
+         }
+      }
       else
        *opp = IC_RESULT (cdp->diCode);
     }
@@ -301,7 +300,10 @@ DEFSETFUNC (findCheaperOp)
       IS_ITEMP (IC_RESULT (cdp->diCode)))
     *opp = IC_RESULT (cdp->diCode);
 
-  if (*opp)
+  if ((*opp) && 
+      (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp))) &&
+      (SPEC_SHORT(operandType (cop))==SPEC_SHORT(operandType (*opp))) &&
+      (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp))))
     {
 
       if ((isGlobalInNearSpace (cop) &&
@@ -328,7 +330,7 @@ DEFSETFUNC (findCheaperOp)
       return 1;
 
     }
-
+  *opp=NULL;
   return 0;
 }
 
@@ -1160,9 +1162,9 @@ deleteGetPointers (set ** cseSet, set ** pss, operand * op, eBBlock * ebb)
             iTemp1 = iTemp0 + 8;
             iTemp2 = iTemp1 + 8; */
          if (isinSetWith (compItems, (void*)IC_LEFT (cdp->diCode), 
-                          (void*)isOperandEqual) ||
+                          (insetwithFunc)isOperandEqual) ||
              isinSetWith (compItems, (void*)IC_RIGHT (cdp->diCode), 
-                          (void*)isOperandEqual))
+                          (insetwithFunc)isOperandEqual))
            {
              addSet (&compItems, IC_RESULT (cdp->diCode));
            }