re PR middle-end/89210 (ICE tree check: expected integer_cst, have real_cst in to_wid...
authorJakub Jelinek <jakub@redhat.com>
Wed, 6 Feb 2019 09:16:19 +0000 (10:16 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 6 Feb 2019 09:16:19 +0000 (10:16 +0100)
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

gcc/ChangeLog
gcc/fold-const-call.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/builtin-convertvector-2.c [new file with mode: 0644]

index 137066a52f6bd1054785585cd145176f86301f7f..5e2d7e75b4dd9f52d920000c6f688a03d41493f2 100644 (file)
@@ -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
index 439043a85a0a483da421f1e03bc30b85ca44d10d..702c8b4057abb02935082b43cbd8af3eabab2be1 100644 (file)
@@ -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)
     {
index 0dd171c9647bd12c164c5201346cd27f2d016836..b5c92ffb6b6a3a839181f285410493b048bbcc17 100644 (file)
@@ -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 (file)
index 0000000..ee77c79
--- /dev/null
@@ -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);
+}