summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-13 22:24:39 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-13 22:24:39 +0000
commite8253d04ce02fca1bbc6515c68abbebc7c194054 (patch)
tree74a61d6b121db6628302dca9478ae704b2173114
parentd0c4444a1590f3b263a7c951458f05fbef01b34a (diff)
downloadgcc-e8253d04ce02fca1bbc6515c68abbebc7c194054.tar.gz
* fold-const.c (fold_convert_const): Fold changing cv-quals on
VECTOR_CST. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230358 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/fold-const.c19
-rw-r--r--gcc/tree.def2
3 files changed, 23 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index eeec887f122..74fa2d4da03 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 9114dec074a..ce59c488b7e 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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;
}
diff --git a/gcc/tree.def b/gcc/tree.def
index 41064a8e657..44e5a5e18a5 100644
--- a/gcc/tree.def
+++ b/gcc/tree.def
@@ -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. */