I must have been braindead
[fw/sdcc] / src / SDCCopt.c
index 9d39029259c7eb62a2078041f0725e51c376e474..8b0902091af79002cb69bd6f7da1db7940aa8022 100644 (file)
@@ -106,28 +106,30 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
     {
 
       /* first one */
-      if (IS_REGPARM (func->args->etype))
+      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));
-         IC_RESULT (newic) = operandFromValue (func->args);
+         IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
        }
 
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
 
       /* second one */
-      if (IS_REGPARM (func->args->next->etype))
+      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
        {
          newic = newiCode ('=', NULL, IC_RIGHT (ic));
-         IC_RESULT (newic) = operandFromValue (func->args->next);
+         IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next);
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
@@ -137,9 +139,10 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
     {
 
       /* push right */
-      if (IS_REGPARM (func->args->next->etype))
+      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
        {
@@ -152,9 +155,10 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       newic->lineno = lineno;
 
       /* insert push left */
-      if (IS_REGPARM (func->args->etype))
+      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,12 +211,15 @@ found:
   if (!options.float_rent)
     {
       /* first one */
-      if (IS_REGPARM (func->args->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));
-         IC_RESULT (newic) = operandFromValue (func->args);
+         IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = linenno;
@@ -221,8 +228,10 @@ found:
   else
     {
       /* push the left */
-      if (IS_REGPARM (func->args->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,12 +285,14 @@ found:
   if (!options.float_rent)
     {
       /* first one */
-      if (IS_REGPARM (func->args->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));
-         IC_RESULT (newic) = operandFromValue (func->args);
+         IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
@@ -291,8 +302,10 @@ found:
     {
 
       /* push the left */
-      if (IS_REGPARM (func->args->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,23 +373,27 @@ found:
   if (!options.intlong_rent)
     {
       /* first one */
-      if (IS_REGPARM (func->args->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));
-         IC_RESULT (newic) = operandFromValue (func->args);
+         IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
 
       /* second one */
-      if (IS_REGPARM (func->args->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));
-         IC_RESULT (newic) = operandFromValue (func->args->next);
+         IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next);
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
@@ -386,9 +403,10 @@ found:
     {
       /* compiled as reentrant then push */
       /* push right */
-      if (IS_REGPARM (func->args->next->etype))
+      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
        {
@@ -401,9 +419,10 @@ found:
       newic->lineno = lineno;
 
       /* insert push left */
-      if (IS_REGPARM (func->args->etype))
+      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;
 }