re PR c++/53094 (constexpr vector subscripting)
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 29 Nov 2012 15:40:16 +0000 (16:40 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 29 Nov 2012 15:40:16 +0000 (15:40 +0000)
2012-11-29  Marc Glisse  <marc.glisse@inria.fr>

PR c++/53094
gcc/
* fold-const.c (fold): Replace a CONSTRUCTOR with a VECTOR_CST.
gcc/cp/
* cvt.c (ocp_convert): Call convert_to_vector.
gcc/testsuite/
* g++.dg/ext/vector20.C: New testcase.

From-SVN: r193938

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/vector20.C [new file with mode: 0644]

index b45e6e32db4b19f21e459e1cd94beaad5c665433..8ca3588b3eeffdf0ac3bef024a5fec9942528892 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-29  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/53094
+       * fold-const.c (fold): Replace a CONSTRUCTOR with a VECTOR_CST.
+
 2012-11-29  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-pre.c (get_expr_value_id): Do not add expr
index 4f240e9f3b6ca208faa04bc4f1dd7a0eaad22159..d8d958a579cca2067b6d6f62eb5ba0bec987a9e2 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-29  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/53094
+       * cvt.c (ocp_convert): Call convert_to_vector.
+
 2012-11-29  Kai Tietz  <ktietz@redhat.com>
 
        PR target/53912
index 1dc789855cc6583c40c2e42eb6df31bd0dd69e5d..4ba7642db202da74b84c2f24f0c03914618f33a4 100644 (file)
@@ -690,6 +690,8 @@ ocp_convert (tree type, tree expr, int convtype, int flags,
         conversion.  */
       else if (TREE_CODE (type) == COMPLEX_TYPE)
        return fold_if_not_in_template (convert_to_complex (type, e));
+      else if (TREE_CODE (type) == VECTOR_TYPE)
+       return fold_if_not_in_template (convert_to_vector (type, e));
       else if (TREE_CODE (e) == TARGET_EXPR)
        {
          /* Don't build a NOP_EXPR of class type.  Instead, change the
index e4693cdd16a0329363ddce7a5c753201ae1f6b02..071fb8c15abd6b5a6b10ef64150db753ba67d2bc 100644 (file)
@@ -14387,6 +14387,35 @@ fold (tree expr)
        return t;
       }
 
+      /* Return a VECTOR_CST if possible.  */
+    case CONSTRUCTOR:
+      {
+       tree type = TREE_TYPE (t);
+       if (TREE_CODE (type) != VECTOR_TYPE)
+         return t;
+
+       tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type));
+       unsigned HOST_WIDE_INT idx, pos = 0;
+       tree value;
+
+       FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, value)
+         {
+           if (!CONSTANT_CLASS_P (value))
+             return t;
+           if (TREE_CODE (value) == VECTOR_CST)
+             {
+               for (unsigned i = 0; i < VECTOR_CST_NELTS (value); ++i)
+                 vec[pos++] = VECTOR_CST_ELT (value, i);
+             }
+           else
+             vec[pos++] = value;
+         }
+       for (; pos < TYPE_VECTOR_SUBPARTS (type); ++pos)
+         vec[pos] = build_zero_cst (TREE_TYPE (type));
+
+       return build_vector (type, vec);
+      }
+
     case CONST_DECL:
       return fold (DECL_INITIAL (t));
 
index d270ee0936ec77a3afefbd62896ec1ee04550f08..4e623fb7df262dececaf804492084039d28b8314 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-29  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/53094
+       * g++.dg/ext/vector20.C: New testcase.
+
 2012-11-28  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/52161
diff --git a/gcc/testsuite/g++.dg/ext/vector20.C b/gcc/testsuite/g++.dg/ext/vector20.C
new file mode 100644 (file)
index 0000000..3d7c392
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c++11" } */
+
+typedef long vec __attribute__((vector_size (2 * sizeof (long))));
+constexpr vec v = { 3, 4 };
+constexpr vec s = v + v;
+constexpr vec w = __builtin_shuffle (v, v);