Skip to content

Commit

Permalink
PR profile/24487
Browse files Browse the repository at this point in the history
	* 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
  • Loading branch information
hubicka committed Oct 31, 2005
1 parent d2acc29 commit d5d4ea6
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
7 changes: 7 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2005-10-31 Jan Hubicka <[email protected]>

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 <[email protected]>

PR tree-optimization/19097
Expand Down
11 changes: 8 additions & 3 deletions gcc/predict.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down
12 changes: 12 additions & 0 deletions gcc/predict.def
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit d5d4ea6

Please sign in to comment.