sim/ucsim/gui.src/Makefile.in: target "install" builds the same packages as target...
[fw/sdcc] / src / SDCCcse.c
index 4b6eadcc50c357866b0fb47df78552f6063a9e04..8942590efaa793ca29e633f76590d7e36fadaa51 100644 (file)
@@ -1,9 +1,3 @@
-//#define LIVERANGEHUNT
-#ifdef LIVERANGEHUNT
-  #define LRH(x) x
-#else
-  #define LRH(x)
-#endif
 /*-------------------------------------------------------------------------
   SDCCcse.c - source file for Common Subexpressions and other utility
 
@@ -118,7 +112,6 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset)
 {
   iCode *lic;
 
-  LRH(printf ("replaceAllSymBySym: from %s to %s\n", OP_SYMBOL(from)->name, OP_SYMBOL(to)->name));
   for (lic = ic; lic; lic = lic->next)
     {
       int siaddr;
@@ -131,7 +124,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset)
            {
 
              bitVectUnSetBit (OP_USES (from), lic->key);
-             OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key));
+             OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key);
              siaddr = IC_COND (lic)->isaddr;
              IC_COND (lic) = operandFromOperand (to);
              IC_COND (lic)->isaddr = siaddr;
@@ -147,7 +140,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset)
            {
 
              bitVectUnSetBit (OP_USES (from), lic->key);
-             OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key));
+             OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key);
              siaddr = IC_COND (lic)->isaddr;
              IC_JTCOND (lic) = operandFromOperand (to);
              IC_JTCOND (lic)->isaddr = siaddr;
@@ -156,13 +149,14 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset)
          continue;
        }
 
-      if (IC_RESULT (lic) && IC_RESULT (lic)->key == from->key)
+      if (IS_SYMOP(to) && 
+         IC_RESULT (lic) && IC_RESULT (lic)->key == from->key)
        {
          /* maintain du chains */
          if (POINTER_SET (lic))
            {
              bitVectUnSetBit (OP_USES (from), lic->key);
-             OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key));
+             OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key);
 
              /* also check if the "from" was in the non-dominating
                 pointer sets and replace it with "to" in the bitVector */
@@ -176,7 +170,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset)
          else
            {
              bitVectUnSetBit (OP_DEFS (from), lic->key);
-             OP_DEFS_SET ((to), bitVectSetBit (OP_DEFS (to), lic->key));
+             OP_DEFS(to)=bitVectSetBit (OP_DEFS (to), lic->key);
            }
          siaddr = IC_RESULT (lic)->isaddr;
          IC_RESULT (lic) = operandFromOperand (to);
@@ -187,7 +181,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset)
          IC_RIGHT (lic) && IC_RIGHT (lic)->key == from->key)
        {
          bitVectUnSetBit (OP_USES (from), lic->key);
-         OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key));
+         OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key);
          siaddr = IC_RIGHT (lic)->isaddr;
          IC_RIGHT (lic) = operandFromOperand (to);
          IC_RIGHT (lic)->isaddr = siaddr;
@@ -197,7 +191,7 @@ replaceAllSymBySym (iCode * ic, operand * from, operand * to, bitVect ** ndpset)
          IC_LEFT (lic) && IC_LEFT (lic)->key == from->key)
        {
          bitVectUnSetBit (OP_USES (from), lic->key);
-         OP_USES_SET ((to), bitVectSetBit (OP_USES (to), lic->key));
+         OP_USES(to)=bitVectSetBit (OP_USES (to), lic->key);
          siaddr = IC_LEFT (lic)->isaddr;
          IC_LEFT (lic) = operandFromOperand (to);
          IC_LEFT (lic)->isaddr = siaddr;
@@ -334,6 +328,7 @@ DEFSETFUNC (findCheaperOp)
   if ((*opp) && 
       (isOperandLiteral(*opp) || !checkSign || 
        (checkSign &&
+       IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) &&
        (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp)) &&
         (SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp)))))))
       {
@@ -358,9 +353,28 @@ DEFSETFUNC (findCheaperOp)
          *opp = operandFromOperand (*opp);
          (*opp)->isaddr = cop->isaddr;
        }
-      LRH(printf ("findCheaperOp: %s < %s\n",\
-             IS_SYMOP((*opp)) ? OP_SYMBOL((*opp))->name : "!SYM",\
-             OP_SYMBOL(cop)->name));
+         
+      if (IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) &&
+         SPEC_NOUN(operandType(cop)) != SPEC_NOUN(operandType(*opp)))
+       {
+           // special case: we can make an unsigned char literal 
+           // into an int literal with no cost.
+           if (isOperandLiteral(*opp)
+            && SPEC_NOUN(operandType(*opp)) == V_CHAR
+            && SPEC_NOUN(operandType(cop)) == V_INT)
+           {
+               *opp = operandFromOperand (*opp);
+               SPEC_NOUN(operandType(*opp)) = V_INT;
+           }
+           else
+           {
+               // No clue...
+               *opp = NULL;
+               return 0;
+           }
+           
+        }
+         
       return 1;
 
     }
@@ -410,8 +424,7 @@ DEFSETFUNC (findPrevIc)
   if (isiCodeEqual (ic, cdp->diCode) &&
       isOperandEqual (cdp->sym, IC_RESULT (cdp->diCode)))
     {
-      LRH(printf ("findPrevIc same: %d %d\n", ic->key, cdp->diCode->key));
-       *icp = cdp->diCode;
+      *icp = cdp->diCode;
       return 1;
     }
 
@@ -422,7 +435,6 @@ DEFSETFUNC (findPrevIc)
       isOperandEqual (IC_LEFT (ic), IC_RIGHT (cdp->diCode)) &&
       isOperandEqual (IC_RIGHT (ic), IC_LEFT (cdp->diCode)))
     {
-      LRH(printf ("findPrevIc inter: %d %d\n", ic->key, cdp->diCode->key));
       *icp = cdp->diCode;
       return 1;
     }
@@ -1117,7 +1129,7 @@ ifxOptimize (iCode * ic, set * cseSet,
 
 
   /* if it remains an IFX the update the use Set */
-  OP_USES_SET ((IC_COND (ic)), bitVectSetBit (OP_USES (IC_COND (ic)), ic->key));
+  OP_USES(IC_COND (ic))=bitVectSetBit (OP_USES (IC_COND (ic)), ic->key);
   setUsesDefs (IC_COND (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs);
   return;
 }
@@ -1389,7 +1401,7 @@ cseBBlock (eBBlock * ebb, int computeOnly,
 
   /* if this block is not reachable */
   if (ebb->noPath)
-    return change;
+    return 0;
 
   /* set of common subexpressions */
   cseSet = setFromSet (ebb->inExprs);
@@ -1410,7 +1422,6 @@ cseBBlock (eBBlock * ebb, int computeOnly,
   /* for all the instructions in this block do */
   for (ic = ebb->sch; ic; ic = ic->next)
     {
-
       iCode *pdic;
       operand *pdop;
       iCode *defic;
@@ -1436,8 +1447,8 @@ cseBBlock (eBBlock * ebb, int computeOnly,
       if (ic->op == PCALL || ic->op == CALL || ic->op == RECEIVE)
        {
          /* add to defSet of the symbol */
-         OP_DEFS_SET ((IC_RESULT (ic)),
-           bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key));
+         OP_DEFS(IC_RESULT (ic))=
+           bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key);
          /* add to the definition set of this block */
          ebb->defSet = bitVectSetBit (ebb->defSet, ic->key);
          ebb->ldefs = bitVectSetBit (ebb->ldefs, ic->key);
@@ -1475,8 +1486,8 @@ cseBBlock (eBBlock * ebb, int computeOnly,
          /* the lookup could have changed it */
          if (IS_SYMOP (IC_LEFT (ic)))
            {
-             OP_USES_SET ((IC_LEFT (ic)),
-               bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key));
+             OP_USES(IC_LEFT (ic))=
+               bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key);
              setUsesDefs (IC_LEFT (ic), ebb->defSet,
                           ebb->outDefs, &ebb->usesDefs);
            }
@@ -1500,8 +1511,8 @@ cseBBlock (eBBlock * ebb, int computeOnly,
       /* if jumptable then mark the usage */
       if (ic->op == JUMPTABLE)
        {
-         OP_USES_SET ((IC_JTCOND (ic)),
-           bitVectSetBit (OP_USES (IC_JTCOND (ic)), ic->key));
+         OP_USES(IC_JTCOND (ic))=
+           bitVectSetBit (OP_USES (IC_JTCOND (ic)), ic->key);
          setUsesDefs (IC_JTCOND (ic), ebb->defSet,
                       ebb->outDefs, &ebb->usesDefs);
          continue;
@@ -1510,9 +1521,11 @@ cseBBlock (eBBlock * ebb, int computeOnly,
       if (SKIP_IC (ic))
        continue;
 
-      /* do some algebraic optimizations if possible */
-      algebraicOpts (ic);
-      while (constFold (ic, cseSet));
+      if (!computeOnly) {
+       /* do some algebraic optimizations if possible */
+       algebraicOpts (ic);
+       while (constFold (ic, cseSet));
+      }
 
       /* small klugde */
       if (POINTER_GET (ic) && !IS_PTR (operandType (IC_LEFT (ic))))
@@ -1528,7 +1541,7 @@ cseBBlock (eBBlock * ebb, int computeOnly,
                          aggrToPtr (operandType (IC_RESULT (ic)), FALSE));
        }
 
-      /* if this is a condition statment then */
+      /* if this is a condition statement then */
       /* check if the condition can be replaced */
       if (ic->op == IFX)
        {
@@ -1540,7 +1553,7 @@ cseBBlock (eBBlock * ebb, int computeOnly,
 
       /* if the assignment & result is a temp */
       /* see if we can replace it             */
-      if (ic->op == '=')
+      if (!computeOnly && ic->op == '=')
        {
 
          /* update the spill location for this */
@@ -1618,13 +1631,13 @@ cseBBlock (eBBlock * ebb, int computeOnly,
        }
        
       /* if left or right changed then do algebraic */
-      if (change)
+      if (!computeOnly && change)
        {
          algebraicOpts (ic);
          while (constFold (ic, cseSet));
        }
 
-      /* if after all this it becomes a assignment to self
+      /* if after all this it becomes an assignment to self
          then delete it and continue */
       if (ASSIGNMENT_TO_SELF (ic))
        {
@@ -1720,16 +1733,16 @@ cseBBlock (eBBlock * ebb, int computeOnly,
       /* add the left & right to the defUse set */
       if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)))
        {
-         OP_USES_SET ((IC_LEFT (ic)),
-           bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key));
+         OP_USES(IC_LEFT (ic))=
+           bitVectSetBit (OP_USES (IC_LEFT (ic)), ic->key);
          setUsesDefs (IC_LEFT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs);
 
        }
 
       if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)))
        {
-         OP_USES_SET ((IC_RIGHT (ic)),
-           bitVectSetBit (OP_USES (IC_RIGHT (ic)), ic->key));
+         OP_USES(IC_RIGHT (ic))=
+           bitVectSetBit (OP_USES (IC_RIGHT (ic)), ic->key);
          setUsesDefs (IC_RIGHT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs);
 
        }
@@ -1738,8 +1751,8 @@ cseBBlock (eBBlock * ebb, int computeOnly,
       /* in the defuseSet if it a pointer or array access  */
       if (POINTER_SET (defic))
        {
-         OP_USES_SET ((IC_RESULT (ic)),
-           bitVectSetBit (OP_USES (IC_RESULT (ic)), ic->key));
+         OP_USES(IC_RESULT (ic))=
+           bitVectSetBit (OP_USES (IC_RESULT (ic)), ic->key);
          setUsesDefs (IC_RESULT (ic), ebb->defSet, ebb->outDefs, &ebb->usesDefs);
          deleteItemIf (&cseSet, ifPointerGet, IC_RESULT (ic));
          ebb->ptrsSet = bitVectSetBit (ebb->ptrsSet, IC_RESULT (ic)->key);
@@ -1757,8 +1770,8 @@ cseBBlock (eBBlock * ebb, int computeOnly,
       else
        /* add the result to defintion set */ if (IC_RESULT (ic))
        {
-         OP_DEFS_SET ((IC_RESULT (ic)),
-           bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key));
+         OP_DEFS(IC_RESULT (ic))=
+           bitVectSetBit (OP_DEFS (IC_RESULT (ic)), ic->key);
          ebb->defSet = bitVectSetBit (ebb->defSet, ic->key);
          ebb->outDefs = bitVectCplAnd (ebb->outDefs, OP_DEFS (IC_RESULT (ic)));
          ebb->ldefs = bitVectSetBit (ebb->ldefs, ic->key);
@@ -1786,7 +1799,7 @@ cseBBlock (eBBlock * ebb, int computeOnly,
 /* cseAllBlocks - will sequentially go thru & do cse for all blocks */
 /*-----------------------------------------------------------------*/
 int 
-cseAllBlocks (eBBlock ** ebbs, int count)
+cseAllBlocks (eBBlock ** ebbs, int count, int computeOnly)
 {
   int i;
   int change = 0;
@@ -1794,7 +1807,7 @@ cseAllBlocks (eBBlock ** ebbs, int count)
   /* if optimization turned off */
 
   for (i = 0; i < count; i++)
-    change += cseBBlock (ebbs[i], FALSE, ebbs, count);
+    change += cseBBlock (ebbs[i], computeOnly, ebbs, count);
 
   return change;
 }