diff options
author | dorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-10 17:44:22 +0000 |
---|---|---|
committer | dorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-10 17:44:22 +0000 |
commit | e683de6d1974ebc2b52e640506c1b145654ade24 (patch) | |
tree | dd8b83235bd417bca6942c0d14e7545203367143 /gcc/tree-ssa-alias.c | |
parent | 955f5493168c4f6b2083f2f304879f5f7a3a75b9 (diff) | |
download | gcc-e683de6d1974ebc2b52e640506c1b145654ade24.tar.gz |
2005-06-10 Keith Besaw <kbesaw@us.ibm.com>
* tree-ssa-alias.c (new_type_alias): Use existing type
tag if VAR has just one in its may_aliases list.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100824 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 3e885e9445f..3098549d881 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -2787,8 +2787,11 @@ found_tag: } -/* Create a type tag for PTR. Construct the may-alias list of this type tag - so that it has the aliasing of VAR. */ +/* Create a new type tag for PTR. Construct the may-alias list of this type + tag so that it has the aliasing of VAR. + + Note, the set of aliases represented by the new type tag are not marked + for renaming. */ void new_type_alias (tree ptr, tree var) @@ -2801,22 +2804,53 @@ new_type_alias (tree ptr, tree var) gcc_assert (p_ann->type_mem_tag == NULL_TREE); gcc_assert (v_ann->mem_tag_kind == NOT_A_TAG); - tag = create_memory_tag (tag_type, true); - p_ann->type_mem_tag = tag; /* Add VAR to the may-alias set of PTR's new type tag. If VAR has subvars, add the subvars to the tag instead of the actual var. */ if (var_can_have_subvars (var) && (svars = get_subvars_for_var (var))) { - subvar_t sv; + subvar_t sv; + + tag = create_memory_tag (tag_type, true); + p_ann->type_mem_tag = tag; + for (sv = svars; sv; sv = sv->next) add_may_alias (tag, sv->var); } else - add_may_alias (tag, var); + { + /* The following is based on code in add_stmt_operand to ensure that the + same defs/uses/vdefs/vuses will be found after replacing a reference + to var (or ARRAY_REF to var) with an INDIRECT_REF to ptr whose value + is the address of var. */ + varray_type aliases = v_ann->may_aliases; + + if ((aliases != NULL) + && (VARRAY_ACTIVE_SIZE (aliases) == 1)) + { + tree ali = VARRAY_TREE (aliases, 0); - /* Note, TAG and its set of aliases are not marked for renaming. */ + if (get_var_ann (ali)->mem_tag_kind == TYPE_TAG) + { + p_ann->type_mem_tag = ali; + return; + } + } + + tag = create_memory_tag (tag_type, true); + p_ann->type_mem_tag = tag; + + if (aliases == NULL) + add_may_alias (tag, var); + else + { + size_t i; + + for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++) + add_may_alias (tag, VARRAY_TREE (aliases, i)); + } + } } /* This represents the used range of a variable. */ |