diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2017-07-16 18:10:58 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2017-07-16 16:10:58 +0000 |
commit | 5fa396ad6cd48bc44e6754096fe71febc2a77983 (patch) | |
tree | 8b2c0f4ba184b9d1af37e1f345be3b518d3f6101 /gcc/predict.c | |
parent | 519087cf749bd002784f09f0ca6f74215fbf5bbc (diff) | |
download | gcc-5fa396ad6cd48bc44e6754096fe71febc2a77983.zip gcc-5fa396ad6cd48bc44e6754096fe71febc2a77983.tar.gz gcc-5fa396ad6cd48bc44e6754096fe71febc2a77983.tar.bz2 |
profile-count.h (profile_probability::from_reg_br_prob_note, [...]): New functions.
* profile-count.h (profile_probability::from_reg_br_prob_note,
profile_probability::to_reg_br_prob_note): New functions.
* doc/rtl.texi (REG_BR_PROB_NOTE): Update documentation.
* reg-notes.h (REG_BR_PROB, REG_BR_PRED): Update docs.
* predict.c (probability_reliable_p): Update.
(edge_probability_reliable_p): Update.
(br_prob_note_reliable_p): Update.
(invert_br_probabilities): Update.
(add_reg_br_prob_note): New function.
(combine_predictions_for_insn): Update.
* asan.c (asan_clear_shadow): Update.
* cfgbuild.c (compute_outgoing_frequencies): Update.
* cfgrtl.c (force_nonfallthru_and_redirect): Update.
(update_br_prob_note): Update.
(rtl_verify_edges): Update.
(purge_dead_edges): Update.
(fixup_reorder_chain): Update.
* emit-rtl.c (try_split): Update.
* ifcvt.c (cond_exec_process_insns): Update.
(cond_exec_process_if_block): Update.
(dead_or_predicable): Update.
* internal-fn.c (expand_addsub_overflow): Update.
(expand_neg_overflow): Update.
(expand_mul_overflow): Update.
* loop-doloop.c (doloop_modify): Update.
* loop-unroll.c (compare_and_jump_seq): Update.
* optabs.c (emit_cmp_and_jump_insn_1): Update.
* predict.h: Update.
* reorg.c (mostly_true_jump): Update.
* rtl.h: Update.
* config/aarch64/aarch64.c (aarch64_emit_unlikely_jump): Update.
* config/alpha/alpha.c (emit_unlikely_jump): Update.
* config/arc/arc.c: (emit_unlikely_jump): Update.
* config/arm/arm.c: (emit_unlikely_jump): Update.
* config/bfin/bfin.c (cbranch_predicted_taken_p): Update.
* config/frv/frv.c (frv_print_operand_jump_hint): Update.
* config/i386/i386.c (ix86_expand_split_stack_prologue): Update.
(ix86_print_operand): Update.
(ix86_split_fp_branch): Update.
(predict_jump): Update.
* config/ia64/ia64.c (ia64_print_operand): Update.
* config/mmix/mmix.c (mmix_print_operand): Update.
* config/powerpcspe/powerpcspe.c (output_cbranch): Update.
(rs6000_expand_split_stack_prologue): Update.
* config/rs6000/rs6000.c: Update.
* config/s390/s390.c (s390_expand_vec_strlen): Update.
(s390_expand_vec_movstr): Update.
(s390_expand_cs_tdsi): Update.
(s390_expand_split_stack_prologue): Update.
* config/sh/sh.c (sh_print_operand): Update.
(expand_cbranchsi4): Update.
(expand_cbranchdi4): Update.
* config/sparc/sparc.c (output_v9branch): Update.
* config/spu/spu.c (get_branch_target): Update.
(ea_load_store_inline): Update.
* config/tilegx/tilegx.c (cbranch_predicted_p): Update.
* config/tilepro/tilepro.c: Update.
* gcc.dg/predict-8.c: Update.
From-SVN: r250239
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 57 |
1 files changed, 22 insertions, 35 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index 2a7dbfa..310d9b0 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -513,35 +513,11 @@ edge_predicted_by_p (edge e, enum br_predictor predictor, bool taken) return false; } -/* Return true when the probability of edge is reliable. - - The profile guessing code is good at predicting branch outcome (ie. - taken/not taken), that is predicted right slightly over 75% of time. - It is however notoriously poor on predicting the probability itself. - In general the profile appear a lot flatter (with probabilities closer - to 50%) than the reality so it is bad idea to use it to drive optimization - such as those disabling dynamic branch prediction for well predictable - branches. - - There are two exceptions - edges leading to noreturn edges and edges - predicted by number of iterations heuristics are predicted well. This macro - should be able to distinguish those, but at the moment it simply check for - noreturn heuristic that is only one giving probability over 99% or bellow - 1%. In future we might want to propagate reliability information across the - CFG if we find this information useful on multiple places. */ -static bool -probability_reliable_p (int prob) -{ - return (profile_status_for_fn (cfun) == PROFILE_READ - || (profile_status_for_fn (cfun) == PROFILE_GUESSED - && (prob <= HITRATE (1) || prob >= HITRATE (99)))); -} - /* Same predicate as above, working on edges. */ bool edge_probability_reliable_p (const_edge e) { - return e->probability.reliable_p (); + return e->probability.probably_reliable_p (); } /* Same predicate as edge_probability_reliable_p, working on notes. */ @@ -549,7 +525,8 @@ bool br_prob_note_reliable_p (const_rtx note) { gcc_assert (REG_NOTE_KIND (note) == REG_BR_PROB); - return probability_reliable_p (XINT (note, 0)); + return profile_probability::from_reg_br_prob_note + (XINT (note, 0)).probably_reliable_p (); } static void @@ -723,7 +700,8 @@ invert_br_probabilities (rtx insn) for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) if (REG_NOTE_KIND (note) == REG_BR_PROB) - XINT (note, 0) = REG_BR_PROB_BASE - XINT (note, 0); + XINT (note, 0) = profile_probability::from_reg_br_prob_note + (XINT (note, 0)).invert ().to_reg_br_prob_note (); else if (REG_NOTE_KIND (note) == REG_BR_PRED) XEXP (XEXP (note, 0), 1) = GEN_INT (REG_BR_PROB_BASE - INTVAL (XEXP (XEXP (note, 0), 1))); @@ -870,6 +848,15 @@ set_even_probabilities (basic_block bb, e->probability = profile_probability::never (); } +/* Add REG_BR_PROB note to JUMP with PROB. */ + +void +add_reg_br_prob_note (rtx_insn *jump, profile_probability prob) +{ + gcc_checking_assert (JUMP_P (jump) && !find_reg_note (jump, REG_BR_PROB, 0)); + add_int_reg_note (jump, REG_BR_PROB, prob.to_reg_br_prob_note ()); +} + /* Combine all REG_BR_PRED notes into single probability and attach REG_BR_PROB note if not already present. Remove now useless REG_BR_PRED notes. */ @@ -968,26 +955,26 @@ combine_predictions_for_insn (rtx_insn *insn, basic_block bb) if (!prob_note) { - add_int_reg_note (insn, REG_BR_PROB, combined_probability); + profile_probability p + = profile_probability::from_reg_br_prob_base (combined_probability); + add_reg_br_prob_note (insn, p); /* Save the prediction into CFG in case we are seeing non-degenerated conditional jump. */ if (!single_succ_p (bb)) { - BRANCH_EDGE (bb)->probability - = profile_probability::from_reg_br_prob_base (combined_probability); + BRANCH_EDGE (bb)->probability = p; FALLTHRU_EDGE (bb)->probability = BRANCH_EDGE (bb)->probability.invert (); } } else if (!single_succ_p (bb)) { - int prob = XINT (prob_note, 0); + profile_probability prob = profile_probability::from_reg_br_prob_note + (XINT (prob_note, 0)); - BRANCH_EDGE (bb)->probability - = profile_probability::from_reg_br_prob_base (prob); - FALLTHRU_EDGE (bb)->probability - = BRANCH_EDGE (bb)->probability.invert (); + BRANCH_EDGE (bb)->probability = prob; + FALLTHRU_EDGE (bb)->probability = prob.invert (); } else single_succ_edge (bb)->probability = profile_probability::always (); |