> gcc/ChangeLog: > > 2018-08-09 Martin Liska <mli...@suse.cz> > > PR target/83610 > * builtin-types.def (BT_FN_LONG_LONG_LONG_DOUBLE): Add new > function type. > * builtins.c (expand_builtin_expect_with_probability): > New function. > (expand_builtin_expect_with_probability): New function. > (build_builtin_expect_predicate): Add new argumnet probability > for BUILT_IN_EXPECT_WITH_PROBABILITY. > (fold_builtin_expect): > (fold_builtin_2): > (fold_builtin_3): > * builtins.def (BUILT_IN_EXPECT_WITH_PROBABILITY): > * builtins.h (fold_builtin_expect): Set new argument. > * doc/extend.texi: Document __builtin_expect_with_probability. > * doc/invoke.texi: Likewise. > * gimple-fold.c (gimple_fold_call): Pass new argument. > * ipa-fnsummary.c (find_foldable_builtin_expect): Handle > also BUILT_IN_EXPECT_WITH_PROBABILITY. > * predict.c (get_predictor_value): New function. > (expr_expected_value): Add new argument probability. Assume > that predictor and probability are always non-null. > (expr_expected_value_1): Likewise. For __builtin_expect and > __builtin_expect_with_probability set probability. Handle > combination in binary expressions. > (tree_predict_by_opcode): Simplify code by simply calling > get_predictor_value. > (pass_strip_predict_hints::execute): Add handling of > BUILT_IN_EXPECT_WITH_PROBABILITY. > * predict.def (PRED_BUILTIN_EXPECT_WITH_PROBABILITY): Add > new predictor. > * tree.h (DECL_BUILT_IN_P): New function. > > gcc/testsuite/ChangeLog: > > 2018-08-09 Martin Liska <mli...@suse.cz> > > PR target/83610 > * gcc.dg/predict-17.c: New test. > * gcc.dg/predict-18.c: New test. > * gcc.dg/predict-19.c: New test. > --- > gcc/builtin-types.def | 2 + > gcc/builtins.c | 65 ++++++++++--- > gcc/builtins.def | 1 + > gcc/builtins.h | 2 +- > gcc/doc/extend.texi | 9 ++ > gcc/doc/invoke.texi | 3 + > gcc/gimple-fold.c | 3 +- > gcc/ipa-fnsummary.c | 1 + > gcc/predict.c | 154 ++++++++++++++++++++---------- > gcc/predict.def | 5 + > gcc/testsuite/gcc.dg/predict-17.c | 13 +++ > gcc/testsuite/gcc.dg/predict-18.c | 31 ++++++ > gcc/testsuite/gcc.dg/predict-19.c | 13 +++ > gcc/tree.h | 6 ++ > 14 files changed, 244 insertions(+), 64 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/predict-17.c > create mode 100644 gcc/testsuite/gcc.dg/predict-18.c > create mode 100644 gcc/testsuite/gcc.dg/predict-19.c > > + if (TREE_CODE (res) == INTEGER_CST > + && TREE_CODE (op0) == INTEGER_CST > + && TREE_CODE (op1) == INTEGER_CST) > + { > + /* Combine binary predictions. */ > + if (*probability != -1 || probability2 != -1) > + { > + HOST_WIDE_INT p1 = get_predictor_value (*predictor, *probability); > + HOST_WIDE_INT p2 = get_predictor_value (predictor2, probability2); > + *probability = p1 * p2 / REG_BR_PROB_BASE; I guess you want to use RDIV here. Eventually we want to move to profile_probability type everywhere but I guess that can be done later.
OK, thanks! Honza