+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.
+
2017-11-29 Segher Boessenkool <segher@kernel.crashing.org>
* combine.c (try_combine): Print a message to dump file whenever
+2017-11-30 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/83202
+ * gcc.dg/vect/pr83202-1.c: New testcase.
+ * gcc.dg/tree-ssa/pr61743-1.c: Adjust.
+
2017-11-29 Jim Wilson <jimw@sifive.com>
* gcc.target/riscv/riscv.exp: New.
return 0;\r
}\r
\r
-/* { dg-final { scan-tree-dump-times "loop with 3 iterations completely unrolled" 8 "cunroll" } } */\r
-/* { dg-final { scan-tree-dump-times "loop with 8 iterations completely unrolled" 2 "cunrolli" } } */\r
+/* { dg-final { scan-tree-dump-times "loop with 3 iterations completely unrolled" 2 "cunroll" } } */\r
+/* { dg-final { scan-tree-dump-times "loop with 7 iterations completely unrolled" 2 "cunroll" } } */\r
+/* { dg-final { scan-tree-dump-not "completely unrolled" "cunrolli" } } */\r
--- /dev/null
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_double } */
+
+void test(double data[8][8])
+{
+ for (int i = 0; i < 8; i++)
+ {
+ for (int j = 0; j < i; j+=4)
+ {
+ data[i][j] *= data[i][j];
+ data[i][j+1] *= data[i][j+1];
+ data[i][j+2] *= data[i][j+2];
+ data[i][j+3] *= data[i][j+3];
+ }
+ }
+}
+
+/* { dg-final { scan-tree-dump "Loop contains only SLP stmts" "vect" } } */
+/* { dg-final { scan-tree-dump "ectorized 1 loops" "vect" } } */
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;
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;
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;
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
{
changed |= canonicalize_loop_induction_variables (loop,
true, UL_SINGLE_ITER,
- true);
+ true, false);
}
gcc_assert (!need_ssa_update_p (cfun));
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