diff options
author | Jan Hubicka <jh@suse.cz> | 2005-10-31 15:48:57 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2005-10-31 14:48:57 +0000 |
commit | f372b26ff875096812299e386ab15e6afbea8de3 (patch) | |
tree | ccb62239319136a6317c794f1949a20d9bf8f1af /gcc/predict.c | |
parent | 52f661769db6a829a8537f1b8884646c99c5da5a (diff) | |
download | gcc-f372b26ff875096812299e386ab15e6afbea8de3.zip gcc-f372b26ff875096812299e386ab15e6afbea8de3.tar.gz gcc-f372b26ff875096812299e386ab15e6afbea8de3.tar.bz2 |
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
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 11 |
1 files changed, 8 insertions, 3 deletions
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); } |