Commit aade5c72 by Jan Hubicka Committed by Jan Hubicka

profile.c: Include cfgloop.h.


	* profile.c: Include cfgloop.h.
	(branch_prob): Compute estimated number of iterations.
	* tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop): Do not
	recompute estimate number of iterations from profile.

From-SVN: r237305
parent 1f24fd3e
2016-06-10 Jan Hubicka <hubicka@ucw.cz>
* profile.c: Include cfgloop.h.
(branch_prob): Compute estimated number of iterations.
* tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop): Do not
recompute estimate number of iterations from profile.
2016-06-10 Bernd Edlinger <bernd.edlinger@hotmail.de> 2016-06-10 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR inline-asm/68843 PR inline-asm/68843
......
...@@ -63,6 +63,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -63,6 +63,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimple-iterator.h" #include "gimple-iterator.h"
#include "tree-cfg.h" #include "tree-cfg.h"
#include "dumpfile.h" #include "dumpfile.h"
#include "cfgloop.h"
#include "profile.h" #include "profile.h"
...@@ -1329,9 +1330,21 @@ branch_prob (void) ...@@ -1329,9 +1330,21 @@ branch_prob (void)
coverage_end_function (lineno_checksum, cfg_checksum); coverage_end_function (lineno_checksum, cfg_checksum);
if (flag_branch_probabilities && profile_info) if (flag_branch_probabilities && profile_info)
{ {
struct loop *loop;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
report_predictor_hitrates (); report_predictor_hitrates ();
profile_status_for_fn (cfun) = PROFILE_READ; profile_status_for_fn (cfun) = PROFILE_READ;
/* At this moment we have precise loop iteration count estimates.
Record them to loop structure before the profile gets out of date. */
FOR_EACH_LOOP (loop, 0)
if (loop->header->count)
{
gcov_type nit = expected_loop_iterations_unbounded (loop);
widest_int bound = gcov_type_to_wide_int (nit);
loop->any_estimate = false;
record_niter_bound (loop, bound, true, false);
}
compute_function_frequency (); compute_function_frequency ();
} }
} }
......
...@@ -3721,8 +3721,26 @@ estimate_numbers_of_iterations_loop (struct loop *loop) ...@@ -3721,8 +3721,26 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
return; return;
loop->estimate_state = EST_AVAILABLE; loop->estimate_state = EST_AVAILABLE;
/* Force estimate compuation but leave any existing upper bound in place. */
loop->any_estimate = false; /* If we have a measured profile, use it to estimate the number of
iterations. Normally this is recorded by branch_prob right after
reading the profile. In case we however found a new loop, record the
information here.
Explicitly check for profile status so we do not report
wrong prediction hitrates for guessed loop iterations heuristics.
Do not recompute already recorded bounds - we ought to be better on
updating iteration bounds than updating profile in general and thus
recomputing iteration bounds later in the compilation process will just
introduce random roundoff errors. */
if (!loop->any_estimate
&& loop->header->count != 0
&& profile_status_for_fn (cfun) >= PROFILE_READ)
{
gcov_type nit = expected_loop_iterations_unbounded (loop);
bound = gcov_type_to_wide_int (nit);
record_niter_bound (loop, bound, true, false);
}
/* Ensure that loop->nb_iterations is computed if possible. If it turns out /* Ensure that loop->nb_iterations is computed if possible. If it turns out
to be constant, we avoid undefined behavior implied bounds and instead to be constant, we avoid undefined behavior implied bounds and instead
...@@ -3756,17 +3774,6 @@ estimate_numbers_of_iterations_loop (struct loop *loop) ...@@ -3756,17 +3774,6 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
maybe_lower_iteration_bound (loop); maybe_lower_iteration_bound (loop);
/* If we have a measured profile, use it to estimate the number of
iterations. Explicitly check for profile status so we do not report
wrong prediction hitrates for guessed loop iterations heuristics. */
if (loop->header->count != 0
&& profile_status_for_fn (cfun) >= PROFILE_READ)
{
gcov_type nit = expected_loop_iterations_unbounded (loop);
bound = gcov_type_to_wide_int (nit);
record_niter_bound (loop, bound, true, false);
}
/* If we know the exact number of iterations of this loop, try to /* If we know the exact number of iterations of this loop, try to
not break code with undefined behavior by not recording smaller not break code with undefined behavior by not recording smaller
maximum number of iterations. */ maximum number of iterations. */
......
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