here is the new patch. Note that the hitrate won't change by this patch for the case of while (__builtin_expect (exp, 0))
Index: predict.c =================================================================== --- predict.c (revision 203462) +++ predict.c (working copy) @@ -1951,11 +1951,42 @@ tree_predict_by_opcode (basic_block bb) if (val) { int percent = PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY); + int hitrate; gcc_assert (percent >= 0 && percent <= 100); if (integer_zerop (val)) - percent = 100 - percent; - predict_edge (then_edge, PRED_BUILTIN_EXPECT, HITRATE (percent)); + hitrate = HITRATE (100 - percent); + else + { + /* This handles the cases like + while (__builtin_expect (exp, 1)) { ... } + W/o builtin_expect, the default HITRATE is 91%. + It does not make sense to estimate a lower probability of 90% + (current default for builtin_expect) with the annotation. + So here, we bump the probability by a small amount. */ + void **preds = pointer_map_contains (bb_predictions, bb); + + hitrate = HITRATE (percent); + if (preds) + { + struct edge_prediction *pred; + int exit_hitrate = predictor_info [(int) PRED_LOOP_EXIT].hitrate; + + for (pred = (struct edge_prediction *) *preds; pred; + pred = pred->ep_next) + { + if (pred->ep_predictor == PRED_LOOP_EXIT + && exit_hitrate > hitrate) + { + hitrate = exit_hitrate + HITRATE (4); + if (hitrate > REG_BR_PROB_BASE) + hitrate = REG_BR_PROB_BASE; + break; + } + } + } + } + predict_edge (then_edge, PRED_BUILTIN_EXPECT, hitrate); } /* Try "pointer heuristic." A comparison ptr == 0 is predicted as false. On Fri, Oct 11, 2013 at 2:45 PM, Rong Xu <x...@google.com> wrote: > ok. that makes sense. > > > On Fri, Oct 11, 2013 at 2:41 PM, Xinliang David Li <davi...@google.com> wrote: >> Should it be max + some_delta then? >> >> David >> >> On Fri, Oct 11, 2013 at 2:32 PM, Rong Xu <x...@google.com> wrote: >>> I want to differentiate the cases w/o and w/ builtin. >>> If I take the max, they will be the same (91%). >>> >>> -Rong >>> >>> On Fri, Oct 11, 2013 at 2:26 PM, Xinliang David Li <davi...@google.com> >>> wrote: >>>> Why this 'percent += 4' instead of taking the max? >>>> >>>> David >>>> >>>> On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu <x...@google.com> wrote: >>>>> The trunk version of this patch is submitted for review. >>>>> >>>>> David: can we have this patch for google/gcc-4_8 branch first? >>>>> It tested with regression and google internal benchmarks. >>>>> >>>>> Thanks, >>>>> >>>>> -Rong