OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / bitmap.c
index f7309a0..8d7f1b2 100644 (file)
@@ -1,6 +1,6 @@
 /* Functions to support general ended bitmaps.
    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-   2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+   2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -21,9 +21,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
-#include "tm.h"
-#include "rtl.h"
-#include "flags.h"
 #include "obstack.h"
 #include "ggc.h"
 #include "bitmap.h"
@@ -42,6 +39,7 @@ struct bitmap_descriptor
   HOST_WIDEST_INT peak;
   HOST_WIDEST_INT current;
   int nsearches;
+  int search_iter;
 };
 
 /* Hashtable mapping bitmap names to descriptors.  */
@@ -229,7 +227,7 @@ bitmap_element_allocate (bitmap head)
          /*  Inner list was just a singleton.  */
          bitmap_ggc_free = element->prev;
       else
-       element = GGC_NEW (bitmap_element);
+       element = ggc_alloc_bitmap_element_def ();
     }
 
 #ifdef GATHER_STATISTICS
@@ -374,7 +372,7 @@ bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL)
 {
   bitmap map;
 
-  map = GGC_NEW (struct bitmap_head_def);
+  map = ggc_alloc_bitmap_head_def ();
   bitmap_initialize_stat (map, NULL PASS_MEM_STAT);
 #ifdef GATHER_STATISTICS
   register_overhead (map, sizeof (bitmap_head));
@@ -498,7 +496,7 @@ bitmap_elt_insert_after (bitmap head, bitmap_element *elt, unsigned int indx)
     }
   else
     {
-      gcc_assert (head->current);
+      gcc_checking_assert (head->current);
       node->next = elt->next;
       if (node->next)
        node->next->prev = node;
@@ -556,12 +554,12 @@ bitmap_find_bit (bitmap head, unsigned int bit)
   bitmap_element *element;
   unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
 
-#ifdef GATHER_STATISTICS
-  head->desc->nsearches++;
-#endif
   if (head->current == 0
       || head->indx == indx)
     return head->current;
+#ifdef GATHER_STATISTICS
+  head->desc->nsearches++;
+#endif
 
   if (head->indx < indx)
     /* INDX is beyond head->indx.  Search from head->current
@@ -569,7 +567,11 @@ bitmap_find_bit (bitmap head, unsigned int bit)
     for (element = head->current;
         element->next != 0 && element->indx < indx;
         element = element->next)
+#ifdef GATHER_STATISTICS
+      head->desc->search_iter++;
+#else
       ;
+#endif
 
   else if (head->indx / 2 < indx)
     /* INDX is less than head->indx and closer to head->indx than to
@@ -577,7 +579,11 @@ bitmap_find_bit (bitmap head, unsigned int bit)
     for (element = head->current;
         element->prev != 0 && element->indx > indx;
         element = element->prev)
+#ifdef GATHER_STATISTICS
+      head->desc->search_iter++;
+#else
       ;
+#endif
 
   else
     /* INDX is less than head->indx and closer to 0 than to
@@ -585,7 +591,11 @@ bitmap_find_bit (bitmap head, unsigned int bit)
     for (element = head->first;
         element->next != 0 && element->indx < indx;
         element = element->next)
+#ifdef GATHER_STATISTICS
+      head->desc->search_iter++;
+#else
       ;
+#endif
 
   /* `element' is the nearest to the one we want.  If it's not the one we
      want, the one we want doesn't exist.  */
@@ -611,11 +621,13 @@ bitmap_clear_bit (bitmap head, int bit)
       BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
       bool res = (ptr->bits[word_num] & bit_val) != 0;
       if (res)
-       ptr->bits[word_num] &= ~bit_val;
-
-      /* If we cleared the entire word, free up the element.  */
-      if (bitmap_element_zerop (ptr))
-       bitmap_element_free (head, ptr);
+       {
+         ptr->bits[word_num] &= ~bit_val;
+         /* If we cleared the entire word, free up the element.  */
+         if (!ptr->bits[word_num]
+             && bitmap_element_zerop (ptr))
+           bitmap_element_free (head, ptr);
+       }
 
       return res;
     }
@@ -767,7 +779,7 @@ bitmap_first_set_bit (const_bitmap a)
   BITMAP_WORD word;
   unsigned ix;
 
-  gcc_assert (elt);
+  gcc_checking_assert (elt);
   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
   for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
     {
@@ -802,7 +814,7 @@ bitmap_first_set_bit (const_bitmap a)
   if (!(word & 0x1))
     word >>= 1, bit_no += 1;
 
- gcc_assert (word & 1);
+ gcc_checking_assert (word & 1);
 #endif
  return bit_no;
 }
@@ -818,7 +830,7 @@ bitmap_last_set_bit (const_bitmap a)
   BITMAP_WORD word;
   int ix;
 
-  gcc_assert (elt);
+  gcc_checking_assert (elt);
   while (elt->next)
     elt = elt->next;
   bit_no = elt->indx * BITMAP_ELEMENT_ALL_BITS;
@@ -856,7 +868,7 @@ bitmap_last_set_bit (const_bitmap a)
     word >>= 1, bit_no += 1;
 #endif
 
- gcc_assert (word & 1);
+ gcc_checking_assert (word & 1);
  return bit_no;
 }
 \f
@@ -895,7 +907,7 @@ bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
            dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
          else
            dst_elt->indx = a_elt->indx;
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
 
@@ -914,7 +926,7 @@ bitmap_and (bitmap dst, const_bitmap a, const_bitmap b)
   /* Ensure that dst->current is valid.  */
   dst->current = dst->first;
   bitmap_elt_clear_from (dst, dst_elt);
-  gcc_assert (!dst->current == !dst->first);
+  gcc_checking_assert (!dst->current == !dst->first);
   if (dst->current)
     dst->indx = dst->current->indx;
 }
@@ -947,7 +959,7 @@ bitmap_and_into (bitmap a, const_bitmap b)
          unsigned ix;
          BITMAP_WORD ior = 0;
 
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD r = a_elt->bits[ix] & b_elt->bits[ix];
 
@@ -962,8 +974,8 @@ bitmap_and_into (bitmap a, const_bitmap b)
        }
     }
   bitmap_elt_clear_from (a, a_elt);
-  gcc_assert (!a->current == !a->first);
-  gcc_assert (!a->current || a->indx == a->current->indx);
+  gcc_checking_assert (!a->current == !a->first
+                      && (!a->current || a->indx == a->current->indx));
 }
 
 
@@ -979,7 +991,7 @@ bitmap_elt_copy (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
     {
       unsigned ix;
 
-      for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+      for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
        if (src_elt->bits[ix] != dst_elt->bits[ix])
          {
            dst_elt->bits[ix] = src_elt->bits[ix];
@@ -1043,7 +1055,7 @@ bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
 
          if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
            {
-             for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+             for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
                {
                  BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
 
@@ -1069,7 +1081,7 @@ bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
                  new_element = false;
                }
 
-             for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+             for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
                {
                  BITMAP_WORD r = a_elt->bits[ix] & ~b_elt->bits[ix];
 
@@ -1106,7 +1118,7 @@ bitmap_and_compl (bitmap dst, const_bitmap a, const_bitmap b)
       changed = true;
       bitmap_elt_clear_from (dst, dst_elt);
     }
-  gcc_assert (!dst->current == !dst->first);
+  gcc_checking_assert (!dst->current == !dst->first);
   if (dst->current)
     dst->indx = dst->current->indx;
 
@@ -1146,7 +1158,7 @@ bitmap_and_compl_into (bitmap a, const_bitmap b)
          unsigned ix;
          BITMAP_WORD ior = 0;
 
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
              BITMAP_WORD r = a_elt->bits[ix] ^ cleared;
@@ -1162,8 +1174,8 @@ bitmap_and_compl_into (bitmap a, const_bitmap b)
          b_elt = b_elt->next;
        }
     }
-  gcc_assert (!a->current == !a->first);
-  gcc_assert (!a->current || a->indx == a->current->indx);
+  gcc_checking_assert (!a->current == !a->first
+                      && (!a->current || a->indx == a->current->indx));
   return changed != 0;
 }
 
@@ -1194,7 +1206,7 @@ bitmap_set_range (bitmap head, unsigned int start, unsigned int count)
       bitmap_element_link (head, elt);
     }
 
-  gcc_assert (elt->indx == first_index);
+  gcc_checking_assert (elt->indx == first_index);
   elt_prev = elt->prev;
   for (i = first_index; i <= last_index; i++)
     {
@@ -1440,7 +1452,7 @@ bitmap_compl_and_into (bitmap a, const_bitmap b)
          unsigned ix;
          BITMAP_WORD ior = 0;
 
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD cleared = a_elt->bits[ix] & b_elt->bits[ix];
              BITMAP_WORD r = b_elt->bits[ix] ^ cleared;
@@ -1457,8 +1469,8 @@ bitmap_compl_and_into (bitmap a, const_bitmap b)
          b_elt = b_elt->next;
        }
     }
-  gcc_assert (!a->current == !a->first);
-  gcc_assert (!a->current || a->indx == a->current->indx);
+  gcc_checking_assert (!a->current == !a->first
+                      && (!a->current || a->indx == a->current->indx));
   return;
 }
 
@@ -1481,7 +1493,7 @@ bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
 
       if (!changed && dst_elt && dst_elt->indx == a_elt->indx)
        {
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
              if (r != dst_elt->bits[ix])
@@ -1498,7 +1510,7 @@ bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
            dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
          else
            dst_elt->indx = a_elt->indx;
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD r = a_elt->bits[ix] | b_elt->bits[ix];
              dst_elt->bits[ix] = r;
@@ -1515,7 +1527,7 @@ bitmap_elt_ior (bitmap dst, bitmap_element *dst_elt, bitmap_element *dst_prev,
       else
        src = b_elt;
 
-      gcc_assert (src);
+      gcc_checking_assert (src);
       changed = bitmap_elt_copy (dst, dst_elt, dst_prev, src, changed);
     }
   return changed;
@@ -1563,7 +1575,7 @@ bitmap_ior (bitmap dst, const_bitmap a, const_bitmap b)
       changed = true;
       bitmap_elt_clear_from (dst, dst_elt);
     }
-  gcc_assert (!dst->current == !dst->first);
+  gcc_checking_assert (!dst->current == !dst->first);
   if (dst->current)
     dst->indx = dst->current->indx;
   return changed;
@@ -1602,7 +1614,7 @@ bitmap_ior_into (bitmap a, const_bitmap b)
       a_elt = *a_prev_pnext;
     }
 
-  gcc_assert (!a->current == !a->first);
+  gcc_checking_assert (!a->current == !a->first);
   if (a->current)
     a->indx = a->current->indx;
   return changed;
@@ -1637,7 +1649,7 @@ bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
            dst_elt = bitmap_elt_insert_after (dst, dst_prev, a_elt->indx);
          else
            dst_elt->indx = a_elt->indx;
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
 
@@ -1680,7 +1692,7 @@ bitmap_xor (bitmap dst, const_bitmap a, const_bitmap b)
   /* Ensure that dst->current is valid.  */
   dst->current = dst->first;
   bitmap_elt_clear_from (dst, dst_elt);
-  gcc_assert (!dst->current == !dst->first);
+  gcc_checking_assert (!dst->current == !dst->first);
   if (dst->current)
     dst->indx = dst->current->indx;
 }
@@ -1722,7 +1734,7 @@ bitmap_xor_into (bitmap a, const_bitmap b)
          BITMAP_WORD ior = 0;
          bitmap_element *next = a_elt->next;
 
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            {
              BITMAP_WORD r = a_elt->bits[ix] ^ b_elt->bits[ix];
 
@@ -1737,7 +1749,7 @@ bitmap_xor_into (bitmap a, const_bitmap b)
          a_elt = next;
        }
     }
-  gcc_assert (!a->current == !a->first);
+  gcc_checking_assert (!a->current == !a->first);
   if (a->current)
     a->indx = a->current->indx;
 }
@@ -1759,7 +1771,7 @@ bitmap_equal_p (const_bitmap a, const_bitmap b)
     {
       if (a_elt->indx != b_elt->indx)
        return false;
-      for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+      for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
        if (a_elt->bits[ix] != b_elt->bits[ix])
          return false;
     }
@@ -1784,7 +1796,7 @@ bitmap_intersect_p (const_bitmap a, const_bitmap b)
        b_elt = b_elt->next;
       else
        {
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            if (a_elt->bits[ix] & b_elt->bits[ix])
              return true;
          a_elt = a_elt->next;
@@ -1811,7 +1823,7 @@ bitmap_intersect_compl_p (const_bitmap a, const_bitmap b)
        b_elt = b_elt->next;
       else
        {
-         for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
            if (a_elt->bits[ix] & ~b_elt->bits[ix])
              return true;
          a_elt = a_elt->next;
@@ -1867,7 +1879,7 @@ bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap k
 
          BITMAP_WORD ior = 0;
          tmp_elt.indx = b_elt->indx;
-          for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+         for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
             {
               BITMAP_WORD r = b_elt->bits[ix] & ~kill_elt->bits[ix];
               ior |= r;
@@ -1919,7 +1931,7 @@ bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b, const_bitmap k
       changed = true;
       bitmap_elt_clear_from (dst, dst_elt);
     }
-  gcc_assert (!dst->current == !dst->first);
+  gcc_checking_assert (!dst->current == !dst->first);
   if (dst->current)
     dst->indx = dst->current->indx;
 
@@ -1985,7 +1997,7 @@ bitmap_ior_and_into (bitmap a, const_bitmap b, const_bitmap c)
 
       overall = 0;
       and_elt.indx = b_elt->indx;
-      for (ix = BITMAP_ELEMENT_WORDS; ix--;)
+      for (ix = 0; ix < BITMAP_ELEMENT_WORDS; ix++)
        {
          and_elt.bits[ix] = b_elt->bits[ix] & c_elt->bits[ix];
          overall |= and_elt.bits[ix];
@@ -2015,7 +2027,7 @@ bitmap_ior_and_into (bitmap a, const_bitmap b, const_bitmap c)
     }
 
  done:
-  gcc_assert (!a->current == !a->first);
+  gcc_checking_assert (!a->current == !a->first);
   if (a->current)
     a->indx = a->current->indx;
   return changed;
@@ -2115,8 +2127,9 @@ print_statistics (void **slot, void *b)
       sprintf (s, "%s:%i (%s)", s1, d->line, d->function);
       s[41] = 0;
       fprintf (stderr, "%-41s %8d %15"HOST_WIDEST_INT_PRINT"d %15"
-              HOST_WIDEST_INT_PRINT"d %15"HOST_WIDEST_INT_PRINT"d %10d\n",
-              s, d->created, d->allocated, d->peak, d->current, d->nsearches);
+              HOST_WIDEST_INT_PRINT"d %15"HOST_WIDEST_INT_PRINT"d %10d %10d\n",
+              s, d->created, d->allocated, d->peak, d->current, d->nsearches,
+              d->search_iter);
       i->size += d->allocated;
       i->count += d->created;
     }
@@ -2134,8 +2147,8 @@ dump_bitmap_statistics (void)
     return;
 
   fprintf (stderr, "\nBitmap                                     Overall "
-                  "   Allocated        Peak           Leak   searched "
-                  "  per search\n");
+                  "      Allocated            Peak            Leak   searched "
+                  "  search itr\n");
   fprintf (stderr, "---------------------------------------------------------------------------------\n");
   info.count = 0;
   info.size = 0;