Commit 1ef88893 by Andrew MacLeod Committed by Andrew Macleod

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
parent c22df64f
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> 2013-10-16 David Malcolm <dmalcolm@redhat.com>
* gengtype-parse.c (struct_field_seq): Ignore access-control * gengtype-parse.c (struct_field_seq): Ignore access-control
......
...@@ -1815,12 +1815,12 @@ record_niter_bound (struct loop *loop, double_int i_bound, bool realistic, ...@@ -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; 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 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. */ on the number of iterations of LOOP could not be derived, returns -1. */
HOST_WIDE_INT HOST_WIDE_INT
estimated_loop_iterations_int (struct loop *loop) get_estimated_loop_iterations_int (struct loop *loop)
{ {
double_int nit; double_int nit;
HOST_WIDE_INT hwi_nit; HOST_WIDE_INT hwi_nit;
...@@ -1842,7 +1842,7 @@ estimated_loop_iterations_int (struct loop *loop) ...@@ -1842,7 +1842,7 @@ estimated_loop_iterations_int (struct loop *loop)
HOST_WIDE_INT HOST_WIDE_INT
max_stmt_executions_int (struct loop *loop) 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; HOST_WIDE_INT snit;
if (nit == -1) if (nit == -1)
...@@ -1891,3 +1891,25 @@ get_max_loop_iterations (struct loop *loop, double_int *nit) ...@@ -1891,3 +1891,25 @@ get_max_loop_iterations (struct loop *loop, double_int *nit)
*nit = loop->nb_iterations_upper_bound; *nit = loop->nb_iterations_upper_bound;
return true; 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;
}
...@@ -740,8 +740,8 @@ loop_outermost (struct loop *loop) ...@@ -740,8 +740,8 @@ loop_outermost (struct loop *loop)
} }
extern void record_niter_bound (struct loop *, double_int, bool, bool); 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 get_estimated_loop_iterations_int (struct loop *);
extern HOST_WIDE_INT max_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_estimated_loop_iterations (struct loop *loop, double_int *nit);
extern bool get_max_loop_iterations (struct loop *loop, double_int *nit); extern bool get_max_loop_iterations (struct loop *loop, double_int *nit);
......
...@@ -3001,9 +3001,9 @@ find_simple_exit (struct loop *loop, struct niter_desc *desc) ...@@ -3001,9 +3001,9 @@ find_simple_exit (struct loop *loop, struct niter_desc *desc)
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
fprintf (dump_file, " upper bound: %li\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", fprintf (dump_file, " realistic bound: %li\n",
(long)estimated_loop_iterations_int (loop)); (long)get_estimated_loop_iterations_int (loop));
} }
else else
fprintf (dump_file, "Loop %d is not simple.\n", loop->num); fprintf (dump_file, "Loop %d is not simple.\n", loop->num);
......
...@@ -469,7 +469,7 @@ decide_peel_once_rolling (struct loop *loop, int flags ATTRIBUTE_UNUSED) ...@@ -469,7 +469,7 @@ decide_peel_once_rolling (struct loop *loop, int flags ATTRIBUTE_UNUSED)
|| desc->infinite || desc->infinite
|| !desc->const_iter || !desc->const_iter
|| (desc->niter != 0 || (desc->niter != 0
&& max_loop_iterations_int (loop) != 0)) && get_max_loop_iterations_int (loop) != 0))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
......
...@@ -304,7 +304,7 @@ unswitch_single_loop (struct loop *loop, rtx cond_checked, int num) ...@@ -304,7 +304,7 @@ unswitch_single_loop (struct loop *loop, rtx cond_checked, int num)
} }
/* Nor if the loop usually does not roll. */ /* 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 (iterations >= 0 && iterations <= 1)
{ {
if (dump_file) if (dump_file)
......
...@@ -3388,6 +3388,27 @@ estimated_loop_iterations (struct loop *loop, double_int *nit) ...@@ -3388,6 +3388,27 @@ estimated_loop_iterations (struct loop *loop, double_int *nit)
return (get_estimated_loop_iterations (loop, 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 /* 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 latch of the LOOP. If we have no reliable estimate, the function returns
false, otherwise returns true. */ false, otherwise returns true. */
......
...@@ -30,7 +30,9 @@ extern bool finite_loop_p (struct loop *); ...@@ -30,7 +30,9 @@ extern bool finite_loop_p (struct loop *);
extern tree loop_niter_by_eval (struct loop *, edge); extern tree loop_niter_by_eval (struct loop *, edge);
extern tree find_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 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 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 max_stmt_executions_int (struct loop *);
extern HOST_WIDE_INT estimated_stmt_executions_int (struct loop *); extern HOST_WIDE_INT estimated_stmt_executions_int (struct loop *);
extern bool max_stmt_executions (struct loop *, double_int *); extern bool max_stmt_executions (struct loop *, double_int *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment