this saves a few slocs without problems
[fw/sdcc] / src / SDCCopt.c
index 0ffaa5f24b9fca8d0371c9c944a8b5c1e1b0ff21..8b0902091af79002cb69bd6f7da1db7940aa8022 100644 (file)
@@ -109,6 +109,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
        {
          newic = newiCode (SEND, IC_LEFT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
        }
       else
        {
@@ -122,7 +123,8 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       /* second one */
       if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
        {
-         newic = newiCode (SEND, IC_LEFT (ic), NULL);
+         newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
        }
       else
        {
@@ -140,6 +142,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
        {
          newic = newiCode (SEND, right, NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
        }
       else
        {
@@ -155,6 +158,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
        {
          newic = newiCode (SEND, left, NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
        }
       else
        {
@@ -180,7 +184,7 @@ static void
 cnvToFloatCast (iCode * ic, eBBlock * ebp)
 {
   iCode *ip, *newic;
-  symbol *func;
+  symbol *func = NULL;
   sym_link *type = operandType (IC_RIGHT (ic));
   int linenno = ic->lineno;
   int bwd, su;
@@ -207,8 +211,11 @@ found:
   if (!options.float_rent)
     {
       /* first one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) 
+           {
+               newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+               newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+           }
       else
        {
          newic = newiCode ('=', NULL, IC_RIGHT (ic));
@@ -221,8 +228,10 @@ found:
   else
     {
       /* push the left */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
@@ -248,7 +257,7 @@ static void
 cnvFromFloatCast (iCode * ic, eBBlock * ebp)
 {
   iCode *ip, *newic;
-  symbol *func;
+  symbol *func = NULL;
   sym_link *type = operandType (IC_LEFT (ic));
   int lineno = ic->lineno;
   int bwd, su;
@@ -276,8 +285,10 @@ found:
   if (!options.float_rent)
     {
       /* first one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode ('=', NULL, IC_RIGHT (ic));
@@ -291,8 +302,10 @@ found:
     {
 
       /* push the left */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
@@ -360,8 +373,10 @@ found:
   if (!options.intlong_rent)
     {
       /* first one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_LEFT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_LEFT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode ('=', NULL, IC_LEFT (ic));
@@ -371,8 +386,10 @@ found:
       newic->lineno = lineno;
 
       /* second one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+      if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype)) {
+         newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
+      }
       else
        {
          newic = newiCode ('=', NULL, IC_RIGHT (ic));
@@ -389,6 +406,7 @@ found:
       if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
         {
           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
         }
       else
        {
@@ -404,6 +422,7 @@ found:
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
         {
           newic = newiCode (SEND, IC_LEFT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
         }
       else
        {
@@ -811,7 +830,7 @@ eBBlockFromiCode (iCode * ic)
     dumpEbbsToFileExt (DUMP_RAW1, ebbs, count);
 
   /* do common subexpression elimination for each block */
-  change = cseAllBlocks (ebbs, saveCount);
+  change = cseAllBlocks (ebbs, saveCount, FALSE);
 
   /* dumpraw if asked for */
   if (options.dump_raw)
@@ -827,10 +846,15 @@ eBBlockFromiCode (iCode * ic)
   /* global common subexpression elimination  */
   if (optimize.global_cse)
     {
-      change += cseAllBlocks (ebbs, saveCount);
+      change += cseAllBlocks (ebbs, saveCount, FALSE);
       if (options.dump_gcse)
        dumpEbbsToFileExt (DUMP_GCSE, ebbs, saveCount);
     }
+  else
+    {
+      // compute the dataflow only
+      assert(cseAllBlocks (ebbs, saveCount, TRUE)==0);
+    }
   /* kill dead code */
   kchange = killDeadCode (ebbs, saveCount);
 
@@ -852,7 +876,7 @@ eBBlockFromiCode (iCode * ic)
   if (lchange || kchange)
     {
       computeDataFlow (ebbs, saveCount);
-      change += cseAllBlocks (ebbs, saveCount);
+      change += cseAllBlocks (ebbs, saveCount, FALSE);
       if (options.dump_loop)
        dumpEbbsToFileExt (DUMP_LOOPG, ebbs, count);
 
@@ -870,6 +894,23 @@ eBBlockFromiCode (iCode * ic)
   /* sort it back by block number */
   qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
 
+  if (!options.lessPedantic) {
+    // this is a good place to check missing return values
+    if (currFunc) {
+      if (!IS_VOID(currFunc->etype)) {
+       eBBlock *bp;
+       // make sure all predecessors of the last block end in a return
+       for (bp=setFirstItem(ebbs[saveCount-1]->predList); 
+            bp; 
+            bp=setNextItem(ebbs[saveCount-1]->predList)) {
+         if (bp->ech->op != RETURN) {
+           werror (W_VOID_FUNC, currFunc->name);
+         }
+       }
+      }
+    }
+  }
+
   /* if cyclomatic info requested then print it */
   if (options.cyclomatic)
     printCyclomatic (ebbs, saveCount);
@@ -897,6 +938,8 @@ eBBlockFromiCode (iCode * ic)
   /* throw away blocks */
   setToNull ((void **) &graphEdges);
   ebbs = NULL;
+  
+  currFunc=NULL;
 
   return NULL;
 }