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);

Reply via email to