2015-05-12 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 May 2015 07:40:00 +0000 (07:40 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 May 2015 07:40:00 +0000 (07:40 +0000)
* tree-vect-slp.c (vect_build_slp_tree_1): For BB vectorization
do not allow unrolling.

* gcc.dg/vect/bb-slp-35.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@223033 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/bb-slp-35.c [new file with mode: 0644]
gcc/tree-vect-slp.c

index f7d9856..54f80c5 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-12  Richard Biener  <rguenther@suse.de>
+
+       * tree-vect-slp.c (vect_build_slp_tree_1): For BB vectorization
+       do not allow unrolling.
+
 2015-05-11  Richard Henderson  <rth@redhat.com>
 
        * config/i386/i386-modes.def (CCP): New.
index 0c97ea2..3f5f347 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-12  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/vect/bb-slp-35.c: New testcase.
+
 2015-05-11  Mikael Morin  <mikael@gcc.gnu.org>
 
        PR fortran/66100
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-35.c b/gcc/testsuite/gcc.dg/vect/bb-slp-35.c
new file mode 100644 (file)
index 0000000..7d67558
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+
+void foo (int * __restrict__ p, short * __restrict__ q)
+{
+  p[0] = q[0] + 1;
+  p[1] = q[1] + 1;
+  p[2] = q[2] + 1;
+  p[3] = q[3] + 1;
+}
+
+/* { dg-final { scan-tree-dump "basic block vectorized" "slp2" } } */
+/* { dg-final { cleanup-tree-dump "slp2" } } */
index fc96df3..d6efe94 100644 (file)
@@ -568,6 +568,19 @@ vect_build_slp_tree_1 (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
           return false;
         }
 
+      /* If populating the vector type requires unrolling then fail
+         before adjusting *max_nunits for basic-block vectorization.  */
+      if (bb_vinfo
+         && TYPE_VECTOR_SUBPARTS (vectype) > group_size)
+       {
+         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, 
+                          "Build SLP failed: unrolling required "
+                          "in basic block SLP\n");
+         /* Fatal mismatch.  */
+         matches[0] = false;
+         return false;
+       }
+
       /* In case of multiple types we need to detect the smallest type.  */
       if (*max_nunits < TYPE_VECTOR_SUBPARTS (vectype))
         {