This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Introduce __builtin_expect_with_probability (PR target/83610).
> gcc/ChangeLog:
>
> 2018-08-09 Martin Liska <mliska@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 <mliska@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