aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2013-10-16 15:48:47 +0000
committerAndrew Macleod <amacleod@gcc.gnu.org>2013-10-16 15:48:47 +0000
commit1ef88893457d51ad3429eab97fb6edd56c9db646 (patch)
tree8477f2ad269e9d4ebe53cbc7799f7b5a6c9dc5ca /gcc
parentc22df64f91c2f4fcd22eb94ed55af08095e3ad78 (diff)
downloadgcc-1ef88893457d51ad3429eab97fb6edd56c9db646.zip
gcc-1ef88893457d51ad3429eab97fb6edd56c9db646.tar.gz
gcc-1ef88893457d51ad3429eab97fb6edd56c9db646.tar.bz2
re PR tree-optimization/58697 (wrong code (segfaults) at -O3)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/cfgloop.c28
-rw-r--r--gcc/cfgloop.h4
-rw-r--r--gcc/loop-iv.c4
-rw-r--r--gcc/loop-unroll.c2
-rw-r--r--gcc/loop-unswitch.c2
-rw-r--r--gcc/tree-ssa-loop-niter.c21
-rw-r--r--gcc/tree-ssa-loop-niter.h2
8 files changed, 69 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c1617d4..237a212 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c
index 272a675..28e30ea 100644
--- a/gcc/cfgloop.c
+++ b/gcc/cfgloop.c
@@ -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;
+}
+
+
diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
index 9048e02..b9676ec 100644
--- a/gcc/cfgloop.h
+++ b/gcc/cfgloop.h
@@ -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);
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index 07f28e3..b9bc3348 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -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);
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
index 7fd3177..568fd7b 100644
--- a/gcc/loop-unroll.c
+++ b/gcc/loop-unroll.c
@@ -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,
diff --git a/gcc/loop-unswitch.c b/gcc/loop-unswitch.c
index 23057d8..3bdb10a 100644
--- a/gcc/loop-unswitch.c
+++ b/gcc/loop-unswitch.c
@@ -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)
diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
index 8bcb1c6..113c7d1 100644
--- a/gcc/tree-ssa-loop-niter.c
+++ b/gcc/tree-ssa-loop-niter.c
@@ -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. */
diff --git a/gcc/tree-ssa-loop-niter.h b/gcc/tree-ssa-loop-niter.h
index aa05282..1945507 100644
--- a/gcc/tree-ssa-loop-niter.h
+++ b/gcc/tree-ssa-loop-niter.h
@@ -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 *);