From 76e910c6b72b46e017d7be9a6494113ebae72f85 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 9 Nov 2007 14:01:33 +0000 Subject: [PATCH] bitmap.h (bitmap_single_bit_set_p): Declare. 2007-11-09 Richard Guenther * 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 --- gcc/ChangeLog | 7 +++++++ gcc/bitmap.c | 34 ++++++++++++++++++++++++++++++++++ gcc/bitmap.h | 3 +++ gcc/tree-ssa-alias.c | 5 +++-- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fac0800a10..5e44419a817 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-11-09 Richard Guenther + + * 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 Jakub Jelinek diff --git a/gcc/bitmap.c b/gcc/bitmap.c index 8b66548add9..c2a66f96a73 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 66fed855afe..0b6ed731922 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 dc40c2ef398..f2e30646d4c 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)