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  <rguent...@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 --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

Reply via email to