summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2004-10-28 23:24:41 +0000
committerDiego Novillo <dnovillo@gcc.gnu.org>2004-10-28 19:24:41 -0400
commitde66168d60454ab3cb39479bfe86a27254b679ea (patch)
treeb25d116db892766e4a7456df5b0f900fccef4a11
parent55dbfb488ebbd45e512648083e5fd700cde7389e (diff)
downloadgcc-de66168d60454ab3cb39479bfe86a27254b679ea.tar.gz
re PR tree-optimization/16728 (std::set tests for allocator/insert core in make check-performance)
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. From-SVN: r89792
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-flow.h1
-rw-r--r--gcc/tree-ssa-alias.c3
-rw-r--r--gcc/tree-ssa-copy.c20
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 <dnovillo@redhat.com>
+
+ 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 <shebs@apple.com>
* 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.