fold-const.c (fold_convert_const): Fold changing cv-quals on VECTOR_CST.
authorJason Merrill <jason@redhat.com>
Fri, 13 Nov 2015 22:24:39 +0000 (17:24 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 13 Nov 2015 22:24:39 +0000 (17:24 -0500)
* fold-const.c (fold_convert_const): Fold changing cv-quals on
VECTOR_CST.

From-SVN: r230358

gcc/ChangeLog
gcc/fold-const.c
gcc/tree.def

index eeec887f1223bc71e56cffc8389da0fd83b9221d..74fa2d4da032b9befe6ba23d4d76e3a655ee2213 100644 (file)
@@ -1,5 +1,8 @@
 2015-11-13  Jason Merrill  <jason@redhat.com>
 
+       * fold-const.c (fold_convert_const): Fold changing cv-quals on
+       VECTOR_CST.
+
        * hash-map.h (hash_map::empty): New.
 
 2015-11-13  Nathan Sidwell  <nathan@codesourcery.com>
index 9114dec074adaacccffae8c44751d1a4fd05a498..ce59c488b7e4df3687a615082d04c130a46d8970 100644 (file)
@@ -2095,6 +2095,25 @@ fold_convert_const (enum tree_code code, tree type, tree arg1)
       else if (TREE_CODE (arg1) == REAL_CST)
        return fold_convert_const_fixed_from_real (type, arg1);
     }
+  else if (TREE_CODE (type) == VECTOR_TYPE)
+    {
+      if (TREE_CODE (arg1) == VECTOR_CST
+         && TYPE_VECTOR_SUBPARTS (type) == VECTOR_CST_NELTS (arg1))
+       {
+         int len = TYPE_VECTOR_SUBPARTS (type);
+         tree elttype = TREE_TYPE (type);
+         tree *v = XALLOCAVEC (tree, len);
+         for (int i = 0; i < len; ++i)
+           {
+             tree elt = VECTOR_CST_ELT (arg1, i);
+             tree cvt = fold_convert_const (code, elttype, elt);
+             if (cvt == NULL_TREE)
+               return NULL_TREE;
+             v[i] = cvt;
+           }
+         return build_vector (type, v);
+       }
+    }
   return NULL_TREE;
 }
 
index 41064a8e657200c1431466ddb5d19bc8b7c35db7..44e5a5e18a522fa7926598e69bfd80f2bbd7511c 100644 (file)
@@ -303,7 +303,7 @@ DEFTREECODE (FIXED_CST, "fixed_cst", tcc_constant, 0)
    whose contents are other constant nodes.  */
 DEFTREECODE (COMPLEX_CST, "complex_cst", tcc_constant, 0)
 
-/* Contents are in TREE_VECTOR_CST_ELTS field.  */
+/* Contents are in VECTOR_CST_ELTS field.  */
 DEFTREECODE (VECTOR_CST, "vector_cst", tcc_constant, 0)
 
 /* Contents are TREE_STRING_LENGTH and the actual contents of the string.  */