[PATCH] Introduce __builtin_expect_with_probability (PR target/83610).

Jan Hubicka hubicka@ucw.cz
Thu Aug 9 12:55:00 GMT 2018


> 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



More information about the Gcc-patches mailing list