]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ira-live.c: Include sbitmap.h.
authorVladimir Makarov <vmakarov@redhat.com>
Tue, 10 Aug 2010 21:39:13 +0000 (21:39 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Tue, 10 Aug 2010 21:39:13 +0000 (21:39 +0000)
2010-08-10  Vladimir Makarov  <vmakarov@redhat.com>

* ira-live.c: Include sbitmap.h.
(remove_some_program_points_and_update_live_ranges): Use sbitmaps.
Compress live ranges even more.

From-SVN: r163080

gcc/ChangeLog
gcc/ira-lives.c

index 332c986a502765024b2e2dcb00a2a0bbb2ada449..9c838ba4ad2da272ac90670f523dedec738921ce 100644 (file)
@@ -1,3 +1,9 @@
+2010-08-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * ira-live.c: Include sbitmap.h.
+       (remove_some_program_points_and_update_live_ranges): Use sbitmaps.
+       Compress live ranges even more.
+
 2010-08-10  Nathan Froyd  <froydnj@codesourcery.com>
 
        * coverage.c (ctr_labels): Delete.
index 5b75f54e5d3b3d54a86c1f329f58825fd017ab72..1ffed789e3d2ef0e55f054a3a75362df0c7a89be 100644 (file)
@@ -37,6 +37,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "toplev.h"
 #include "params.h"
 #include "df.h"
+#include "sbitmap.h"
 #include "sparseset.h"
 #include "ira-int.h"
 
@@ -1308,25 +1309,43 @@ remove_some_program_points_and_update_live_ranges (void)
   ira_object_t obj;
   ira_object_iterator oi;
   live_range_t r;
-  bitmap born_or_died;
-  bitmap_iterator bi;
-
-  born_or_died = ira_allocate_bitmap ();
+  sbitmap born_or_dead, born, dead;
+  sbitmap_iterator sbi;
+  bool born_p, dead_p, prev_born_p, prev_dead_p;
+  
+  born = sbitmap_alloc (ira_max_point);
+  dead = sbitmap_alloc (ira_max_point);
+  sbitmap_zero (born);
+  sbitmap_zero (dead);
   FOR_EACH_OBJECT (obj, oi)
     for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
       {
        ira_assert (r->start <= r->finish);
-       bitmap_set_bit (born_or_died, r->start);
-       bitmap_set_bit (born_or_died, r->finish);
+       SET_BIT (born, r->start);
+       SET_BIT (dead, r->finish);
       }
 
+  born_or_dead = sbitmap_alloc (ira_max_point);
+  sbitmap_a_or_b (born_or_dead, born, dead);
   map = (int *) ira_allocate (sizeof (int) * ira_max_point);
-  n = 0;
-  EXECUTE_IF_SET_IN_BITMAP(born_or_died, 0, i, bi)
+  n = -1;
+  prev_born_p = prev_dead_p = false;
+  EXECUTE_IF_SET_IN_SBITMAP (born_or_dead, 0, i, sbi)
     {
-      map[i] = n++;
+      born_p = TEST_BIT (born, i);
+      dead_p = TEST_BIT (dead, i);
+      if ((prev_born_p && ! prev_dead_p && born_p && ! dead_p)
+         || (prev_dead_p && ! prev_born_p && dead_p && ! born_p))
+       map[i] = n;
+      else
+       map[i] = ++n;
+      prev_born_p = born_p;
+      prev_dead_p = dead_p;
     }
-  ira_free_bitmap (born_or_died);
+  sbitmap_free (born_or_dead);
+  sbitmap_free (born);
+  sbitmap_free (dead);
+  n++;
   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
     fprintf (ira_dump_file, "Compressing live ranges: from %d to %d - %d%%\n",
             ira_max_point, n, 100 * n / ira_max_point);