diff options
author | Richard Biener <rguenther@suse.de> | 2016-11-23 14:40:05 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-11-23 14:40:05 +0000 |
commit | e600f2198f7dcdbdad2d469a3d498f6dbafb4468 (patch) | |
tree | b78ada2a6538f446a7584ca6ebf21c4d3f9ea03d /gcc | |
parent | 07ce14666601681f7638e8e955740566ce3386ec (diff) | |
download | gcc-e600f2198f7dcdbdad2d469a3d498f6dbafb4468.zip gcc-e600f2198f7dcdbdad2d469a3d498f6dbafb4468.tar.gz gcc-e600f2198f7dcdbdad2d469a3d498f6dbafb4468.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c | 8 | ||||
-rw-r--r-- | gcc/tree-vectorizer.c | 29 |
4 files changed, 46 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a931d1e..a5f757c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index db8b897..7bdb38a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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 * gcc.dg/torture/pr78482.c: New testcase. 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 |