Alias sets for VLAs and strict aliasing warnings (PR 41673)
Richard Guenther
richard.guenther@gmail.com
Fri Oct 23 09:23:00 GMT 2009
On Fri, Oct 23, 2009 at 4:27 AM, Joseph S. Myers
<joseph@codesourcery.com> wrote:
> This patch fixes PR 41673, where a VLA being given alias set 0 caused
> a bogus -Wstrict-aliasing warning from dereference of that array
> converted to a pointer (which involves a conversion from
> pointer-to-array to pointer-to-element that looks like a cast for the
> purposes of these warnings).
>
> I believe it is appropriate for both warnings and optimization for
> VLAs to get the alias sets of their elements (rather than special
> casing VLAs in the warning code, for example), so this patch makes it
> possible for langhooks to override the default of alias set 0 for
> types with structural comparison.
>
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu. OK to
> commit (the alias.c changes)?
The change is ok, but I wonder why the C FE sets
TYPE_STRUCTURAL_EQUALITY_P on VLAs. As you can see
from alias.c the middle-end always uses the alias-set of the
element type for arrays (well, unless they are marked as not
aliased).
Thanks,
Richard.
> 2009-10-22 Joseph Myers <joseph@codesourcery.com>
>
> PR c/41673
> * alias.c (get_alias_set): Call langhook before returning 0 for
> types with structural equality.
> * c-common.c (c_common_get_alias_set): Use alias set of element
> type for arrays with structural comparison.
>
> testsuite:
> 2009-10-22 Joseph Myers <joseph@codesourcery.com>
>
> PR c/41673
> * gcc.dg/Wstrict-aliasing-bogus-vla-1.c: New test.
>
> Index: testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c
> ===================================================================
> --- testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c (revision 0)
> +++ testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c (revision 0)
> @@ -0,0 +1,10 @@
> +/* PR 41673: bogus -Wstrict-aliasing warning from VLA dereference. */
> +/* { dg-do compile } */
> +/* { dg-options "-std=gnu99 -O2 -Wall" } */
> +
> +int main(int argc, char *argv[])
> +{
> + float x[argc];
> + float y[argc];
> + return 0 == __builtin_memcpy(y, x, argc * sizeof(*x));
> +}
> Index: alias.c
> ===================================================================
> --- alias.c (revision 153482)
> +++ alias.c (working copy)
> @@ -691,7 +691,14 @@ get_alias_set (tree t)
> requires structural comparisons to identify compatible types
> use alias set zero. */
> if (TYPE_STRUCTURAL_EQUALITY_P (t))
> - return 0;
> + {
> + /* Allow the language to specify another alias set for this
> + type. */
> + set = lang_hooks.get_alias_set (t);
> + if (set != -1)
> + return set;
> + return 0;
> + }
> t = TYPE_CANONICAL (t);
> /* Canonical types shouldn't form a tree nor should the canonical
> type require structural equality checks. */
> Index: c-common.c
> ===================================================================
> --- c-common.c (revision 153482)
> +++ c-common.c (working copy)
> @@ -4183,6 +4183,15 @@ c_common_get_alias_set (tree t)
> tree u;
> PTR *slot;
>
> + /* For VLAs, use the alias set of the element type rather than the
> + default of alias set 0 for types compared structurally. */
> + if (TYPE_P (t) && TYPE_STRUCTURAL_EQUALITY_P (t))
> + {
> + if (TREE_CODE (t) == ARRAY_TYPE)
> + return get_alias_set (TREE_TYPE (t));
> + return -1;
> + }
> +
> /* Permit type-punning when accessing a union, provided the access
> is directly through the union. For example, this code does not
> permit taking the address of a union member and then storing
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
>
More information about the Gcc-patches
mailing list