From 6c711ccf41b5e712ebfad40c83278bf33775bd9b Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 23 Apr 2008 14:06:02 +0000 Subject: [PATCH] 2008-04-23 Richard Guenther * alias.c (alias_set_subset_of): Correctly handle asking if zero is a subset of an alias set with zero child. * tree-ssa-alias.c (have_common_aliases_p): Simplify logic. (compute_flow_insensitive_aliasing): Correctly walk all pointers. Do not unnecessarily union sets. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@134597 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/alias.c | 5 +++-- gcc/tree-ssa-alias.c | 22 +++++++--------------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f0fb840..a774a43 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2008-04-23 Richard Guenther + * alias.c (alias_set_subset_of): Correctly handle asking + if zero is a subset of an alias set with zero child. + * tree-ssa-alias.c (have_common_aliases_p): Simplify logic. + (compute_flow_insensitive_aliasing): Correctly walk all + pointers. Do not unnecessarily union sets. + +2008-04-23 Richard Guenther + PR middle-end/36021 * c-common.c (handle_alloc_size_attribute): Use type_num_arguments. diff --git a/gcc/alias.c b/gcc/alias.c index 2e4f5ae..7b14f26 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -305,8 +305,9 @@ alias_set_subset_of (alias_set_type set1, alias_set_type set2) /* Otherwise, check if set1 is a subset of set2. */ ase = get_alias_set_entry (set2); if (ase != 0 - && (splay_tree_lookup (ase->children, - (splay_tree_key) set1))) + && ((ase->has_zero_child && set1 == 0) + || splay_tree_lookup (ase->children, + (splay_tree_key) set1))) return true; return false; } diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index a9ae29f..eb57010 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -2390,9 +2390,7 @@ have_common_aliases_p (bitmap tag1aliases, bitmap tag2aliases) /* This is the old behavior of have_common_aliases_p, which is to return false if both sets are empty, or one set is and the other isn't. */ - if ((tag1aliases == NULL && tag2aliases != NULL) - || (tag2aliases == NULL && tag1aliases != NULL) - || (tag1aliases == NULL && tag2aliases == NULL)) + if (tag1aliases == NULL || tag2aliases == NULL) return false; return bitmap_intersect_p (tag1aliases, tag2aliases); @@ -2490,12 +2488,16 @@ compute_flow_insensitive_aliasing (struct alias_info *ai) if (PTR_IS_REF_ALL (p_map1->var)) continue; - for (j = i + 1; j < ai->num_pointers; j++) + for (j = 0; j < ai->num_pointers; j++) { struct alias_map_d *p_map2 = ai->pointers[j]; tree tag2 = symbol_mem_tag (p_map2->var); bitmap may_aliases2 = may_aliases (tag2); + /* By convention tags don't alias themselves. */ + if (tag1 == tag2) + continue; + if (PTR_IS_REF_ALL (p_map2->var)) continue; @@ -2508,18 +2510,8 @@ compute_flow_insensitive_aliasing (struct alias_info *ai) if (have_common_aliases_p (may_aliases1, may_aliases2)) continue; - if (may_aliases2 && !bitmap_empty_p (may_aliases2)) - { - union_alias_set_into (tag1, may_aliases2); - } - else - { - /* Since TAG2 does not have any aliases of its own, add - TAG2 itself to the alias set of TAG1. */ - add_may_alias (tag1, tag2); - } + add_may_alias (tag1, tag2); } - } timevar_pop (TV_FLOW_INSENSITIVE); } -- 2.7.4