* src/SDCCopt.c (cnvToFcall): fixed bug 1551947 by updating OP_USES
authorMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 5 Sep 2006 06:30:03 +0000 (06:30 +0000)
committerMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 5 Sep 2006 06:30:03 +0000 (06:30 +0000)
  and OP_DEFS

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4361 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCCopt.c

index 43419e56a33ec20205b1a75d495d7270ea1d7492..1bc23eec619e456b8c0bae30f71dd16e203117bb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-05 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * src/SDCCopt.c (cnvToFcall): fixed bug 1551947 by updating OP_USES
+         and OP_DEFS
+
 2006-09-05 Raphael Neider <rneider AT web.de>
 
        * device/lib/pic16/libdev/pic18f4550.c,
index 822afc72b20b3c5047f9ee3fcdbffbebd3580a4b..9a88fdf28eaf0d61bbc74d00d232465893b6874b 100644 (file)
@@ -68,7 +68,12 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
   left = IC_LEFT (ic);
   right = IC_RIGHT (ic);
 
-  if(IS_FLOAT(operandType( IC_RIGHT( ic ) ))) {
+  if (IS_SYMOP (left))
+      bitVectUnSetBit (OP_USES (left), ic->key);
+  if (IS_SYMOP (right))
+      bitVectUnSetBit (OP_USES (right), ic->key);
+  
+  if (IS_FLOAT (operandType (right))) {
     switch (ic->op)
       {
       case '+':
@@ -103,7 +108,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
         break;
       }
   } else
-  if(IS_FIXED16X16 (operandType (IC_RIGHT(ic)))) {
+  if (IS_FIXED16X16 (operandType (right))) {
     switch (ic->op)
       {
       case '+':
@@ -147,31 +152,35 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       /* first one */
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
         {
-          newic = newiCode (SEND, IC_LEFT (ic), NULL);
+          newic = newiCode (SEND, left, NULL);
           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
         }
       else
         {
-          newic = newiCode ('=', NULL, IC_LEFT (ic));
+          newic = newiCode ('=', NULL, left);
           IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
         }
 
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
+      if (IS_SYMOP (left))
+          OP_USES (left) = bitVectSetBit (OP_USES (left), newic->key);
 
       /* second one */
       if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
         {
-          newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+          newic = newiCode (SEND, right, NULL);
           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
         }
       else
         {
-          newic = newiCode ('=', NULL, IC_RIGHT (ic));
+          newic = newiCode ('=', NULL, right);
           IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next);
         }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
+      if (IS_SYMOP (right))
+          OP_USES (right) = bitVectSetBit (OP_USES (right), newic->key);
 
     }
   else
@@ -187,12 +196,13 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
         {
           newic = newiCode (IPUSH, right, NULL);
           newic->parmPush = 1;
-          //bytesPushed+=4;
           bytesPushed += getSize(operandType(right));
         }
 
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
+      if (IS_SYMOP (right))
+          OP_USES (right) = bitVectSetBit (OP_USES (right), newic->key);
 
       /* insert push left */
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
@@ -204,17 +214,21 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
         {
           newic = newiCode (IPUSH, left, NULL);
           newic->parmPush = 1;
-          //bytesPushed+=4;
           bytesPushed += getSize(operandType(left));
         }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
+      if (IS_SYMOP (left))
+          OP_USES (left) = bitVectSetBit (OP_USES (left), newic->key);
+
     }
   /* insert the call */
   newic = newiCode (CALL, operandFromSymbol (func), NULL);
   IC_RESULT (newic) = IC_RESULT (ic);
+  bitVectUnSetBit (OP_DEFS (IC_RESULT (ic)), ic->key);
+  OP_USES (IC_RESULT (newic)) = bitVectSetBit (OP_USES (IC_RESULT (newic)), newic->key);
   newic->lineno = lineno;
-  newic->parmBytes+=bytesPushed;
+  newic->parmBytes += bytesPushed;
   ebp->hasFcall = 1;
   if (currFunc)
     FUNC_HASFCALL (currFunc->type) = 1;
@@ -781,7 +795,6 @@ convertToFcall (eBBlock ** ebbs, int count)
               (IS_FLOAT (operandType (IC_RIGHT (ic))) ||
                IS_FIXED( operandType (IC_RIGHT (ic)))))
             {
-
               cnvToFcall (ic, ebbs[i]);
             }
 
@@ -1554,7 +1567,7 @@ eBBlockFromiCode (iCode * ic)
   /* convert operations with support routines
      written in C to function calls : I am doing
      this at this point since I want all the
-     operations to be as they are for optimzations */
+     operations to be as they are for optimizations */
   convertToFcall (ebbi->bbOrder, ebbi->count);
 
   /* compute the live ranges */