diff options
author | Richard Biener <rguenther@suse.de> | 2017-11-30 07:53:31 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-11-30 07:53:31 +0000 |
commit | a52206ae28ed3e55d601118bedd52739456401ab (patch) | |
tree | 5ff55ff4e22b73b4349ddd2dae89d9da6e9ded2c /gcc/tree-ssa-loop-ivcanon.c | |
parent | 222353edef6528ab5ff0f3c029425e76e7048fd8 (diff) | |
download | gcc-a52206ae28ed3e55d601118bedd52739456401ab.zip gcc-a52206ae28ed3e55d601118bedd52739456401ab.tar.gz gcc-a52206ae28ed3e55d601118bedd52739456401ab.tar.bz2 |
re PR tree-optimization/83202 (Try joining operations on consecutive array elements during tree vectorization)
2017-11-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/83202
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Add
allow_peel argument and guard peeling.
(canonicalize_loop_induction_variables): Likewise.
(canonicalize_induction_variables): Pass false.
(tree_unroll_loops_completely_1): Pass unroll_outer to disallow
peeling from cunrolli.
* gcc.dg/vect/pr83202-1.c: New testcase.
* gcc.dg/tree-ssa/pr61743-1.c: Adjust.
From-SVN: r255267
Diffstat (limited to 'gcc/tree-ssa-loop-ivcanon.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivcanon.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index a32e12b..25193b4 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -679,7 +679,7 @@ try_unroll_loop_completely (struct loop *loop, edge exit, tree niter, enum unroll_level ul, HOST_WIDE_INT maxiter, - location_t locus) + location_t locus, bool allow_peel) { unsigned HOST_WIDE_INT n_unroll = 0; bool n_unroll_found = false; @@ -711,7 +711,8 @@ try_unroll_loop_completely (struct loop *loop, exit = NULL; /* See if we can improve our estimate by using recorded loop bounds. */ - if (maxiter >= 0 + if ((allow_peel || maxiter == 0 || ul == UL_NO_GROWTH) + && maxiter >= 0 && (!n_unroll_found || (unsigned HOST_WIDE_INT)maxiter < n_unroll)) { n_unroll = maxiter; @@ -1139,7 +1140,7 @@ try_peel_loop (struct loop *loop, static bool canonicalize_loop_induction_variables (struct loop *loop, bool create_iv, enum unroll_level ul, - bool try_eval) + bool try_eval, bool allow_peel) { edge exit = NULL; tree niter; @@ -1207,7 +1208,8 @@ canonicalize_loop_induction_variables (struct loop *loop, populates the loop bounds. */ modified |= remove_redundant_iv_tests (loop); - if (try_unroll_loop_completely (loop, exit, niter, ul, maxiter, locus)) + if (try_unroll_loop_completely (loop, exit, niter, ul, maxiter, locus, + allow_peel)) return true; if (create_iv @@ -1238,7 +1240,7 @@ canonicalize_induction_variables (void) { changed |= canonicalize_loop_induction_variables (loop, true, UL_SINGLE_ITER, - true); + true, false); } gcc_assert (!need_ssa_update_p (cfun)); @@ -1353,7 +1355,7 @@ tree_unroll_loops_completely_1 (bool may_increase_size, bool unroll_outer, ul = UL_NO_GROWTH; if (canonicalize_loop_induction_variables - (loop, false, ul, !flag_tree_loop_ivcanon)) + (loop, false, ul, !flag_tree_loop_ivcanon, unroll_outer)) { /* If we'll continue unrolling, we need to propagate constants within the new basic blocks to fold away induction variable |