File pr27799-prep.diff of Package gcc43

2008-04-17  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.

Index: gcc/alias.c
===================================================================
*** gcc/alias.c	(revision 134383)
--- gcc/alias.c	(working copy)
*************** alias_set_subset_of (alias_set_type set1
*** 305,312 ****
    /* 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)))
      return true;
    return false;
  }
--- 305,313 ----
    /* Otherwise, check if set1 is a subset of set2.  */
    ase = get_alias_set_entry (set2);
    if (ase != 0
!       && ((ase->has_zero_child && set1 == 0)
! 	  || splay_tree_lookup (ase->children,
! 			        (splay_tree_key) set1)))
      return true;
    return false;
  }
Index: gcc/tree-ssa-alias.c
===================================================================
*** gcc/tree-ssa-alias.c	(revision 134383)
--- gcc/tree-ssa-alias.c	(working copy)
*************** have_common_aliases_p (bitmap tag1aliase
*** 2390,2398 ****
    /* 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))
      return false;
  
    return bitmap_intersect_p (tag1aliases, tag2aliases);
--- 2390,2396 ----
    /* 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)
      return false;
  
    return bitmap_intersect_p (tag1aliases, tag2aliases);
*************** compute_flow_insensitive_aliasing (struc
*** 2490,2501 ****
        if (PTR_IS_REF_ALL (p_map1->var))
  	continue;
  
!       for (j = i + 1; 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);
  
  	  if (PTR_IS_REF_ALL (p_map2->var))
  	    continue;
  
--- 2488,2503 ----
        if (PTR_IS_REF_ALL (p_map1->var))
  	continue;
  
!       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;
  
*************** compute_flow_insensitive_aliasing (struc
*** 2508,2525 ****
  	  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);
! 	    }
  	}
- 
      }
    timevar_pop (TV_FLOW_INSENSITIVE);
  }
--- 2510,2517 ----
  	  if (have_common_aliases_p (may_aliases1, may_aliases2))
  	    continue;
  
! 	  add_may_alias (tag1, tag2);
  	}
      }
    timevar_pop (TV_FLOW_INSENSITIVE);
  }


2008-04-18  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/27799
	* tree-ssa-alias.c (may_alias_p): Use alias_set_subset_of instead of
	aliases_conflict_p.

Index: gcc/tree-ssa-alias.c
===================================================================
*** gcc/tree-ssa-alias.c.orig	2008-04-18 12:54:26.000000000 +0200
--- gcc/tree-ssa-alias.c	2008-04-18 12:54:31.000000000 +0200
*************** may_alias_p (tree ptr, alias_set_type me
*** 2861,2867 ****
        alias_stats.tbaa_queries++;
  
        /* If the alias sets don't conflict then MEM cannot alias VAR.  */
!       if (!alias_sets_conflict_p (mem_alias_set, var_alias_set))
  	{
  	  alias_stats.alias_noalias++;
  	  alias_stats.tbaa_resolved++;
--- 2849,2856 ----
        alias_stats.tbaa_queries++;
  
        /* If the alias sets don't conflict then MEM cannot alias VAR.  */
!       if (mem_alias_set != var_alias_set
! 	  && !alias_set_subset_of (mem_alias_set, var_alias_set))
  	{
  	  alias_stats.alias_noalias++;
  	  alias_stats.tbaa_resolved++;


2008-04-19  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-alias.c (may_alias_p): A pointer which points to
	memory with alias set zero may access any variable.

Index: gcc/tree-ssa-alias.c
===================================================================
--- gcc/tree-ssa-alias.c	(revision 134452)
+++ gcc/tree-ssa-alias.c	(working copy)
@@ -2868,6 +2869,16 @@ may_alias_p (tree ptr, alias_set_type me
     {
       alias_stats.tbaa_queries++;
 
+      /* If the pointed to memory has alias set zero or the pointer
+	 is ref-all, the MEM can alias VAR.  */
+      if (mem_alias_set == 0
+	  || PTR_IS_REF_ALL (ptr))
+	{
+	  alias_stats.alias_mayalias++;
+	  alias_stats.tbaa_resolved++;
+	  return true;
+	}
+
       /* If the alias sets don't conflict then MEM cannot alias VAR.  */
       if (!alias_sets_conflict_p (mem_alias_set, var_alias_set))
 	{
openSUSE Build Service is sponsored by