OSDN Git Service

PR java/19295
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa.c
index 24b5697..aa6f523 100644 (file)
@@ -1,5 +1,5 @@
 /* Miscellaneous SSA utility functions.
-   Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -469,7 +469,11 @@ DEF_VEC_MALLOC_P (bitmap);
    same name tag must have the same points-to set. 
    So we check a single variable for each name tag, and verify that its
    points-to set is different from every other points-to set for other name
-   tags.  */
+   tags.
+
+   Additionally, given a pointer P_i with name tag NMT and type tag
+   TMT, this function verified the alias set of TMT is a superset of
+   the alias set of NMT.  */
 
 static void
 verify_name_tags (void)
@@ -479,25 +483,62 @@ verify_name_tags (void)
   bitmap first, second;  
   VEC (tree) *name_tag_reps = NULL;
   VEC (bitmap) *pt_vars_for_reps = NULL;
+  bitmap type_aliases = BITMAP_XMALLOC ();
 
   /* First we compute the name tag representatives and their points-to sets.  */
   for (i = 0; i < num_ssa_names; i++)
     {
-      if (ssa_name (i))
+      struct ptr_info_def *pi;
+      tree tmt, ptr = ssa_name (i);
+
+      if (ptr == NULL_TREE)
+       continue;
+      
+      pi = SSA_NAME_PTR_INFO (ptr);
+
+      if (!TREE_VISITED (ptr) 
+         || !POINTER_TYPE_P (TREE_TYPE (ptr)) 
+         || !pi
+         || !pi->name_mem_tag 
+         || TREE_VISITED (pi->name_mem_tag))
+       continue;
+
+      TREE_VISITED (pi->name_mem_tag) = 1;
+
+      if (pi->pt_vars == NULL)
+       continue;
+
+      VEC_safe_push (tree, name_tag_reps, ptr);
+      VEC_safe_push (bitmap, pt_vars_for_reps, pi->pt_vars);
+
+      /* Verify that alias set of PTR's type tag is a superset of the
+        alias set of PTR's name tag.  */
+      tmt = var_ann (SSA_NAME_VAR (ptr))->type_mem_tag;
+      if (tmt)
        {
-         tree ptr = ssa_name (i);
-         struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
-         if (!TREE_VISITED (ptr) 
-             || !POINTER_TYPE_P (TREE_TYPE (ptr)) 
-             || !pi
-             || !pi->name_mem_tag 
-             || TREE_VISITED (pi->name_mem_tag))
+         size_t i;
+         varray_type aliases = var_ann (tmt)->may_aliases;
+         bitmap_clear (type_aliases);
+         for (i = 0; aliases && i < VARRAY_ACTIVE_SIZE (aliases); i++)
+           {
+             tree alias = VARRAY_TREE (aliases, i);
+             bitmap_set_bit (type_aliases, var_ann (alias)->uid);
+           }
+
+         /* When grouping, we may have added PTR's type tag into the
+            alias set of PTR's name tag.  To prevent a false
+            positive, pretend that TMT is in its own alias set.  */
+         bitmap_set_bit (type_aliases, var_ann (tmt)->uid);
+
+         if (bitmap_equal_p (type_aliases, pi->pt_vars))
            continue;
-         TREE_VISITED (pi->name_mem_tag) = 1;
-         if (pi->pt_vars != NULL)
-           {    
-             VEC_safe_push (tree, name_tag_reps, ptr);
-             VEC_safe_push (bitmap, pt_vars_for_reps, pi->pt_vars);
+
+         if (!bitmap_intersect_compl_p (type_aliases, pi->pt_vars))
+           {
+             error ("Alias set of a pointer's type tag should be a superset of the corresponding name tag");
+             debug_variable (tmt);
+             debug_variable (pi->name_mem_tag);
+             goto err;
            }
        }
     }
@@ -532,13 +573,17 @@ verify_name_tags (void)
          TREE_VISITED (pi->name_mem_tag) = 0;
        }
     } 
+
   VEC_free (bitmap, pt_vars_for_reps);
+  BITMAP_FREE (type_aliases);
   return;
   
 err:
   debug_variable (VEC_index (tree, name_tag_reps, i));
   internal_error ("verify_name_tags failed");
 }
+
+
 /* Verify the consistency of aliasing information.  */
 
 static void