extern bool get_likely_max_loop_iterations (class loop *loop, widest_int *nit);
extern int bb_loop_depth (const_basic_block);
extern edge single_dom_exit (class loop *);
+extern profile_count loop_count_in (const class loop *loop);
/* Converts VAL to widest_int. */
return ret;
}
+/* Compute how many times loop is entered. */
+
+profile_count
+loop_count_in (const class loop *loop)
+{
+ /* Compute number of invocations of the loop. */
+ profile_count count_in = profile_count::zero ();
+ edge e;
+ edge_iterator ei;
+ bool found_latch = false;
+
+ if (loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES))
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
+ if (!flow_bb_inside_loop_p (loop, e->src))
+ count_in += e->count ();
+ else
+ found_latch = true;
+ else
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
+ if (e->src != loop->latch)
+ count_in += e->count ();
+ else
+ found_latch = true;
+ gcc_checking_assert (found_latch);
+ return count_in;
+}
+
/* Return true if BB profile can be used to determine the expected number of
iterations (that is number of executions of latch edge(s) for each
entry of the loop. If this is the case initialize RET with the number
|| !header_count.nonzero_p ())
return false;
- profile_count count_in = profile_count::zero ();
- edge e;
- edge_iterator ei;
-
- /* For single-latch loops avoid querying dominators. */
- if (loop->latch)
- {
- bool found = false;
- FOR_EACH_EDGE (e, ei, loop->header->preds)
- if (e->src != loop->latch)
- count_in += e->count ();
- else
- found = true;
- /* If latch is not found, loop is inconsistent. */
- gcc_checking_assert (found);
- }
- else
- FOR_EACH_EDGE (e, ei, loop->header->preds)
- if (!dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
- count_in += e->count ();
+ profile_count count_in = loop_count_in (loop);
bool known;
/* Number of iterations is number of executions of latch edge. */
}
}
-/* Compute how many times loop is entered. */
-
-profile_count
-loop_count_in (class loop *loop)
-{
- /* Compute number of invocations of the loop. */
- profile_count count_in = profile_count::zero ();
- edge e;
- edge_iterator ei;
- bool found_latch = false;
-
- if (loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES))
- FOR_EACH_EDGE (e, ei, loop->header->preds)
- if (!flow_bb_inside_loop_p (loop, e->src))
- count_in += e->count ();
- else
- found_latch = true;
- else
- FOR_EACH_EDGE (e, ei, loop->header->preds)
- if (e->src != loop->latch)
- count_in += e->count ();
- else
- found_latch = true;
- gcc_checking_assert (found_latch);
- return count_in;
-}
-
/* Return exit that suitable for update when loop iterations
changed. */
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file,
- ";; guessed iterations of loop %i:%f new upper bound %i:\n",
+ ";; Guessed iterations of loop %i is %f. New upper bound %i.\n",
loop->num,
iterations.to_double (),
(int)iteration_bound);
}
/* See if loop is predicted to iterate too many times. */
- if (iterations <= iteration_bound)
+ if (iterations <= (sreal)iteration_bound)
return;
profile_count count_in = loop_count_in (loop);
/* PR optimization/8599 */
/* { dg-do run } */
-/* { dg-options "-O2 -funroll-loops" } */
+/* { dg-options "-O2 -funroll-loops -fdump-rtl-loop2_unroll-details-blocks" } */
/* { dg-options "-mtune=k6 -O2 -funroll-loops -fdump-rtl-loop2_unroll-details-blocks" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
return 0;
}
/* { dg-final { scan-rtl-dump-not "Invalid sum" "loop2_unroll" } } */
-/* { dg-final { scan-rtl-dump-not "Invalid sum" "loop2_unroll" } } */