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
This commit is contained in:
parent
c22df64f91
commit
1ef8889345
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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 *);
|
||||
|
|
Loading…
Reference in New Issue