On Wed, Mar 30, 2016 at 12:04 AM, Jan Hubicka <[email protected]> wrote:
> Hi,
> this patch fixes stupid overflow in tree-ssa-loop-ivcanon.c.
> If the estimated number of execution of loop is INT_MAX+1 it will get peeled
> incorrectly.
>
> Bootstrapped/regtested x86_64-linux and committed (it is regression WRT the
> RTL implementation)
>
> Honza
>
> * tree-ssa-loop-ivcanon.c (try_peel_loop): Change type of peel
> to HOST_WIDE_INT
> Index: tree-ssa-loop-ivcanon.c
> ===================================================================
> --- tree-ssa-loop-ivcanon.c (revision 234516)
> +++ tree-ssa-loop-ivcanon.c (working copy)
> @@ -935,7 +935,7 @@ try_peel_loop (struct loop *loop,
> edge exit, tree niter,
> HOST_WIDE_INT maxiter)
> {
> - int npeel;
> + HOST_WIDE_INT npeel;
> struct loop_size size;
> int peeled_size;
> sbitmap wont_exit;
> @@ -990,7 +990,7 @@ try_peel_loop (struct loop *loop,
> {
> if (dump_file)
> fprintf (dump_file, "Not peeling: rolls too much "
> - "(%i + 1 > --param max-peel-times)\n", npeel);
> + "(%i + 1 > --param max-peel-times)\n", (int) npeel);
Use "(" HOST_WIDE_INT_PRINT_DEC " + 1 > ....
> return false;
> }
> npeel++;
> @@ -998,7 +998,7 @@ try_peel_loop (struct loop *loop,
> /* Check peeled loops size. */
> tree_estimate_loop_size (loop, exit, NULL, &size,
> PARAM_VALUE (PARAM_MAX_PEELED_INSNS));
> - if ((peeled_size = estimated_peeled_sequence_size (&size, npeel))
> + if ((peeled_size = estimated_peeled_sequence_size (&size, (int) npeel))
^^^ suggests estimated_peeled_sequence_size needs adjustment as well,
otherwise you'll get bogus param check.
> > PARAM_VALUE (PARAM_MAX_PEELED_INSNS))
> {
> if (dump_file)
> @@ -1032,7 +1032,7 @@ try_peel_loop (struct loop *loop,
> if (dump_file && (dump_flags & TDF_DETAILS))
> {
> fprintf (dump_file, "Peeled loop %d, %i times.\n",
> - loop->num, npeel);
> + loop->num, (int) npeel);
See above.
Richard.
> }
> if (loop->any_upper_bound)
> loop->nb_iterations_upper_bound -= npeel;