tree-ssa-alias.c (new_type_alias): Use existing type tag if VAR has just one in its...
authorKeith Besaw <kbesaw@us.ibm.com>
Fri, 10 Jun 2005 17:44:22 +0000 (17:44 +0000)
committerDorit Nuzman <dorit@gcc.gnu.org>
Fri, 10 Jun 2005 17:44:22 +0000 (17:44 +0000)
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.

From-SVN: r100824

gcc/ChangeLog
gcc/tree-ssa-alias.c

index 78bd82a8ef3004e532807d0990c4e7b157d09ee8..3acacf3c6672555b8b24f408efb442f69d4516ab 100644 (file)
@@ -1,3 +1,8 @@
+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.
+
 2005-06-10  Fariborz Jahanian <fjahanian@apple.com>
        * rs6000/predicates.md (scc_operand): New.
        * rs6000/rs6000.md : Use scc_operand for eq:SI compares.
index 3e885e9445fa58aba0845a109d80cacbdad73650..3098549d881dddddfe96cce4a3286f4d97dd5433 100644 (file)
@@ -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.  */