Commit 79ebd55c by Sebastian Pop Committed by Sebastian Pop

tree-data-ref.c (compute_estimated_nb_iterations, [...]): Fixed to use…

tree-data-ref.c (compute_estimated_nb_iterations, [...]): Fixed to use chrec_contains_undetermined to test the values of...

	* tree-data-ref.c (compute_estimated_nb_iterations,
	analyze_array_indexes, compute_overlap_steps_for_affine_1_2,
	analyze_subscript_affine_affine, find_data_references_in_loop):
	Fixed to use chrec_contains_undetermined to test the values of
	loop->estimated_nb_iterations.
	* tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop):
	Compute the estimation only when loop->estimated_nb_iterations
	has not yet been initialized.
	(convert_step_widening, scev_probably_wraps_p): Add a call to
	estimate_numbers_of_iterations_loop.
	* tree-vrp.c (execute_vrp): Don't call estimate_numbers_of_iterations.

From-SVN: r100749
parent 216448c7
2005-06-08 Sebastian Pop <pop@cri.ensmp.fr>
* tree-data-ref.c (compute_estimated_nb_iterations,
analyze_array_indexes, compute_overlap_steps_for_affine_1_2,
analyze_subscript_affine_affine, find_data_references_in_loop):
Fixed to use chrec_contains_undetermined to test the values of
loop->estimated_nb_iterations.
* tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop):
Compute the estimation only when loop->estimated_nb_iterations
has not yet been initialized.
(convert_step_widening, scev_probably_wraps_p): Add a call to
estimate_numbers_of_iterations_loop.
* tree-vrp.c (execute_vrp): Don't call estimate_numbers_of_iterations.
2005-06-08 Eric Botcazou <ebotcazou@libertysurf.fr> 2005-06-08 Eric Botcazou <ebotcazou@libertysurf.fr>
PR debug/21946 PR debug/21946
......
...@@ -447,32 +447,21 @@ dump_ddrs (FILE *file, varray_type ddrs) ...@@ -447,32 +447,21 @@ dump_ddrs (FILE *file, varray_type ddrs)
/* Compute the lowest iteration bound for LOOP. It is an /* Initialize LOOP->ESTIMATED_NB_ITERATIONS with the lowest safe
INTEGER_CST. */ approximation of the number of iterations for LOOP. */
static void static void
compute_estimated_nb_iterations (struct loop *loop) compute_estimated_nb_iterations (struct loop *loop)
{ {
tree estimation; struct nb_iter_bound *bound;
struct nb_iter_bound *bound, *next;
for (bound = loop->bounds; bound; bound = bound->next)
for (bound = loop->bounds; bound; bound = next) if (TREE_CODE (bound->bound) == INTEGER_CST
{ /* Update only when there is no previous estimation. */
next = bound->next; && (chrec_contains_undetermined (loop->estimated_nb_iterations)
estimation = bound->bound; /* Or when the current estimation is smaller. */
|| tree_int_cst_lt (bound->bound, loop->estimated_nb_iterations)))
if (TREE_CODE (estimation) != INTEGER_CST) loop->estimated_nb_iterations = bound->bound;
continue;
if (loop->estimated_nb_iterations)
{
/* Update only if estimation is smaller. */
if (tree_int_cst_lt (estimation, loop->estimated_nb_iterations))
loop->estimated_nb_iterations = estimation;
}
else
loop->estimated_nb_iterations = estimation;
}
} }
/* Estimate the number of iterations from the size of the data and the /* Estimate the number of iterations from the size of the data and the
...@@ -538,7 +527,7 @@ analyze_array_indexes (struct loop *loop, ...@@ -538,7 +527,7 @@ analyze_array_indexes (struct loop *loop,
access_fn = instantiate_parameters access_fn = instantiate_parameters
(loop, analyze_scalar_evolution (loop, opnd1)); (loop, analyze_scalar_evolution (loop, opnd1));
if (loop->estimated_nb_iterations == NULL_TREE) if (chrec_contains_undetermined (loop->estimated_nb_iterations))
estimate_niter_from_size_of_data (loop, opnd0, access_fn, stmt); estimate_niter_from_size_of_data (loop, opnd0, access_fn, stmt);
VEC_safe_push (tree, heap, *access_fns, access_fn); VEC_safe_push (tree, heap, *access_fns, access_fn);
...@@ -1129,8 +1118,12 @@ compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b, ...@@ -1129,8 +1118,12 @@ compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b,
numiter_z = current_loops->parray[CHREC_VARIABLE (chrec_b)] numiter_z = current_loops->parray[CHREC_VARIABLE (chrec_b)]
->estimated_nb_iterations; ->estimated_nb_iterations;
if (numiter_x == NULL_TREE || numiter_y == NULL_TREE if (chrec_contains_undetermined (numiter_x)
|| numiter_z == NULL_TREE) || chrec_contains_undetermined (numiter_y)
|| chrec_contains_undetermined (numiter_z)
|| TREE_CODE (numiter_x) != INTEGER_CST
|| TREE_CODE (numiter_y) != INTEGER_CST
|| TREE_CODE (numiter_z) != INTEGER_CST)
{ {
*overlaps_a = chrec_dont_know; *overlaps_a = chrec_dont_know;
*overlaps_b = chrec_dont_know; *overlaps_b = chrec_dont_know;
...@@ -1278,7 +1271,10 @@ analyze_subscript_affine_affine (tree chrec_a, ...@@ -1278,7 +1271,10 @@ analyze_subscript_affine_affine (tree chrec_a,
if (TREE_CODE (numiter_b) != INTEGER_CST) if (TREE_CODE (numiter_b) != INTEGER_CST)
numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)] numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)]
->estimated_nb_iterations; ->estimated_nb_iterations;
if (numiter_a == NULL_TREE || numiter_b == NULL_TREE) if (chrec_contains_undetermined (numiter_a)
|| chrec_contains_undetermined (numiter_b)
|| TREE_CODE (numiter_a) != INTEGER_CST
|| TREE_CODE (numiter_b) != INTEGER_CST)
{ {
*overlaps_a = chrec_dont_know; *overlaps_a = chrec_dont_know;
*overlaps_b = chrec_dont_know; *overlaps_b = chrec_dont_know;
...@@ -1379,7 +1375,10 @@ analyze_subscript_affine_affine (tree chrec_a, ...@@ -1379,7 +1375,10 @@ analyze_subscript_affine_affine (tree chrec_a,
if (TREE_CODE (numiter_b) != INTEGER_CST) if (TREE_CODE (numiter_b) != INTEGER_CST)
numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)] numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)]
->estimated_nb_iterations; ->estimated_nb_iterations;
if (numiter_a == NULL_TREE || numiter_b == NULL_TREE) if (chrec_contains_undetermined (numiter_a)
|| chrec_contains_undetermined (numiter_b)
|| TREE_CODE (numiter_a) != INTEGER_CST
|| TREE_CODE (numiter_b) != INTEGER_CST)
{ {
*overlaps_a = chrec_dont_know; *overlaps_a = chrec_dont_know;
*overlaps_b = chrec_dont_know; *overlaps_b = chrec_dont_know;
...@@ -2344,11 +2343,11 @@ find_data_references_in_loop (struct loop *loop, varray_type *datarefs) ...@@ -2344,11 +2343,11 @@ find_data_references_in_loop (struct loop *loop, varray_type *datarefs)
/* When there are no defs in the loop, the loop is parallel. */ /* When there are no defs in the loop, the loop is parallel. */
if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_DEFS)) if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_DEFS))
bb->loop_father->parallel_p = false; loop->parallel_p = false;
} }
if (bb->loop_father->estimated_nb_iterations == NULL_TREE) if (chrec_contains_undetermined (loop->estimated_nb_iterations))
compute_estimated_nb_iterations (bb->loop_father); compute_estimated_nb_iterations (loop);
} }
free (bbs); free (bbs);
......
...@@ -1348,6 +1348,15 @@ estimate_numbers_of_iterations_loop (struct loop *loop) ...@@ -1348,6 +1348,15 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
unsigned i, n_exits; unsigned i, n_exits;
struct tree_niter_desc niter_desc; struct tree_niter_desc niter_desc;
/* Give up if we already have tried to compute an estimation. */
if (loop->estimated_nb_iterations == chrec_dont_know
/* Or when we already have an estimation. */
|| (loop->estimated_nb_iterations != NULL_TREE
&& TREE_CODE (loop->estimated_nb_iterations) == INTEGER_CST))
return;
else
loop->estimated_nb_iterations = chrec_dont_know;
exits = get_loop_exit_edges (loop, &n_exits); exits = get_loop_exit_edges (loop, &n_exits);
for (i = 0; i < n_exits; i++) for (i = 0; i < n_exits; i++)
{ {
...@@ -1368,7 +1377,7 @@ estimate_numbers_of_iterations_loop (struct loop *loop) ...@@ -1368,7 +1377,7 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
free (exits); free (exits);
/* Analyzes the bounds of arrays accessed in the loop. */ /* Analyzes the bounds of arrays accessed in the loop. */
if (loop->estimated_nb_iterations == NULL_TREE) if (chrec_contains_undetermined (loop->estimated_nb_iterations))
{ {
varray_type datarefs; varray_type datarefs;
VARRAY_GENERIC_PTR_INIT (datarefs, 3, "datarefs"); VARRAY_GENERIC_PTR_INIT (datarefs, 3, "datarefs");
...@@ -1581,6 +1590,7 @@ convert_step_widening (struct loop *loop, tree new_type, tree base, tree step, ...@@ -1581,6 +1590,7 @@ convert_step_widening (struct loop *loop, tree new_type, tree base, tree step,
valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type, valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type,
delta, step_abs); delta, step_abs);
estimate_numbers_of_iterations_loop (loop);
for (bound = loop->bounds; bound; bound = bound->next) for (bound = loop->bounds; bound; bound = bound->next)
if (proved_non_wrapping_p (at_stmt, bound, new_type, valid_niter)) if (proved_non_wrapping_p (at_stmt, bound, new_type, valid_niter))
return step_in_new_type; return step_in_new_type;
...@@ -1649,6 +1659,7 @@ scev_probably_wraps_p (tree type, tree base, tree step, ...@@ -1649,6 +1659,7 @@ scev_probably_wraps_p (tree type, tree base, tree step,
step_abs = fold_convert (unsigned_type, step_abs); step_abs = fold_convert (unsigned_type, step_abs);
valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type, delta, step_abs); valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type, delta, step_abs);
estimate_numbers_of_iterations_loop (loop);
for (bound = loop->bounds; bound; bound = bound->next) for (bound = loop->bounds; bound; bound = bound->next)
if (proved_non_wrapping_p (at_stmt, bound, type, valid_niter)) if (proved_non_wrapping_p (at_stmt, bound, type, valid_niter))
return false; return false;
......
...@@ -3509,10 +3509,7 @@ execute_vrp (void) ...@@ -3509,10 +3509,7 @@ execute_vrp (void)
cfg_loops = loop_optimizer_init (NULL); cfg_loops = loop_optimizer_init (NULL);
if (cfg_loops) if (cfg_loops)
{ scev_initialize (cfg_loops);
scev_initialize (cfg_loops);
estimate_numbers_of_iterations (cfg_loops);
}
vrp_initialize (); vrp_initialize ();
ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node); ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
......
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