http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50609
Richard Guenther <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED AssignedTo|unassigned at gcc dot |rguenth at gcc dot gnu.org |gnu.org | --- Comment #5 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-10-04 14:41:04 UTC --- Hm, this means we have an unfolded vector CONSTRUCTOR, we should have a VECTOR_CST here. Or the following, reproducible on x86_64 with -m32: typedef int v4si __attribute__((vector_size(16))); int x; static const v4si v = { (int)&x, 2, 3, 4 }; int foo () { return v[0]; } I have a patch. You might want to check it. Index: gcc/gimple-fold.c =================================================================== --- gcc/gimple-fold.c (revision 179505) +++ gcc/gimple-fold.c (working copy) @@ -2747,10 +2747,12 @@ fold_array_ctor_reference (tree type, tr double_int low_bound, elt_size; double_int index, max_index; double_int access_index; - tree domain_type = TYPE_DOMAIN (TREE_TYPE (ctor)); + tree domain_type = NULL_TREE; HOST_WIDE_INT inner_offset; /* Compute low bound and elt size. */ + if (TREE_CODE (ctor) == ARRAY_TYPE) + domain_type = TYPE_DOMAIN (TREE_TYPE (ctor)); if (domain_type && TYPE_MIN_VALUE (domain_type)) { /* Static constructors for variably sized objects makes no sense. */ @@ -2917,7 +2919,8 @@ fold_ctor_reference (tree type, tree cto if (TREE_CODE (ctor) == CONSTRUCTOR) { - if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE) + if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE + || TREE_CODE (TREE_TYPE (ctor)) == VECTOR_TYPE) return fold_array_ctor_reference (type, ctor, offset, size); else return fold_nonarray_ctor_reference (type, ctor, offset, size);