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;