From d5d4ea6fac084ac36524c5b00f4c5d8973d612c7 Mon Sep 17 00:00:00 2001 From: hubicka Date: Mon, 31 Oct 2005 14:48:57 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106276 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/predict.c | 11 ++++++++--- gcc/predict.def | 12 ++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2f77e79..aed0155 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-10-31 Jan Hubicka + + 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 PR tree-optimization/19097 diff --git a/gcc/predict.c b/gcc/predict.c index 412af86..e2f7262 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -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); } diff --git a/gcc/predict.def b/gcc/predict.def index 997f4d2..fefe2ed 100644 --- a/gcc/predict.def +++ b/gcc/predict.def @@ -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) -- 2.7.4