re PR gcov-profile/24487 (Basic block frequencies inaccurate)

PR profile/24487
	* predict.c (predict_loops): Do not estimate more than
	MAX_PRED_LOOP_ITERATIONS in PRED_LOOP_ITERATIONS heuristic.
	* predict.def (MAX_PRED_LOOP_ITERATIONS): Define.

From-SVN: r106276
This commit is contained in:
Jan Hubicka 2005-10-31 15:48:57 +01:00 committed by Jan Hubicka
parent 52f661769d
commit f372b26ff8
3 changed files with 27 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2005-10-31 Jan Hubicka <jh@suse.cz>
PR profile/24487
* predict.c (predict_loops): Do not estimate more than
MAX_PRED_LOOP_ITERATIONS in PRED_LOOP_ITERATIONS heuristic.
* predict.def (MAX_PRED_LOOP_ITERATIONS): Define.
2005-10-31 Andrew MacLeod <amacleod@redhat.com>
PR tree-optimization/19097

View File

@ -624,6 +624,8 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
niter = desc.niter + 1;
if (niter == 0) /* We might overflow here. */
niter = desc.niter;
if (niter > MAX_PRED_LOOP_ITERATIONS)
niter = MAX_PRED_LOOP_ITERATIONS;
prob = (REG_BR_PROB_BASE
- (REG_BR_PROB_BASE + niter /2) / niter);
@ -654,13 +656,16 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
if (host_integerp (niter, 1)
&& tree_int_cst_lt (niter,
build_int_cstu (NULL_TREE,
REG_BR_PROB_BASE - 1)))
MAX_PRED_LOOP_ITERATIONS - 1)))
{
HOST_WIDE_INT nitercst = tree_low_cst (niter, 1) + 1;
probability = (REG_BR_PROB_BASE + nitercst / 2) / nitercst;
probability = ((REG_BR_PROB_BASE + nitercst / 2)
/ nitercst);
}
else
probability = 1;
probability = ((REG_BR_PROB_BASE
+ MAX_PRED_LOOP_ITERATIONS / 2)
/ MAX_PRED_LOOP_ITERATIONS);
predict_edge (exits[j], PRED_LOOP_ITERATIONS, probability);
}

View File

@ -58,6 +58,18 @@ DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS,
DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS,
PRED_FLAG_FIRST_MATCH)
/* For guessed profiles, the loops having unknown number of iterations
are predicted to iterate relatively few (10) times at average.
For functions containing one loop with large known number of iterations
and other loops having unbounded loops we would end up predicting all
the other loops cold that is not usually the case. So we need to artifically
flatten the profile.
We need to cut the maximal predicted iterations to large enought iterations
so the loop appears important, but safely within HOT_BB_COUNT_FRACTION
range. */
#define MAX_PRED_LOOP_ITERATIONS 100
/* Hints dropped by user via __builtin_expect feature. */
DEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY,
PRED_FLAG_FIRST_MATCH)