Hi, the attached patches avoids use of REG_BR_PROB_BASE based fixpoint artihmetics where it is easy to do.
Bootstrapped/regtested x86_64-linux, comitted. Honza
* asan.c (create_cond_insert_point): Avoid use of REG_BR_PROB_BASE fixpoint arithmetics. Index: asan.c =================================================================== --- asan.c (revision 250239) +++ asan.c (working copy) @@ -1798,12 +1798,11 @@ create_cond_insert_point (gimple_stmt_it /* Set up the newly created 'then block'. */ e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE); - int fallthrough_probability + profile_probability fallthrough_probability = then_more_likely_p - ? PROB_VERY_UNLIKELY - : PROB_ALWAYS - PROB_VERY_UNLIKELY; - e->probability = profile_probability::from_reg_br_prob_base - (PROB_ALWAYS - fallthrough_probability); + ? profile_probability::very_unlikely () + : profile_probability::very_likely (); + e->probability = fallthrough_probability.invert (); if (create_then_fallthru_edge) make_single_succ_edge (then_bb, fallthru_bb, EDGE_FALLTHRU); @@ -1811,8 +1810,7 @@ create_cond_insert_point (gimple_stmt_it e = find_edge (cond_bb, fallthru_bb); e->flags = EDGE_FALSE_VALUE; e->count = cond_bb->count; - e->probability - = profile_probability::from_reg_br_prob_base (fallthrough_probability); + e->probability = fallthrough_probability; /* Update dominance info for the newly created then_bb; note that fallthru_bb's dominance info has already been updated by
2017-07-16 Jan Hubicka <hubi...@ucw.cz> * tree-ssa-loop-unswitch.c (hoist_guard): Avoid use of REG_BR_PROB_BASE fixpoint arithmetics. Index: tree-ssa-loop-unswitch.c =================================================================== --- tree-ssa-loop-unswitch.c (revision 250239) +++ tree-ssa-loop-unswitch.c (working copy) @@ -897,9 +897,7 @@ hoist_guard (struct loop *loop, edge gua if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, " %i", bb->index); if (e->probability.initialized_p ()) - scale_bbs_frequencies_int (&bb, 1, - e->probability.to_reg_br_prob_base (), - REG_BR_PROB_BASE); + scale_bbs_frequencies (&bb, 1, e->probability); } }
* cfgloopmanip.c (scale_loop_profile): Avoid use of REG_BR_PROB_BASE fixpoint arithmetics. Index: cfgloopmanip.c =================================================================== --- cfgloopmanip.c (revision 250241) +++ cfgloopmanip.c (working copy) @@ -546,8 +546,8 @@ scale_loop_profile (struct loop *loop, p /* Probability of exit must be 1/iterations. */ freq_delta = EDGE_FREQUENCY (e); - e->probability = profile_probability::from_reg_br_prob_base - (REG_BR_PROB_BASE / iteration_bound); + e->probability = profile_probability::always () + .apply_scale (1, iteration_bound); other_e->probability = e->probability.invert (); freq_delta -= EDGE_FREQUENCY (e);
* cgraph.c (cgraph_edge::redirect_call_stmt_to_caller): Cleanup. Index: cgraph.c =================================================================== --- cgraph.c (revision 250241) +++ cgraph.c (working copy) @@ -1315,19 +1315,19 @@ cgraph_edge::redirect_call_stmt_to_calle } gcc_assert (e2->speculative); push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl)); + + profile_probability prob = e->count.probability_in (e->count + + e2->count); + if (prob.initialized_p ()) + ; + else if (e->frequency || e2->frequency) + prob = profile_probability::probability_in_gcov_type + (e->frequency, e->frequency + e2->frequency).guessed (); + else + prob = profile_probability::even (); new_stmt = gimple_ic (e->call_stmt, dyn_cast<cgraph_node *> (ref->referred), - /* FIXME: cleanup. */ - profile_probability::from_reg_br_prob_base ( - e->count > profile_count::zero () - || e2->count > profile_count::zero () - ? e->count.probability_in - (e->count + e2->count).to_reg_br_prob_base () - : e->frequency || e2->frequency - ? RDIV (e->frequency * REG_BR_PROB_BASE, - e->frequency + e2->frequency) - : REG_BR_PROB_BASE / 2), - e->count, e->count + e2->count); + prob, e->count, e->count + e2->count); e->speculative = false; e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt, false);