While digging in PR60819 (and thinking whether the original testcase is valid) we figured that a clearly valid testcase is miscompiled as well. That's because of the C/C++ frontends implementation of vector indexing by decaying the vector to a element pointer. The helper for that fails to apply the may-alias properties of the vector type to the build scalar pointer type.
The following patch fixes that. Bootstrapped and tested x86_64-unknown-linux-gnu, I'm re-testing with some other changes. Ok for trunk and branches after 4.9.0 is out? Thanks, Richard. 2014-04-14 Richard Biener <rguent...@suse.de> Marc Glisse <marc.gli...@inria.fr> PR c/60819 c-family/ * c-common.c (convert_vector_to_pointer_for_subscript): Properly apply may-alias properties of the vector type to the scalar pointer type. * gcc.target/i386/vec-may_alias.c: New testcase. Index: gcc/c-family/c-common.c =================================================================== --- gcc/c-family/c-common.c (revision 209333) +++ gcc/c-family/c-common.c (working copy) @@ -11777,22 +11777,23 @@ convert_vector_to_pointer_for_subscript tree type = TREE_TYPE (*vecp); tree type1; if (TREE_CODE (index) == INTEGER_CST) if (!tree_fits_uhwi_p (index) || tree_to_uhwi (index) >= TYPE_VECTOR_SUBPARTS (type)) warning_at (loc, OPT_Warray_bounds, "index value is out of bound"); c_common_mark_addressable_vec (*vecp); type = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type)); - type = build_pointer_type (type); type1 = build_pointer_type (TREE_TYPE (*vecp)); + type = build_pointer_type_for_mode (type, ptr_mode, + TYPE_REF_CAN_ALIAS_ALL (type1)); *vecp = build1 (ADDR_EXPR, type1, *vecp); *vecp = convert (type, *vecp); } } /* Determine which of the operands, if any, is a scalar that needs to be converted to a vector, for the range of operations. */ enum stv_conv scalar_to_vector (location_t loc, enum tree_code code, tree op0, tree op1, bool complain) Index: gcc/testsuite/gcc.target/i386/vec-may_alias.c =================================================================== --- gcc/testsuite/gcc.target/i386/vec-may_alias.c (revision 0) +++ gcc/testsuite/gcc.target/i386/vec-may_alias.c (working copy) @@ -0,0 +1,16 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -w -Wno-abi" } */ + +typedef int v2si __attribute__ ((vector_size (8))); +typedef short v4hi __attribute__ ((vector_size (8), may_alias)); + +__attribute__ ((noinline, noclone)) +int f (v2si A, int N) +{ return ((v4hi)A)[N]; } + +int main(){ + v2si x = { 0, 0 }; + if (f (x, 0) || f (x, 1) || f (x, 2) || f (x, 3)) + __builtin_abort (); + return 0; +}