From 3276c83bdcc633a4dfd9ecb2c5ff19cb0527f6bf Mon Sep 17 00:00:00 2001 From: dnovillo Date: Thu, 28 Oct 2004 23:24:41 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/tree-flow.h | 1 + gcc/tree-ssa-alias.c | 3 +-- gcc/tree-ssa-copy.c | 20 ++++++++++++++++++-- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 99558d5654c..8cde54e11f1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-10-28 Diego Novillo + + 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. + 2004-10-28 Stan Shebs * config/rs6000/darwin.h (SUBTARGET_EXTRA_SPECS): Handle -m64. diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 715f843999f..82ebd6dd9c4 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -556,6 +556,7 @@ extern void debug_points_to_info (void); extern void dump_points_to_info_for (FILE *, tree); extern void debug_points_to_info_for (tree); extern bool may_be_aliased (tree); +extern struct ptr_info_def *get_ptr_info (tree); /* Call-back function for walk_use_def_chains(). At each reaching definition, a function with this prototype is called. */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 9dab4c676ac..bedba4f109e 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -152,7 +152,6 @@ static void collect_points_to_info_for (struct alias_info *, tree); static bool ptr_is_dereferenced_by (tree, tree, bool *); static void maybe_create_global_var (struct alias_info *ai); static void group_aliases (struct alias_info *); -static struct ptr_info_def *get_ptr_info (tree t); static void set_pt_anything (tree ptr); static void set_pt_malloc (tree ptr); @@ -2262,7 +2261,7 @@ debug_alias_info (void) /* Return the alias information associated with pointer T. It creates a new instance if none existed. */ -static struct ptr_info_def * +struct ptr_info_def * get_ptr_info (tree t) { struct ptr_info_def *pi; 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. -- 2.11.0