added peepholes 182.d (return 0.0), 256 (range check), 257 (do while), 258.a-f ...
[fw/sdcc] / src / SDCClrange.c
index b33428c33872323674116277bee3697e6ed326f5..ddf84ae8251d18e77308fd548a34bec3ccf7b0fc 100644 (file)
@@ -219,7 +219,8 @@ findNextUseSym (eBBlock *ebp, iCode *ic, symbol * sym)
   if (ebp->visited)
     return 0;
 
-  ebp->visited = 1;
+  if (ic == ebp->sch)
+    ebp->visited = 1;
 
   /* for all remaining instructions in current block */
   for (uic = ic; uic; uic = uic->next)
@@ -287,7 +288,7 @@ check_successors:
 
   if (retval)
     {
-      markAlive (ic, ebp->ech, sym->key);
+      if (ic) markAlive (ic, ebp->ech, sym->key);
       return 1;
     }
 
@@ -332,6 +333,28 @@ incUsed (iCode *ic, operand *op)
     OP_SYMBOL (op)->used += 1;
 }
 
+/*-----------------------------------------------------------------*/
+/* rliveClear - clears the rlive bitVectors                        */
+/*-----------------------------------------------------------------*/
+void
+rliveClear (eBBlock ** ebbs, int count)
+{
+  int i;
+
+  /* for all blocks do */
+  for (i = 0; i < count; i++)
+    {
+      iCode *ic;
+
+      /* for all instructions in this block do */
+      for (ic = ebbs[i]->sch; ic; ic = ic->next)
+        {
+         freeBitVect (ic->rlive);
+         ic->rlive = NULL;
+       }
+    }
+}
+
 /*-----------------------------------------------------------------*/
 /* rlivePoint - for each point compute the ranges that are alive   */
 /*-----------------------------------------------------------------*/
@@ -401,7 +424,7 @@ rlivePoint (eBBlock ** ebbs, int count)
                      iCode *lic;
                      for (lic = ic; lic; lic = lic->next)
                        {
-                         if (lic->op == CALL)
+                         if (lic->op == CALL || lic->op == PCALL)
                            {
                              markAlive (ic, lic->prev, IC_LEFT (ic)->key);
                              break;
@@ -447,10 +470,12 @@ rlivePoint (eBBlock ** ebbs, int count)
       alive = succ->sch->rlive;
       while ((succ = setNextItem (ebbs[i]->succList)))
         {
-         alive = bitVectIntersect (alive, succ->sch->rlive);
+         if (succ->sch)
+            alive = bitVectIntersect (alive, succ->sch->rlive);
        }
 
-      alive = bitVectCplAnd ( bitVectCopy (ebbs[i]->ech->rlive), alive);
+      if (ebbs[i]->ech)
+        alive = bitVectCplAnd ( bitVectCopy (ebbs[i]->ech->rlive), alive);
 
       for (key = 1; key < alive->size; key++)
         {
@@ -511,7 +536,9 @@ computeClash (eBBlock ** ebbs, int count)
                      IS_ITEMP(IC_RESULT(ic)) &&
                      (IS_ITEMP(IC_LEFT(ic)) || IS_ITEMP(IC_RIGHT(ic))))
                    {
-                     if (OP_SYMBOL(IC_RESULT(ic))->key == key1)
+                     if (OP_SYMBOL(IC_RESULT(ic))->key == key1
+                         && sym1->liveFrom == ic->seq
+                         && sym2->liveTo == ic->seq)
                        {
                          if (IS_SYMOP(IC_LEFT(ic)))
                            if (OP_SYMBOL(IC_LEFT(ic))->key == key2)
@@ -521,7 +548,9 @@ computeClash (eBBlock ** ebbs, int count)
                              continue;
                        }
 
-                     if (OP_SYMBOL(IC_RESULT(ic))->key == key2)
+                     if (OP_SYMBOL(IC_RESULT(ic))->key == key2
+                         && sym2->liveFrom == ic->seq
+                         && sym1->liveTo == ic->seq)
                        {
                          if (IS_SYMOP(IC_LEFT(ic)))
                            if (OP_SYMBOL(IC_LEFT(ic))->key == key1)
@@ -605,6 +634,10 @@ adjustIChain (eBBlock ** ebbs, int count)
         continue;
 
       ic = ebbs[i]->sch;
+
+      /* is there any code for this eBBlock? (e.g. ROM assignment) */
+      if(!ic)continue;
+
       while (ic->prev)
         ic = ic->prev;
       ebbs[i]->sch = ic;
@@ -648,3 +681,31 @@ computeLiveRanges (eBBlock ** ebbs, int count)
   computeClash(ebbs, count);
 }
 
+/*-----------------------------------------------------------------*/
+/* recomputeLiveRanges - recomputes the live ranges for variables  */
+/*-----------------------------------------------------------------*/
+void
+recomputeLiveRanges (eBBlock ** ebbs, int count)
+{
+  symbol * sym;
+  int key;
+
+  /* clear all rlive bitVectors */
+  rliveClear (ebbs, count);
+
+  sym = hTabFirstItem (liveRanges, &key);
+  if (sym)
+    {
+      do {
+        sym->used = 0;
+        sym->liveFrom = 0;
+        sym->liveTo = 0;
+        freeBitVect (sym->clashes);
+        sym->clashes = NULL;
+      } while ( (sym = hTabNextItem (liveRanges, &key)));
+    }
+
+  /* do the LR computation again */
+  computeLiveRanges (ebbs, count);
+}
+