re PR tree-optimization/16728 (std::set tests for allocator/insert core in make check...
authorDiego Novillo <dnovillo@redhat.com>
Thu, 28 Oct 2004 23:24:41 +0000 (23:24 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Thu, 28 Oct 2004 23:24:41 +0000 (19:24 -0400)
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

gcc/ChangeLog
gcc/tree-flow.h
gcc/tree-ssa-alias.c
gcc/tree-ssa-copy.c

index 99558d5654cf00b1fd8c44d7b9a400e41ec27a24..8cde54e11f156f3cce6d12e5be3c16304f72556f 100644 (file)
@@ -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.
index 715f843999faa3ca9ac0ac2d16b634bd0948cf5c..82ebd6dd9c447d1374a57aa62216821614433c9f 100644 (file)
@@ -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.  */
index 9dab4c676ac95524a4a829962066c887d2dcc858..bedba4f109e4803e23d1f60ee966e0f7636bdd14 100644 (file)
@@ -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;
index dc41e8e058ec4b37a1ad1fbabb1718a6974a4391..e7f51c5c759a383cc496fea8633d0afbcbdfea6d 100644 (file)
@@ -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.