aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgiovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-08 11:07:35 +0000
committergiovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-08 11:07:35 +0000
commit8aac060045321aaff3318cae367fffaab4372de5 (patch)
tree7d8f9a4dd89e74cf2bcb5d9cf80cf64389f2d33b
parent8ec2a79805715a461ee3ae9078b9f1af304dff1c (diff)
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87182 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/tree-ssa-alias.c47
2 files changed, 37 insertions, 20 deletions
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 <zhangjie@magima.com.cn>
+
+ * 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 <jh@suse.cz>
* 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: