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);
       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))
       > 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);
     }
   if (loop->any_upper_bound)
     loop->nb_iterations_upper_bound -= npeel;

Reply via email to