tree-vect-slp.c (vect_build_slp_tree_1): For BB vectorization do not allow unrolling.
authorRichard Biener <rguenther@suse.de>
Tue, 12 May 2015 07:40:00 +0000 (07:40 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 12 May 2015 07:40:00 +0000 (07:40 +0000)
2015-05-12  Richard Biener  <rguenther@suse.de>

* 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.

From-SVN: r223033

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 f7d9856ab0541e67a0740f62a4624a8021896cc1..54f80c572b66eba83db837e9b2c942e64e330d08 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 0c97ea2f84113bdb882fe324e4a6ce7792a848c9..3f5f347b5f53c6911d20d0f7a8e54b4d7bc878a0 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 fc96df31173e9071e36ec5e807586b862cc51c16..d6efe941c256585b52634e16b5af3a1361370cb7 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))
         {