re PR tree-optimization/92715 (error: position plus size exceeds size of referenced...
authorRichard Biener <rguenther@suse.de>
Fri, 29 Nov 2019 09:18:48 +0000 (09:18 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 29 Nov 2019 09:18:48 +0000 (09:18 +0000)
2019-11-29  Richard Biener  <rguenther@suse.de>

PR tree-optimization/92715
* tree-ssa-forwprop.c (simplify_vector_constructor): Bail
out for uniform vectors and source vectors with less elements
than the destination.

* gcc.dg/torture/pr92715.c: New testcase.

From-SVN: r278833

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr92715.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index 229e2b6b7ef5f138b1150d4b45a2b1e73e263bde..3eaa9acf7433691c803a541c26c2fcdaf157726b 100644 (file)
@@ -1,3 +1,10 @@
+2019-11-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92715
+       * tree-ssa-forwprop.c (simplify_vector_constructor): Bail
+       out for uniform vectors and source vectors with less elements
+       than the destination.
+
 2019-11-29  Martin Liska  <mliska@suse.cz>
 
        PR lto/91574
index 45c9de34b61120a01100501da99873a5b86b5af9..5d323652dbacd005d7b4f8a90badd844773ae4fc 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92715
+       * gcc.dg/torture/pr92715.c: New testcase.
+
 2019-11-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/60228
diff --git a/gcc/testsuite/gcc.dg/torture/pr92715.c b/gcc/testsuite/gcc.dg/torture/pr92715.c
new file mode 100644 (file)
index 0000000..170179c
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-mavx2" { target x86_64-*-* i?86-*-* } } */
+
+typedef double v4si __attribute__((vector_size(32)));
+typedef double v2si __attribute__((vector_size(16)));
+
+void foo (v4si *dstp, v2si *srcp)
+{
+  v2si src = *srcp;
+  *dstp = (v4si) { src[0], src[1], src[0], src[1] };
+}
+
+void bar (v4si *dstp, v2si *srcp)
+{
+  v2si src = *srcp;
+  *dstp = (v4si) { src[0], src[0], src[0], src[0] };
+}
index b275a637347495a260f826bd690741e0c3b5a329..36e6267cf557bea14b6360e9e686811ac28e059c 100644 (file)
@@ -2038,13 +2038,13 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
   constructor_elt *elt;
   bool maybe_ident;
 
-  gcc_checking_assert (gimple_assign_rhs_code (stmt) == CONSTRUCTOR);
-
   op = gimple_assign_rhs1 (stmt);
   type = TREE_TYPE (op);
-  gcc_checking_assert (TREE_CODE (type) == VECTOR_TYPE);
+  gcc_checking_assert (TREE_CODE (op) == CONSTRUCTOR
+                      && TREE_CODE (type) == VECTOR_TYPE);
 
-  if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts))
+  if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts)
+      || uniform_vector_p (op))
     return false;
   elem_type = TREE_TYPE (type);
   elem_size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
@@ -2136,6 +2136,9 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
       || ! VECTOR_TYPE_P (TREE_TYPE (orig[0])))
     return false;
   refnelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (orig[0])).to_constant ();
+  /* We currently do not handle larger destination vectors.  */
+  if (refnelts < nelts)
+    return false;
 
   if (maybe_ident)
     {