This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Minor fixes to niter and ivcanon
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 5 Nov 2012 12:25:21 +0100
- Subject: Minor fixes to niter and ivcanon
Hi,
while proofreading niter and ivcanon code I noticed that we give up on exits in inner
loops. I discussed this with Zdenek and it was done only because at the time
it was implemented we did nothing useful on outer loops. We can now unloop them, so
I removed the restriction.
I also noticed that not_executed_last_iteration is initialized tice and we can record
realistic upper bound in ivcanon for loop with only one likely exit.
Bootstrapped/regtested x86_64-linux, comitted as obvious.
* tree-ssa-loop-niter.c (find_loop_niter): Remove just_once_each_iteration_p.
(maybe_lower_iteration_bound): Initialize not_executed_last_iteration to NULL
* tree-ssa-loop-ivcanon.c (canonicalize_loop_induction_variables): Skip
just_once_each_iteration_p; record estimated bound when loop has only one
likely exit; test just_once_each_iteration_p before IV canon itself.
Index: tree-ssa-loop-niter.c
===================================================================
--- tree-ssa-loop-niter.c (revision 193155)
+++ tree-ssa-loop-niter.c (working copy)
@@ -1941,9 +1941,6 @@ find_loop_niter (struct loop *loop, edge
*exit = NULL;
FOR_EACH_VEC_ELT (edge, exits, i, ex)
{
- if (!just_once_each_iteration_p (loop, ex->src))
- continue;
-
if (!number_of_iterations_exit (loop, ex, &desc, false))
continue;
@@ -3186,7 +3183,7 @@ discover_iteration_bound_by_body_walk (s
static void
maybe_lower_iteration_bound (struct loop *loop)
{
- pointer_set_t *not_executed_last_iteration = pointer_set_create ();
+ pointer_set_t *not_executed_last_iteration = NULL;
struct nb_iter_bound *elt;
bool found_exit = false;
VEC (basic_block, heap) *queue = NULL;
Index: tree-ssa-loop-ivcanon.c
===================================================================
--- tree-ssa-loop-ivcanon.c (revision 193155)
+++ tree-ssa-loop-ivcanon.c (working copy)
@@ -760,11 +760,7 @@ canonicalize_loop_induction_variables (s
niter = number_of_latch_executions (loop);
if (TREE_CODE (niter) == INTEGER_CST)
- {
- exit = single_exit (loop);
- if (!just_once_each_iteration_p (loop, exit->src))
- return false;
- }
+ exit = single_exit (loop);
else
{
/* If the loop has more than one exit, try checking all of them
@@ -785,7 +781,10 @@ canonicalize_loop_induction_variables (s
/* We work exceptionally hard here to estimate the bound
by find_loop_niter_by_eval. Be sure to keep it for future. */
if (niter && TREE_CODE (niter) == INTEGER_CST)
- record_niter_bound (loop, tree_to_double_int (niter), false, true);
+ {
+ record_niter_bound (loop, tree_to_double_int (niter),
+ exit == single_likely_exit (loop), true);
+ }
/* Force re-computation of loop bounds so we can remove redundant exits. */
maxiter = max_loop_iterations_int (loop);
@@ -813,7 +812,8 @@ canonicalize_loop_induction_variables (s
return true;
if (create_iv
- && niter && !chrec_contains_undetermined (niter))
+ && niter && !chrec_contains_undetermined (niter)
+ && exit && just_once_each_iteration_p (loop, exit->src))
create_canonical_iv (loop, exit, niter);
return modified;