bitmap.h (bitmap_set_bit): Return bool.
authorRichard Guenther <rguenther@suse.de>
Wed, 2 Jul 2008 08:07:41 +0000 (08:07 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 2 Jul 2008 08:07:41 +0000 (08:07 +0000)
2008-07-02  Richard Guenther  <rguenther@suse.de>

* bitmap.h (bitmap_set_bit): Return bool.
(bitmap_clear_bit): Likewise.
* bitmap.c (bitmap_set_bit): Return if the bit changed.  Only
write to the bitmap if it would.
(bitmap_clear_bit): Likewise.
* tree-ssa-structalias.c (add_implicit_graph_edge): Use
bitmap_set_bit return value.
(add_pred_graph_edge): Likewise.
(add_graph_edge): Likewise.
(do_sd_constraint): Likewise.
(do_ds_constraint): Likewise.

From-SVN: r137345

gcc/ChangeLog
gcc/bitmap.c
gcc/bitmap.h
gcc/tree-ssa-structalias.c

index fe4267560fd1b23f37f4ebc4cdb5f54bf1b6a4c6..3f1a21e40eb92d13820c816a6cc621699a11bb2d 100644 (file)
@@ -1,3 +1,17 @@
+2008-07-02  Richard Guenther  <rguenther@suse.de>
+
+       * bitmap.h (bitmap_set_bit): Return bool.
+       (bitmap_clear_bit): Likewise.
+       * bitmap.c (bitmap_set_bit): Return if the bit changed.  Only
+       write to the bitmap if it would.
+       (bitmap_clear_bit): Likewise.
+       * tree-ssa-structalias.c (add_implicit_graph_edge): Use
+       bitmap_set_bit return value.
+       (add_pred_graph_edge): Likewise.
+       (add_graph_edge): Likewise.
+       (do_sd_constraint): Likewise.
+       (do_ds_constraint): Likewise.
+
 2008-07-02  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * config/alpha/alpha.c (alpha_need_linkage, alpha_use_linkage):
index 97e60de6b3c1f631ea5be24b6651c0ba8405a929..4fabdc915d23610cc41a4e53d9276cea27866b30 100644 (file)
@@ -595,9 +595,9 @@ bitmap_find_bit (bitmap head, unsigned int bit)
   return element;
 }
 \f
-/* Clear a single bit in a bitmap.  */
+/* Clear a single bit in a bitmap.  Return true if the bit changed.  */
 
-void
+bool
 bitmap_clear_bit (bitmap head, int bit)
 {
   bitmap_element *const ptr = bitmap_find_bit (head, bit);
@@ -606,17 +606,24 @@ bitmap_clear_bit (bitmap head, int bit)
     {
       unsigned bit_num  = bit % BITMAP_WORD_BITS;
       unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
-      ptr->bits[word_num] &= ~ (((BITMAP_WORD) 1) << bit_num);
+      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);
+
+      return res;
     }
+
+  return false;
 }
 
-/* Set a single bit in a bitmap.  */
+/* Set a single bit in a bitmap.  Return true if the bit changed.  */
 
-void
+bool
 bitmap_set_bit (bitmap head, int bit)
 {
   bitmap_element *ptr = bitmap_find_bit (head, bit);
@@ -630,9 +637,15 @@ bitmap_set_bit (bitmap head, int bit)
       ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
       ptr->bits[word_num] = bit_val;
       bitmap_element_link (head, ptr);
+      return true;
     }
   else
-    ptr->bits[word_num] |= bit_val;
+    {
+      bool res = (ptr->bits[word_num] & bit_val) == 0;
+      if (res)
+       ptr->bits[word_num] |= bit_val;
+      return res;
+    }
 }
 
 /* Return whether a bit is set within a bitmap.  */
index 2a3b0b4baf8c0651862e5fcb4d07cdd58264c5ec..7f17dc1d361a5ccdaa5de60554b85fef561156b9 100644 (file)
@@ -136,11 +136,11 @@ extern bool bitmap_ior_and_compl (bitmap DST, const_bitmap A, const_bitmap B, co
 /* A |= (B & ~C).  Return true if A changes.  */
 extern bool bitmap_ior_and_compl_into (bitmap DST, const_bitmap B, const_bitmap C);
 
-/* Clear a single register in a register set.  */
-extern void bitmap_clear_bit (bitmap, int);
+/* Clear a single bit in a bitmap.  Return true if the bit changed.  */
+extern bool bitmap_clear_bit (bitmap, int);
 
-/* Set a single register in a register set.  */
-extern void bitmap_set_bit (bitmap, int);
+/* Set a single bit in a bitmap.  Return true if the bit changed.  */
+extern bool bitmap_set_bit (bitmap, int);
 
 /* Return true if a register is set in a register set.  */
 extern int bitmap_bit_p (bitmap, int);
index 57a02a4c754d421ee08b3ca8226906ab1a659de9..e2b90c86b2e8bfe89220004ca4b0975914a3662d 100644 (file)
@@ -904,11 +904,8 @@ add_implicit_graph_edge (constraint_graph_t graph, unsigned int to,
   if (!graph->implicit_preds[to])
     graph->implicit_preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
 
-  if (!bitmap_bit_p (graph->implicit_preds[to], from))
-    {
-      stats.num_implicit_edges++;
-      bitmap_set_bit (graph->implicit_preds[to], from);
-    }
+  if (bitmap_set_bit (graph->implicit_preds[to], from))
+    stats.num_implicit_edges++;
 }
 
 /* Add a predecessor graph edge to GRAPH, going from TO to FROM if
@@ -921,8 +918,7 @@ add_pred_graph_edge (constraint_graph_t graph, unsigned int to,
 {
   if (!graph->preds[to])
     graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
-  if (!bitmap_bit_p (graph->preds[to], from))
-    bitmap_set_bit (graph->preds[to], from);
+  bitmap_set_bit (graph->preds[to], from);
 }
 
 /* Add a graph edge to GRAPH, going from FROM to TO if
@@ -943,12 +939,11 @@ add_graph_edge (constraint_graph_t graph, unsigned int to,
 
       if (!graph->succs[from])
        graph->succs[from] = BITMAP_ALLOC (&pta_obstack);
-      if (!bitmap_bit_p (graph->succs[from], to))
+      if (bitmap_set_bit (graph->succs[from], to))
        {
          r = true;
          if (to < FIRST_REF_NODE && from < FIRST_REF_NODE)
            stats.num_edges++;
-         bitmap_set_bit (graph->succs[from], to);
        }
       return r;
     }
@@ -1405,13 +1400,11 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
   unsigned int j;
   bitmap_iterator bi;
 
- if (bitmap_bit_p (delta, anything_id))
-   {
-     flag = !bitmap_bit_p (sol, anything_id);
-     if (flag)
-       bitmap_set_bit (sol, anything_id);
-     goto done;
-   }
+  if (bitmap_bit_p (delta, anything_id))
+    {
+      flag |= bitmap_set_bit (sol, anything_id);
+      goto done;
+    }
 
   /* For each variable j in delta (Sol(y)), add
      an edge in the graph from j to x, and union Sol(j) into Sol(x).  */
@@ -1436,13 +1429,9 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
          /* Merging the solution from ESCAPED needlessly increases
             the set.  Use ESCAPED as representative instead.
             Same for CALLUSED.  */
-         else if ((get_varinfo (t)->id == escaped_id
-                   || get_varinfo (t)->id == callused_id)
-                  && !bitmap_bit_p (sol, get_varinfo (t)->id))
-           {
-             bitmap_set_bit (sol, get_varinfo (t)->id);
-             flag = true;
-           }
+         else if (get_varinfo (t)->id == escaped_id
+                  || get_varinfo (t)->id == callused_id)
+           flag |= bitmap_set_bit (sol, get_varinfo (t)->id);
          else if (add_graph_edge (graph, lhs, t))
            flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
        }
@@ -1486,14 +1475,11 @@ do_ds_constraint (constraint_t c, bitmap delta)
           continue;
         t = find (v->id);
 
-        if (!bitmap_bit_p (get_varinfo (t)->solution, anything_id))
+        if (bitmap_set_bit (get_varinfo (t)->solution, anything_id)
+            && !TEST_BIT (changed, t))
           {
-            bitmap_set_bit (get_varinfo (t)->solution, anything_id);
-            if (!TEST_BIT (changed, t))
-              {
-                SET_BIT (changed, t);
-                changed_count++;
-              }
+            SET_BIT (changed, t);
+            changed_count++;
           }
        }
      return;