alias.c (alias_set_subset_of): Correctly handle asking if zero is a subset of an...
authorRichard Guenther <rguenther@suse.de>
Wed, 23 Apr 2008 14:06:02 +0000 (14:06 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 23 Apr 2008 14:06:02 +0000 (14:06 +0000)
2008-04-23  Richard Guenther  <rguenther@suse.de>

* alias.c (alias_set_subset_of): Correctly handle asking
if zero is a subset of an alias set with zero child.
* tree-ssa-alias.c (have_common_aliases_p): Simplify logic.
(compute_flow_insensitive_aliasing): Correctly walk all
pointers.  Do not unnecessarily union sets.

From-SVN: r134597

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

index f0fb8403400ec3a412869cfb07bb4123ddae9a40..a774a43341a34efb3fdafb14979c445ff217af14 100644 (file)
@@ -1,3 +1,11 @@
+2008-04-23  Richard Guenther  <rguenther@suse.de>
+
+       * alias.c (alias_set_subset_of): Correctly handle asking
+       if zero is a subset of an alias set with zero child.
+       * tree-ssa-alias.c (have_common_aliases_p): Simplify logic.
+       (compute_flow_insensitive_aliasing): Correctly walk all
+       pointers.  Do not unnecessarily union sets.
+
 2008-04-23  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/36021
index 2e4f5aebdb4700aa3da541360b9ad91dca89ebdf..7b14f26cc134a6fa4747a8ce93201a7a08835a3c 100644 (file)
@@ -305,8 +305,9 @@ alias_set_subset_of (alias_set_type set1, alias_set_type set2)
   /* Otherwise, check if set1 is a subset of set2.  */
   ase = get_alias_set_entry (set2);
   if (ase != 0
-      && (splay_tree_lookup (ase->children,
-                            (splay_tree_key) set1)))
+      && ((ase->has_zero_child && set1 == 0)
+         || splay_tree_lookup (ase->children,
+                               (splay_tree_key) set1)))
     return true;
   return false;
 }
index a9ae29fa876c4cf74e091eec19eeb845f9be60e5..eb57010bdda970aec017e475702eec9b2762255c 100644 (file)
@@ -2390,9 +2390,7 @@ have_common_aliases_p (bitmap tag1aliases, bitmap tag2aliases)
   /* This is the old behavior of have_common_aliases_p, which is to
      return false if both sets are empty, or one set is and the other
      isn't.  */
-     if ((tag1aliases == NULL && tag2aliases != NULL)
-      || (tag2aliases == NULL && tag1aliases != NULL)
-      || (tag1aliases == NULL && tag2aliases == NULL))
+  if (tag1aliases == NULL || tag2aliases == NULL)
     return false;
 
   return bitmap_intersect_p (tag1aliases, tag2aliases);
@@ -2490,12 +2488,16 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
       if (PTR_IS_REF_ALL (p_map1->var))
        continue;
 
-      for (j = i + 1; j < ai->num_pointers; j++)
+      for (j = 0; j < ai->num_pointers; j++)
        {
          struct alias_map_d *p_map2 = ai->pointers[j];
          tree tag2 = symbol_mem_tag (p_map2->var);
          bitmap may_aliases2 = may_aliases (tag2);
 
+         /* By convention tags don't alias themselves.  */
+         if (tag1 == tag2)
+           continue;
+
          if (PTR_IS_REF_ALL (p_map2->var))
            continue;
 
@@ -2508,18 +2510,8 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
          if (have_common_aliases_p (may_aliases1, may_aliases2))
            continue;
 
-         if (may_aliases2 && !bitmap_empty_p (may_aliases2))
-           {
-             union_alias_set_into (tag1, may_aliases2);
-           }
-         else
-           {
-             /* Since TAG2 does not have any aliases of its own, add
-                TAG2 itself to the alias set of TAG1.  */
-             add_may_alias (tag1, tag2);
-           }
+         add_may_alias (tag1, tag2);
        }
-
     }
   timevar_pop (TV_FLOW_INSENSITIVE);
 }