Commit 3862ef76 by Richard Sandiford Committed by Richard Sandiford

Cap niter_for_unrolled_loop to upper bound

For the reasons explained in PR77536, niter_for_unrolled_loop assumes 5
iterations in the absence of profiling information, although it doesn't
increase beyond the estimate for the original loop.  This left a hole in
which the new estimate could be less than the old one but still greater
than the limit imposed by CEIL (nb_iterations_upper_bound, unroll factor).

2017-05-04  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	* tree-ssa-loop-manip.c (niter_for_unrolled_loop): Add commentary
	to explain the use of truncating division.  Cap the number of
	iterations to the maximum given by nb_iterations_upper_bound,
	if defined.

gcc/testsuite/
	* gcc.dg/vect/vect-profile-1.c: New test.

From-SVN: r247591
parent 6d0da573
2017-05-04 Richard Sandiford <richard.sandiford@linaro.org>
* tree-ssa-loop-manip.c (niter_for_unrolled_loop): Add commentary
to explain the use of truncating division. Cap the number of
iterations to the maximum given by nb_iterations_upper_bound,
if defined.
2017-05-04 Thomas Preud'homme <thomas.preudhomme@arm.com> 2017-05-04 Thomas Preud'homme <thomas.preudhomme@arm.com>
* configure.ac (--enable-mingw-wildcard): Add new configurable feature. * configure.ac (--enable-mingw-wildcard): Add new configurable feature.
......
2017-05-04 Richard Sandiford <richard.sandiford@linaro.org>
* gcc.dg/vect/vect-profile-1.c: New test.
2017-05-04 Marek Polacek <polacek@redhat.com> 2017-05-04 Marek Polacek <polacek@redhat.com>
PR tree-optimization/80612 PR tree-optimization/80612
......
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-fdump-tree-vect-details-blocks" } */
/* At least one of these should correspond to a full vector. */
void
f1 (int *x)
{
for (int j = 0; j < 2; ++j)
x[j] += 1;
}
void
f2 (int *x)
{
for (int j = 0; j < 4; ++j)
x[j] += 1;
}
void
f3 (int *x)
{
for (int j = 0; j < 8; ++j)
x[j] += 1;
}
void
f4 (int *x)
{
for (int j = 0; j < 16; ++j)
x[j] += 1;
}
/* { dg-final { scan-tree-dump {goto <bb [0-9]+>; \[0+.0*%\]} vect } } */
...@@ -1104,6 +1104,9 @@ niter_for_unrolled_loop (struct loop *loop, unsigned factor) ...@@ -1104,6 +1104,9 @@ niter_for_unrolled_loop (struct loop *loop, unsigned factor)
gcc_assert (factor != 0); gcc_assert (factor != 0);
bool profile_p = false; bool profile_p = false;
gcov_type est_niter = expected_loop_iterations_unbounded (loop, &profile_p); gcov_type est_niter = expected_loop_iterations_unbounded (loop, &profile_p);
/* Note that this is really CEIL (est_niter + 1, factor) - 1, where the
"+ 1" converts latch iterations to loop iterations and the "- 1"
converts back. */
gcov_type new_est_niter = est_niter / factor; gcov_type new_est_niter = est_niter / factor;
/* Without profile feedback, loops for which we do not know a better estimate /* Without profile feedback, loops for which we do not know a better estimate
...@@ -1120,6 +1123,15 @@ niter_for_unrolled_loop (struct loop *loop, unsigned factor) ...@@ -1120,6 +1123,15 @@ niter_for_unrolled_loop (struct loop *loop, unsigned factor)
new_est_niter = 5; new_est_niter = 5;
} }
if (loop->any_upper_bound)
{
/* As above, this is really CEIL (upper_bound + 1, factor) - 1. */
widest_int bound = wi::udiv_floor (loop->nb_iterations_upper_bound,
factor);
if (wi::ltu_p (bound, new_est_niter))
new_est_niter = bound.to_uhwi ();
}
return new_est_niter; return new_est_niter;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment