From 4653cae5b8dc090912f262572d0105f27ec2c83b Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Wed, 11 Jun 2008 18:19:28 +0000
Subject: [PATCH] alias.c (get_alias_set): Use the element alias-set for
 arrays.

2008-06-11  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.

From-SVN: r136679
---
 gcc/ChangeLog   |  8 ++++++++
 gcc/Makefile.in |  2 ++
 gcc/alias.c     | 20 +++++++++++++++-----
 gcc/c-common.c  |  3 ++-
 4 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b5c210ccae53..95a86b0d398c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2008-06-11  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.
+
 2008-06-11  Joseph Myers  <joseph@codesourcery.com>
 
 	* config.gcc (all_defaults): Add arch_32 arch_64 cpu_32 cpu_64
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 7069728a1289..47a45a1f4a2e 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -187,6 +187,8 @@ GCC_WARN_CFLAGS = $(LOOSE_WARN) $($(@D)-warn) $(NOCOMMON_FLAG) $($@-warn)
 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
diff --git a/gcc/alias.c b/gcc/alias.c
index 06ad867d3035..ec2d053362c3 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -640,6 +640,18 @@ get_alias_set (tree t)
   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 ();
@@ -747,11 +759,6 @@ record_component_aliases (tree type)
 
   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:
@@ -775,6 +782,9 @@ record_component_aliases (tree type)
       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;
     }
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 377db5708d06..b783c5340123 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -1093,7 +1093,8 @@ strict_aliasing_warning (tree otype, tree type, tree expr)
 	    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))
+          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");
-- 
GitLab