From: Jie Zhang Date: Wed, 8 Sep 2004 11:07:35 +0000 (+0000) Subject: tree-ssa-alias.c (compute_flow_insensitive_aliasing): If type memory tag is call... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=13f5595a20c891d31bfb878087328b5d09bca436;p=gcc.git tree-ssa-alias.c (compute_flow_insensitive_aliasing): If type memory tag is call clobbered, so are its aliases. * tree-ssa-alias.c (compute_flow_insensitive_aliasing): If type memory tag is call clobbered, so are its aliases. (group_aliases): When two memory tags being grouped, if one is call clobbered, so are the other and its aliases. (add_may_alias): Remove call-clobbering stuff. (replace_may_alias): Likewise. (merge_pointed_to_info): Merge pt_global_mem. From-SVN: r87182 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1a2ac1dd41..4dc3df11110 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2004-09-08 Jie Zhang + + * tree-ssa-alias.c (compute_flow_insensitive_aliasing): If type + memory tag is call clobbered, so are its aliases. + (group_aliases): When two memory tags being grouped, if one is + call clobbered, so are the other and its aliases. + (add_may_alias): Remove call-clobbering stuff. + (replace_may_alias): Likewise. + (merge_pointed_to_info): Merge pt_global_mem + 2004-09-08 Jan Hubicka * cgraph.c (cgraph_remove_node): Free DECL_INITIAL field of node. diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 8b49699961c..4bd438b9439 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -930,6 +930,10 @@ compute_flow_insensitive_aliasing (struct alias_info *ai) num_tag_refs = VARRAY_UINT (ai->num_references, tag_ann->uid); num_var_refs = VARRAY_UINT (ai->num_references, v_ann->uid); + /* If TAG is call clobbered, so is VAR. */ + if (is_call_clobbered (tag)) + mark_call_clobbered (var); + /* Add VAR to TAG's may-aliases set. */ add_may_alias (tag, var); @@ -1122,8 +1126,29 @@ group_aliases (struct alias_info *ai) sbitmap_a_and_b (res, tag1_aliases, tag2_aliases); if (sbitmap_first_set_bit (res) >= 0) { + size_t k; + tree tag2 = var_ann (ai->pointers[j]->var)->type_mem_tag; + if (!is_call_clobbered (tag1) && is_call_clobbered (tag2)) + { + mark_call_clobbered (tag1); + EXECUTE_IF_SET_IN_SBITMAP (tag1_aliases, 0, k, + { + tree var = referenced_var (k); + mark_call_clobbered (var); + }); + } + else if (is_call_clobbered (tag1) && !is_call_clobbered (tag2)) + { + mark_call_clobbered (tag2); + EXECUTE_IF_SET_IN_SBITMAP (tag2_aliases, 0, k, + { + tree var = referenced_var (k); + mark_call_clobbered (var); + }); + } + sbitmap_a_or_b (tag1_aliases, tag1_aliases, tag2_aliases); /* TAG2 does not need its aliases anymore. */ @@ -1640,16 +1665,6 @@ add_may_alias (tree var, tree alias) if (alias == VARRAY_TREE (v_ann->may_aliases, i)) return; - /* If VAR is a call-clobbered variable, so is its new ALIAS. - FIXME, call-clobbering should only depend on whether an address - escapes. It should be independent of aliasing. */ - if (is_call_clobbered (var)) - mark_call_clobbered (alias); - - /* Likewise. If ALIAS is call-clobbered, so is VAR. */ - else if (is_call_clobbered (alias)) - mark_call_clobbered (var); - VARRAY_PUSH_TREE (v_ann->may_aliases, alias); a_ann->is_alias_tag = 1; } @@ -1662,16 +1677,6 @@ replace_may_alias (tree var, size_t i, tree new_alias) { var_ann_t v_ann = var_ann (var); VARRAY_TREE (v_ann->may_aliases, i) = new_alias; - - /* If VAR is a call-clobbered variable, so is NEW_ALIAS. - FIXME, call-clobbering should only depend on whether an address - escapes. It should be independent of aliasing. */ - if (is_call_clobbered (var)) - mark_call_clobbered (new_alias); - - /* Likewise. If NEW_ALIAS is call-clobbered, so is VAR. */ - else if (is_call_clobbered (new_alias)) - mark_call_clobbered (var); } @@ -1728,6 +1733,8 @@ merge_pointed_to_info (struct alias_info *ai, tree dest, tree orig) if (orig_pi) { + dest_pi->pt_global_mem |= orig_pi->pt_global_mem; + /* Notice that we never merge PT_MALLOC. This attribute is only true if the pointer is the result of a malloc() call. Otherwise, we can end up in this situation: