aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-11-09 14:01:33 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-11-09 14:01:33 +0000
commit76e910c6b72b46e017d7be9a6494113ebae72f85 (patch)
treed8b32d4da8ab288343c7d289a01fb22089dced27 /gcc
parentde266950570fd88e4e205bfb87bcbd7ba89b5c27 (diff)
downloadgcc-76e910c6b72b46e017d7be9a6494113ebae72f85.zip
gcc-76e910c6b72b46e017d7be9a6494113ebae72f85.tar.gz
gcc-76e910c6b72b46e017d7be9a6494113ebae72f85.tar.bz2
bitmap.h (bitmap_single_bit_set_p): Declare.
2007-11-09 Richard Guenther <rguenther@suse.de> * bitmap.h (bitmap_single_bit_set_p): Declare. * bitmap.c (bitmap_single_bit_set_p): New function. * tree-ssa-alias.c (add_may_alias_for_new_tag): Use it. (maybe_create_global_var): Use bitmap_empty_p. From-SVN: r130045
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/bitmap.c34
-rw-r--r--gcc/bitmap.h3
-rw-r--r--gcc/tree-ssa-alias.c5
4 files changed, 47 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3fac080..5e44419 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-11-09 Richard Guenther <rguenther@suse.de>
+
+ * bitmap.h (bitmap_single_bit_set_p): Declare.
+ * bitmap.c (bitmap_single_bit_set_p): New function.
+ * tree-ssa-alias.c (add_may_alias_for_new_tag): Use it.
+ (maybe_create_global_var): Use bitmap_empty_p.
+
2007-11-09 Paolo Bonzini <bonzini@gnu.org>
Jakub Jelinek <jakub@redhat.com>
diff --git a/gcc/bitmap.c b/gcc/bitmap.c
index 8b66548..c2a66f9 100644
--- a/gcc/bitmap.c
+++ b/gcc/bitmap.c
@@ -693,6 +693,40 @@ bitmap_count_bits (const_bitmap a)
return count;
}
+/* Return true if the bitmap has a single bit set. Otherwise return
+ false. */
+
+bool
+bitmap_single_bit_set_p (const_bitmap a)
+{
+ unsigned long count = 0;
+ const bitmap_element *elt;
+ unsigned ix;
+
+ if (bitmap_empty_p (a))
+ return false;
+
+ elt = a->first;
+ /* As there are no completely empty bitmap elements, a second one
+ means we have more than one bit set. */
+ if (elt->next != NULL)
+ return false;
+
+ for (ix = 0; ix != BITMAP_ELEMENT_WORDS; ix++)
+ {
+#if GCC_VERSION >= 3400
+ /* Note that popcountl matches BITMAP_WORD in type, so the actual size
+ of BITMAP_WORD is not material. */
+ count += __builtin_popcountl (elt->bits[ix]);
+#else
+ count += bitmap_popcount (elt->bits[ix]);
+#endif
+ if (count > 1)
+ return false;
+ }
+
+ return count == 1;
+}
/* Return the bit number of the first set bit in the bitmap. The
diff --git a/gcc/bitmap.h b/gcc/bitmap.h
index 66fed85..0b6ed73 100644
--- a/gcc/bitmap.h
+++ b/gcc/bitmap.h
@@ -107,6 +107,9 @@ extern bool bitmap_intersect_compl_p (const_bitmap, const_bitmap);
/* True if MAP is an empty bitmap. */
#define bitmap_empty_p(MAP) (!(MAP)->first)
+/* True if the bitmap has only a single bit set. */
+extern bool bitmap_single_bit_set_p (const_bitmap);
+
/* Count the number of bits set in the bitmap. */
extern unsigned long bitmap_count_bits (const_bitmap);
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index dc40c2e..f2e3064 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -2780,7 +2780,7 @@ maybe_create_global_var (void)
So, if we have some pure/const and some regular calls in the
program we create .GLOBAL_VAR to avoid missing these
relations. */
- if (bitmap_count_bits (gimple_call_clobbered_vars (cfun)) == 0
+ if (bitmap_empty_p (gimple_call_clobbered_vars (cfun))
&& stats->num_call_sites > 0
&& stats->num_pure_const_call_sites > 0
&& stats->num_call_sites > stats->num_pure_const_call_sites)
@@ -3544,7 +3544,8 @@ add_may_alias_for_new_tag (tree tag, tree var)
aliases = may_aliases (var);
/* Case 1: |aliases| == 1 */
- if (aliases && bitmap_count_bits (aliases) == 1)
+ if (aliases
+ && bitmap_single_bit_set_p (aliases))
{
tree ali = referenced_var (bitmap_first_set_bit (aliases));
if (TREE_CODE (ali) == SYMBOL_MEMORY_TAG)