> 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

Reply via email to