+2012-04-19 Richard Guenther <rguenther@suse.de>
+
+ PR rtl-optimization/44688
+ * loop-iv.c (determine_max_iter): Only return max_iter.
+ (iv_number_of_iterations): Also use the recorded loop bound
+ on the maximum number of iterations.
+ * loop-unroll.c (decide_unroll_runtime_iterations): Use
+ max_iter to avoid unrolling loops that do not roll.
+ (decide_unroll_stupid): Likewise.
+
2012-04-18 Steven Bosscher <steven@gcc.gnu.org>
* targhooks.c (default_case_values_threshold): Fix code style nit.
return true;
}
-/* Tries to estimate the maximum number of iterations in LOOP, and store the
- result in DESC. This function is called from iv_number_of_iterations with
+/* Tries to estimate the maximum number of iterations in LOOP, and return the
+ result. This function is called from iv_number_of_iterations with
a number of fields in DESC already filled in. OLD_NITER is the original
expression for the number of iterations, before we tried to simplify it. */
{
nmax = INTVAL (XEXP (niter, 0));
if (!(nmax & (nmax + 1)))
- {
- desc->niter_max = nmax;
- return nmax;
- }
+ return nmax;
}
get_mode_bounds (desc->mode, desc->signed_p, desc->mode, &mmin, &mmax);
if (GET_CODE (niter) == UDIV)
{
if (!CONST_INT_P (XEXP (niter, 1)))
- {
- desc->niter_max = nmax;
- return nmax;
- }
+ return nmax;
inc = INTVAL (XEXP (niter, 1));
niter = XEXP (niter, 0);
}
if (dump_file)
fprintf (dump_file, ";; improved upper bound by one.\n");
}
- desc->niter_max = nmax / inc;
return nmax / inc;
}
enum rtx_code cond;
enum machine_mode mode, comp_mode;
rtx mmin, mmax, mode_mmin, mode_mmax;
- unsigned HOST_WIDEST_INT s, size, d, inv;
+ unsigned HOST_WIDEST_INT s, size, d, inv, max;
HOST_WIDEST_INT up, down, inc, step_val;
int was_sharp = false;
rtx old_niter;
desc->const_iter = false;
desc->niter_expr = NULL_RTX;
desc->niter_max = 0;
+ if (loop->any_upper_bound
+ && double_int_fits_in_uhwi_p (loop->nb_iterations_upper_bound))
+ desc->niter_max = loop->nb_iterations_upper_bound.low;
cond = GET_CODE (condition);
gcc_assert (COMPARISON_P (condition));
down = INTVAL (CONST_INT_P (iv0.base)
? iv0.base
: mode_mmin);
- desc->niter_max = (up - down) / inc + 1;
+ max = (up - down) / inc + 1;
+ if (!desc->niter_max
+ || max < desc->niter_max)
+ desc->niter_max = max;
if (iv0.step == const0_rtx)
{
}
else
{
- if (!desc->niter_max)
- desc->niter_max = determine_max_iter (loop, desc, old_niter);
+ max = determine_max_iter (loop, desc, old_niter);
+ if (!desc->niter_max
+ || max < desc->niter_max)
+ desc->niter_max = max;
/* simplify_using_initial_values does a copy propagation on the registers
in the expression for the number of iterations. This prolongs life
}
/* If we have profile feedback, check whether the loop rolls. */
- if (loop->header->count && expected_loop_iterations (loop) < 2 * nunroll)
+ if ((loop->header->count
+ && expected_loop_iterations (loop) < 2 * nunroll)
+ || desc->niter_max < 2 * nunroll)
{
if (dump_file)
fprintf (dump_file, ";; Not unrolling loop, doesn't roll\n");
}
/* If we have profile feedback, check whether the loop rolls. */
- if (loop->header->count
- && expected_loop_iterations (loop) < 2 * nunroll)
+ if ((loop->header->count
+ && expected_loop_iterations (loop) < 2 * nunroll)
+ || desc->niter_max < 2 * nunroll)
{
if (dump_file)
fprintf (dump_file, ";; Not unrolling loop, doesn't roll\n");