This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Handle multiple vector sizes in BB vectorization


Well, not really - but at least don't fail vectorization because of that
but allow it to proceed the "build up from scalar pieces" path.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

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.

Index: gcc/tree-vect-slp.c
===================================================================
--- gcc/tree-vect-slp.c.orig	2015-05-11 15:25:59.385297283 +0200
+++ gcc/tree-vect-slp.c	2015-05-11 15:21:00.129581537 +0200
@@ -572,6 +572,19 @@ vect_build_slp_tree_1 (loop_vec_info loo
           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))
         {
Index: gcc/testsuite/gcc.dg/vect/bb-slp-35.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/bb-slp-35.c	(revision 0)
+++ gcc/testsuite/gcc.dg/vect/bb-slp-35.c	(working copy)
@@ -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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]