]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/58697 (wrong code (segfaults) at -O3)
authorAndrew MacLeod <amacleod@redhat.com>
Wed, 16 Oct 2013 15:48:47 +0000 (15:48 +0000)
committerAndrew Macleod <amacleod@gcc.gnu.org>
Wed, 16 Oct 2013 15:48:47 +0000 (15:48 +0000)
PR tree-optimization/58697
* cfgloop.c (get_estimated_loop_iterations_int): Rename from
estimated_loop_iterations_int.
(max_stmt_executions_int): Call get_max_loop_iterations_int.
(get_max_loop_iterations_int): New.  HWINT version of
get_max_loop_iterations.
* cfgloop.h: Add prototypes.
* loop-iv.c (find_simple_exit): call get_estimated_loop_iterations_int.
* loop-unroll.c (decide_peel_once_rolling): Call
get_estimated_loop_iterations_int.
* tree-ssa-loop-niter.c (estimated_loop_iterations_int): Add back.
* tree-ssa-loop-niter.h: Tweak prototypes.

From-SVN: r203709

gcc/ChangeLog
gcc/cfgloop.c
gcc/cfgloop.h
gcc/loop-iv.c
gcc/loop-unroll.c
gcc/loop-unswitch.c
gcc/tree-ssa-loop-niter.c
gcc/tree-ssa-loop-niter.h

index c1617d4ba2452b4a593f7610564d59c5c3952558..237a2124ca8d34dba7d881d96753d103cabb959e 100644 (file)
@@ -1,3 +1,18 @@
+2013-10-16  Andrew MacLeod  <amacleod@redhat.com>
+       
+       PR tree-optimization/58697
+       * cfgloop.c (get_estimated_loop_iterations_int): Rename from 
+       estimated_loop_iterations_int.
+       (max_stmt_executions_int): Call get_max_loop_iterations_int.
+       (get_max_loop_iterations_int): New.  HWINT version of 
+       get_max_loop_iterations.
+       * cfgloop.h: Add prototypes.
+       * loop-iv.c (find_simple_exit): call get_estimated_loop_iterations_int.
+       * loop-unroll.c (decide_peel_once_rolling): Call 
+       get_estimated_loop_iterations_int.
+       * tree-ssa-loop-niter.c (estimated_loop_iterations_int): Add back.
+       * tree-ssa-loop-niter.h: Tweak prototypes.
+
 2013-10-16  David Malcolm  <dmalcolm@redhat.com>
 
        * gengtype-parse.c (struct_field_seq): Ignore access-control
index 272a675ab7dc8d7c909acb579966c8ca8c27d54e..28e30eaa905ebb76b1ed2da053c3591a82decf7f 100644 (file)
@@ -1815,12 +1815,12 @@ record_niter_bound (struct loop *loop, double_int i_bound, bool realistic,
     loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
 }
 
-/* Similar to estimated_loop_iterations, but returns the estimate only
+/* Similar to get_estimated_loop_iterations, but returns the estimate only
    if it fits to HOST_WIDE_INT.  If this is not the case, or the estimate
    on the number of iterations of LOOP could not be derived, returns -1.  */
 
 HOST_WIDE_INT
-estimated_loop_iterations_int (struct loop *loop)
+get_estimated_loop_iterations_int (struct loop *loop)
 {
   double_int nit;
   HOST_WIDE_INT hwi_nit;
@@ -1842,7 +1842,7 @@ estimated_loop_iterations_int (struct loop *loop)
 HOST_WIDE_INT
 max_stmt_executions_int (struct loop *loop)
 {
-  HOST_WIDE_INT nit = max_loop_iterations_int (loop);
+  HOST_WIDE_INT nit = get_max_loop_iterations_int (loop);
   HOST_WIDE_INT snit;
 
   if (nit == -1)
@@ -1891,3 +1891,25 @@ get_max_loop_iterations (struct loop *loop, double_int *nit)
   *nit = loop->nb_iterations_upper_bound;
   return true;
 }
+
+/* Similar to get_max_loop_iterations, but returns the estimate only
+   if it fits to HOST_WIDE_INT.  If this is not the case, or the estimate
+   on the number of iterations of LOOP could not be derived, returns -1.  */
+
+HOST_WIDE_INT
+get_max_loop_iterations_int (struct loop *loop)
+{
+  double_int nit;
+  HOST_WIDE_INT hwi_nit;
+
+  if (!get_max_loop_iterations (loop, &nit))
+    return -1;
+
+  if (!nit.fits_shwi ())
+    return -1;
+  hwi_nit = nit.to_shwi ();
+
+  return hwi_nit < 0 ? -1 : hwi_nit;
+}
+
+
index 9048e0226077ffd1d4c6dbf7442b52f4f0229711..b9676ec02514dba70a222be1ace7e1d20a2555f8 100644 (file)
@@ -740,8 +740,8 @@ loop_outermost (struct loop *loop)
 }
 
 extern void record_niter_bound (struct loop *, double_int, bool, bool);
-extern HOST_WIDE_INT estimated_loop_iterations_int (struct loop *);
-extern HOST_WIDE_INT max_loop_iterations_int (struct loop *);
+extern HOST_WIDE_INT get_estimated_loop_iterations_int (struct loop *);
+extern HOST_WIDE_INT get_max_loop_iterations_int (struct loop *);
 extern bool get_estimated_loop_iterations (struct loop *loop, double_int *nit);
 extern bool get_max_loop_iterations (struct loop *loop, double_int *nit);
 
index 07f28e3affea67bb33e5acaf20c03eaca15fe968..b9bc3348733d1bf5e08e3f1e8518049fb0f66d6a 100644 (file)
@@ -3001,9 +3001,9 @@ find_simple_exit (struct loop *loop, struct niter_desc *desc)
          fprintf (dump_file, "\n");
 
          fprintf (dump_file, "  upper bound: %li\n",
-                  (long)max_loop_iterations_int (loop));
+                  (long)get_max_loop_iterations_int (loop));
          fprintf (dump_file, "  realistic bound: %li\n",
-                  (long)estimated_loop_iterations_int (loop));
+                  (long)get_estimated_loop_iterations_int (loop));
        }
       else
        fprintf (dump_file, "Loop %d is not simple.\n", loop->num);
index 7fd317713fba3817d1487e0849b37d39f1e8e826..568fd7bdab41fd304c9454ce8ed1e03328de2e62 100644 (file)
@@ -469,7 +469,7 @@ decide_peel_once_rolling (struct loop *loop, int flags ATTRIBUTE_UNUSED)
       || desc->infinite
       || !desc->const_iter
       || (desc->niter != 0
-         && max_loop_iterations_int (loop) != 0))
+         && get_max_loop_iterations_int (loop) != 0))
     {
       if (dump_file)
        fprintf (dump_file,
index 23057d8694b3b0ef75244e3a2c475e10e867764c..3bdb10a4373f1b2a08f11bb78e24d1448f6a05b6 100644 (file)
@@ -304,7 +304,7 @@ unswitch_single_loop (struct loop *loop, rtx cond_checked, int num)
     }
 
   /* Nor if the loop usually does not roll.  */
-  iterations = estimated_loop_iterations_int (loop);
+  iterations = get_estimated_loop_iterations_int (loop);
   if (iterations >= 0 && iterations <= 1)
     {
       if (dump_file)
index 8bcb1c6b26e23bb85c5b41369560b3ab6cc1536f..113c7d103be618c96b28822e07d1d2e4e4f43acf 100644 (file)
@@ -3388,6 +3388,27 @@ estimated_loop_iterations (struct loop *loop, double_int *nit)
   return (get_estimated_loop_iterations (loop, nit));
 }
 
+/* Similar to estimated_loop_iterations, but returns the estimate only
+   if it fits to HOST_WIDE_INT.  If this is not the case, or the estimate
+   on the number of iterations of LOOP could not be derived, returns -1.  */
+
+HOST_WIDE_INT
+estimated_loop_iterations_int (struct loop *loop)
+{
+  double_int nit;
+  HOST_WIDE_INT hwi_nit;
+
+  if (!estimated_loop_iterations (loop, &nit))
+    return -1;
+
+  if (!nit.fits_shwi ())
+    return -1;
+  hwi_nit = nit.to_shwi ();
+
+  return hwi_nit < 0 ? -1 : hwi_nit;
+}
+
+
 /* Sets NIT to an upper bound for the maximum number of executions of the
    latch of the LOOP.  If we have no reliable estimate, the function returns
    false, otherwise returns true.  */
index aa05282c59d577a2d985633ed41494c67bfe8ba5..194550762d8d534a850173fadfb2026b16b4b216 100644 (file)
@@ -30,7 +30,9 @@ extern bool finite_loop_p (struct loop *);
 extern tree loop_niter_by_eval (struct loop *, edge);
 extern tree find_loop_niter_by_eval (struct loop *, edge *);
 extern bool estimated_loop_iterations (struct loop *, double_int *);
+extern HOST_WIDE_INT estimated_loop_iterations_int (struct loop *);
 extern bool max_loop_iterations (struct loop *, double_int *);
+extern HOST_WIDE_INT max_loop_iterations_int (struct loop *);
 extern HOST_WIDE_INT max_stmt_executions_int (struct loop *);
 extern HOST_WIDE_INT estimated_stmt_executions_int (struct loop *);
 extern bool max_stmt_executions (struct loop *, double_int *);