aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-02-06 10:16:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-06 10:16:19 +0100
commit4763581763de6049c938ea7129d738d497004a06 (patch)
tree36db92da41720345c8b90ec4dd599bb527a46a17 /gcc
parentce4321c918aa0d17ecd7da6c3deb43524b1729cf (diff)
downloadgcc-4763581763de6049c938ea7129d738d497004a06.zip
gcc-4763581763de6049c938ea7129d738d497004a06.tar.gz
gcc-4763581763de6049c938ea7129d738d497004a06.tar.bz2
re PR middle-end/89210 (ICE tree check: expected integer_cst, have real_cst in to_wide, at tree.h:5600)
PR middle-end/89210 * fold-const-call.c (fold_const_vec_convert): Pass true as last operand to new_unary_operation only if both element types are integral and it isn't a widening conversion. Return NULL_TREE if new_unary_operation failed. * c-c++-common/builtin-convertvector-2.c: New test. From-SVN: r268573
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/fold-const-call.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/builtin-convertvector-2.c12
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 137066a..5e2d7e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2019-02-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/89210
+ * fold-const-call.c (fold_const_vec_convert): Pass true as last
+ operand to new_unary_operation only if both element types are integral
+ and it isn't a widening conversion. Return NULL_TREE if
+ new_unary_operation failed.
+
2019-02-05 Andreas Krebbel <krebbel@linux.ibm.com>
PR target/88856
diff --git a/gcc/fold-const-call.c b/gcc/fold-const-call.c
index 439043a..702c8b4 100644
--- a/gcc/fold-const-call.c
+++ b/gcc/fold-const-call.c
@@ -665,8 +665,17 @@ fold_const_vec_convert (tree ret_type, tree arg)
&& SCALAR_FLOAT_TYPE_P (TREE_TYPE (ret_type)))
code = FLOAT_EXPR;
+ /* We can't handle steps directly when extending, since the
+ values need to wrap at the original precision first. */
+ bool step_ok_p
+ = (INTEGRAL_TYPE_P (TREE_TYPE (ret_type))
+ && INTEGRAL_TYPE_P (TREE_TYPE (arg_type))
+ && (TYPE_PRECISION (TREE_TYPE (ret_type))
+ <= TYPE_PRECISION (TREE_TYPE (arg_type))));
tree_vector_builder elts;
- elts.new_unary_operation (ret_type, arg, true);
+ if (!elts.new_unary_operation (ret_type, arg, step_ok_p))
+ return NULL_TREE;
+
unsigned int count = elts.encoded_nelts ();
for (unsigned int i = 0; i < count; ++i)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0dd171c..b5c92ff 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/89210
+ * c-c++-common/builtin-convertvector-2.c: New test.
+
2019-02-05 Nikhil Benesch <nikhil.benesch@gmail.com>
PR go/89019
diff --git a/gcc/testsuite/c-c++-common/builtin-convertvector-2.c b/gcc/testsuite/c-c++-common/builtin-convertvector-2.c
new file mode 100644
index 0000000..ee77c79
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/builtin-convertvector-2.c
@@ -0,0 +1,12 @@
+/* PR middle-end/89210 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef int v4si __attribute__((vector_size (4 * sizeof (int))));
+typedef double v4df __attribute__((vector_size (4 * sizeof (double))));
+void
+foo (v4df *x)
+{
+ v4si a = { 1, 2, 3, 4 };
+ *x = __builtin_convertvector (a, v4df);
+}