summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-copy.c
diff options
context:
space:
mode:
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-28 23:24:41 +0000
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-28 23:24:41 +0000
commit3276c83bdcc633a4dfd9ecb2c5ff19cb0527f6bf (patch)
treeb25d116db892766e4a7456df5b0f900fccef4a11 /gcc/tree-ssa-copy.c
parentd78f4c376b3c8279d24ef96c9d10011a6bf19641 (diff)
downloadgcc-3276c83bdcc633a4dfd9ecb2c5ff19cb0527f6bf.tar.gz
PR tree-optimization/16728
* tree-flow.h (get_ptr_info): Declare. * tree-ssa-alias.c (get_ptr_info): Make extern. * tree-ssa-copy.c (merge_alias_info): Merge flow-sensitive alias information. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89792 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-copy.c')
-rw-r--r--gcc/tree-ssa-copy.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c
index dc41e8e058e..e7f51c5c759 100644
--- a/gcc/tree-ssa-copy.c
+++ b/gcc/tree-ssa-copy.c
@@ -178,6 +178,8 @@ merge_alias_info (tree orig, tree new)
tree orig_sym = SSA_NAME_VAR (orig);
var_ann_t new_ann = var_ann (new_sym);
var_ann_t orig_ann = var_ann (orig_sym);
+ struct ptr_info_def *new_ptr_info;
+ struct ptr_info_def *orig_ptr_info;
gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig)));
gcc_assert (POINTER_TYPE_P (TREE_TYPE (new)));
@@ -192,14 +194,28 @@ merge_alias_info (tree orig, tree new)
== get_alias_set (TREE_TYPE (TREE_TYPE (orig_sym))));
#endif
- /* Merge type-based alias info. */
+ /* Synchronize the type tags. If both pointers had a tag and they
+ are different, then something has gone wrong. */
if (new_ann->type_mem_tag == NULL_TREE)
new_ann->type_mem_tag = orig_ann->type_mem_tag;
else if (orig_ann->type_mem_tag == NULL_TREE)
orig_ann->type_mem_tag = new_ann->type_mem_tag;
else
gcc_assert (new_ann->type_mem_tag == orig_ann->type_mem_tag);
-}
+
+ /* Synchronize flow sensitive alias information. If both pointers
+ had flow information and they are inconsistent, then something
+ has gone wrong. */
+ new_ptr_info = get_ptr_info (new);
+ orig_ptr_info = get_ptr_info (orig);
+
+ if (new_ptr_info->name_mem_tag == NULL_TREE)
+ memcpy (new_ptr_info, orig_ptr_info, sizeof (*new_ptr_info));
+ else if (orig_ptr_info->name_mem_tag == NULL_TREE)
+ memcpy (orig_ptr_info, new_ptr_info, sizeof (*orig_ptr_info));
+ else if (orig_ptr_info->name_mem_tag != new_ptr_info->name_mem_tag)
+ abort ();
+}
/* Common code for propagate_value and replace_exp.