From: Richard Guenther Date: Wed, 11 Jun 2008 18:19:28 +0000 (+0000) Subject: alias.c (get_alias_set): Use the element alias-set for arrays. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4653cae5b8dc090912f262572d0105f27ec2c83b;p=gcc.git alias.c (get_alias_set): Use the element alias-set for arrays. 2008-06-11 Richard Guenther * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5c210ccae5..95a86b0d398 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-06-11 Richard Guenther + + * 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 * config.gcc (all_defaults): Add arch_32 arch_64 cpu_32 cpu_64 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 7069728a128..47a45a1f4a2 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 06ad867d303..ec2d053362c 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 377db5708d0..b783c534012 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");