[PATCH] Fix alias-set generation for array types (2nd try)

Richard Guenther rguenther@suse.de
Tue Jun 3 13:54:00 GMT 2008


This time with retaining the TYPE_NONALIASED_COMPONENT check.

Ok for trunk?

Thanks,
Richard.

2008-06-03  Richard Guenther  <rguenther@suse.de>

	* alias.c (get_alias_set): Use the element alias-set for arrays.
	(record_component_aliases): For arrays and vectors do nothing.
	* c-common.c (strict_aliasing_warning): Handle the cases
	of alias set zero explicitly.
	* Makefile.in (dfp.o-warn): Add -Wno-error.

Index: trunk/gcc/alias.c
===================================================================
*** trunk.orig/gcc/alias.c	2008-06-03 15:40:57.000000000 +0200
--- trunk/gcc/alias.c	2008-06-03 15:48:01.000000000 +0200
*************** get_alias_set (tree t)
*** 640,645 ****
--- 640,657 ----
    else if (TREE_CODE (t) == VECTOR_TYPE)
      set = get_alias_set (TREE_TYPE (t));
  
+   /* Unless the language specifies otherwise, treat array types the
+      same as their components.  This avoids the asymmetry we get
+      through recording the components.  Consider accessing a
+      character(kind=1) through a reference to a character(kind=1)[1:1].
+      Or consider if we want to assign integer(kind=4)[0:D.1387] and
+      integer(kind=4)[4] the same alias set or not.
+      Just be pragmatic here and make sure the array and its element
+      type get the same alias set assigned.  */
+   else if (TREE_CODE (t) == ARRAY_TYPE
+ 	   && !TYPE_NONALIASED_COMPONENT (t))
+     set = get_alias_set (TREE_TYPE (t));
+ 
    else
      /* Otherwise make a new alias set for this type.  */
      set = new_alias_set ();
*************** record_component_aliases (tree type)
*** 747,757 ****
  
    switch (TREE_CODE (type))
      {
-     case ARRAY_TYPE:
-       if (!TYPE_NONALIASED_COMPONENT (type))
- 	record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
-       break;
- 
      case RECORD_TYPE:
      case UNION_TYPE:
      case QUAL_UNION_TYPE:
--- 759,764 ----
*************** record_component_aliases (tree type)
*** 775,780 ****
--- 782,790 ----
        record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
        break;
  
+     /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their
+        element type.  */
+ 
      default:
        break;
      }
Index: trunk/gcc/c-common.c
===================================================================
*** trunk.orig/gcc/c-common.c	2008-06-03 15:40:57.000000000 +0200
--- trunk/gcc/c-common.c	2008-06-03 15:41:26.000000000 +0200
*************** strict_aliasing_warning (tree otype, tre
*** 1093,1099 ****
  	    get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0)));
            alias_set_type set2 = get_alias_set (TREE_TYPE (type));
  
!           if (!alias_sets_conflict_p (set1, set2))
  	    {
  	      warning (OPT_Wstrict_aliasing, "dereferencing type-punned "
  		       "pointer will break strict-aliasing rules");
--- 1093,1100 ----
  	    get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0)));
            alias_set_type set2 = get_alias_set (TREE_TYPE (type));
  
!           if (set1 != set2 && set2 != 0
! 	      && (set1 == 0 || !alias_sets_conflict_p (set1, set2)))
  	    {
  	      warning (OPT_Wstrict_aliasing, "dereferencing type-punned "
  		       "pointer will break strict-aliasing rules");
Index: trunk/gcc/Makefile.in
===================================================================
*** trunk.orig/gcc/Makefile.in	2008-06-03 15:40:57.000000000 +0200
--- trunk/gcc/Makefile.in	2008-06-03 15:41:26.000000000 +0200
*************** GCC_WARN_CFLAGS = $(LOOSE_WARN) $($(@D)-
*** 187,192 ****
--- 187,194 ----
  build/gengtype-lex.o-warn = -Wno-error
  # SYSCALLS.c misses prototypes
  SYSCALLS.c.X-warn = -Wno-strict-prototypes -Wno-error
+ # dfp.c contains alias violations
+ dfp.o-warn = -Wno-error
  
  # All warnings have to be shut off in stage1 if the compiler used then
  # isn't gcc; configure determines that.  WARN_CFLAGS will be either



More information about the Gcc-patches mailing list