re PR tree-optimization/78396 (gcc.dg/vect/bb-slp-cond-1.c FAILs after fix for PR77848)

2016-11-23  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.

From-SVN: r242759
This commit is contained in:
Richard Biener 2016-11-23 14:40:05 +00:00 committed by Richard Biener
parent 07ce146666
commit e600f2198f
4 changed files with 46 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2016-11-23 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.
2016-11-23 Richard Sandiford <richard.sandiford@arm.com>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>

View File

@ -1,3 +1,8 @@
2016-11-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/78396
* gcc.dg/vect/bb-slp-cond-1.c: Adjust.
2016-11-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/78482

View File

@ -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 } } } */

View File

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