diff mbox

Fix PR78396

Message ID alpine.LSU.2.11.1611211237380.5294@t29.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Nov. 21, 2016, 11:42 a.m. UTC
The following patch deals with the testsuite fallout of the patch
forcing LOOP_VECTORIZED () versioning in GIMPLE if-conversion.  We
no longer see the if-converted body when doing BB vectorization.

While the real fix would be to teach BB vectorization about
conditions (and thus if-conversion) itself a quick workaround to
restore previous behavior is to simply run BB vectorization
for if-converted loop bodies from inside the loop vectorizer itself.
That fixes the testcase and restores behavior for all
if-converted (but not also unrolled) loops.

Bootstrap & regtest in progress on x86_64-unknown-linux-gnu.

Richard.

2016-11-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/78396
	* tree-vectorizer.c (vectorize_loops): If an innermost loop didn't
	vectorize try vectorizing an if-converted body using BB vectorization.

	* gcc.dg/vect/bb-slp-cond-1.c: Adjust.
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c
index 35811bd..ddad853 100644
--- a/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c
@@ -1,4 +1,5 @@ 
 /* { dg-require-effective-target vect_condition } */
+/* { dg-additional-options "-fdump-tree-vect-details" } */
 
 #include "tree-vect.h"
 
@@ -41,5 +42,10 @@  int main ()
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { target vect_element_align } } } */
+/* Basic blocks of if-converted loops are vectorized from within the loop
+   vectorizer pass.  In this case it is really a deficiency in loop
+   vectorization data dependence analysis that causes us to require
+   basic block vectorization in the first place.  */
+
+/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "vect" { target vect_element_align } } } */
 
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index 35d7a3e..b390664 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -540,6 +540,7 @@  vectorize_loops (void)
 	     || loop->force_vectorize)
       {
 	loop_vec_info loop_vinfo, orig_loop_vinfo = NULL;
+	gimple *loop_vectorized_call = vect_loop_vectorized_call (loop);
 vectorize_epilogue:
 	vect_location = find_loop_location (loop);
         if (LOCATION_LOCUS (vect_location) != UNKNOWN_LOCATION
@@ -558,6 +559,33 @@  vectorize_epilogue:
 	    if (loop_constraint_set_p (loop, LOOP_C_FINITE))
 	      vect_free_loop_info_assumptions (loop);
 
+	    /* If we applied if-conversion then try to vectorize the
+	       BB of innermost loops.
+	       ???  Ideally BB vectorization would learn to vectorize
+	       control flow by applying if-conversion on-the-fly, the
+	       following retains the if-converted loop body even when
+	       only non-if-converted parts took part in BB vectorization.  */
+	    if (flag_tree_slp_vectorize != 0
+		&& loop_vectorized_call
+		&& ! loop->inner)
+	      {
+		basic_block bb = loop->header;
+		for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
+		     !gsi_end_p (gsi); gsi_next (&gsi))
+		  {
+		    gimple *stmt = gsi_stmt (gsi);
+		    gimple_set_uid (stmt, -1);
+		    gimple_set_visited (stmt, false);
+		  }
+		if (vect_slp_bb (bb))
+		  {
+		    dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, vect_location,
+				     "basic block vectorized\n");
+		    fold_loop_vectorized_call (loop_vectorized_call,
+					       boolean_true_node);
+		    ret |= TODO_cleanup_cfg;
+		  }
+	      }
 	    continue;
 	  }
 
@@ -575,7 +603,6 @@  vectorize_epilogue:
 	    break;
 	  }
 
-	gimple *loop_vectorized_call = vect_loop_vectorized_call (loop);
 	if (loop_vectorized_call)
 	  set_uid_loop_bbs (loop_vinfo, loop_vectorized_call);
         if (LOCATION_LOCUS (vect_location) != UNKNOWN_LOCATION