On Wed, Mar 30, 2016 at 12:04 AM, Jan Hubicka <hubi...@ucw.cz> 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;

Reply via email to