From c3210c96bc56fec2653206e49c4a2514a8c7535f Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 5 Nov 2018 08:33:30 +0100 Subject: [PATCH] Verify that last argument of __builtin_expect_with_probability is a real cst (PR c/87811). 2018-11-05 Martin Liska PR c/87811 * predict.c (expr_expected_value_1): Verify that last argument is a real constants and emit error. 2018-11-05 Martin Liska PR c/87811 * gcc.dg/pr87811.c: New test. * gcc.dg/pr87811-2.c: Likewise. * gcc.dg/pr87811-3.c: Likewise. 2018-11-05 Martin Liska PR c/87811 * doc/extend.texi: Update constrain about the last argument of __builtin_expect_with_probability. From-SVN: r265785 --- gcc/ChangeLog | 13 +++++++++++++ gcc/doc/extend.texi | 3 ++- gcc/predict.c | 12 ++++++++++++ gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/gcc.dg/pr87811-2.c | 13 +++++++++++++ gcc/testsuite/gcc.dg/pr87811-3.c | 11 +++++++++++ gcc/testsuite/gcc.dg/pr87811.c | 13 +++++++++++++ 7 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr87811-2.c create mode 100644 gcc/testsuite/gcc.dg/pr87811-3.c create mode 100644 gcc/testsuite/gcc.dg/pr87811.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3ef29c5..b163e69 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,18 @@ 2018-11-05 Martin Liska + PR c/87811 + * doc/extend.texi: Update constrain about the last argument + of __builtin_expect_with_probability. + +2018-11-05 Martin Liska + + PR c/87811 + * predict.c (expr_expected_value_1): Verify + that last argument is a real constants and emit + error. + +2018-11-05 Martin Liska + PR gcov-profile/77698 * ipa-profile.c (ipa_profile): Adjust hotness threshold only in LTO mode. diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 924037f..7d14444 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -12046,7 +12046,8 @@ when testing pointer or floating-point values. This function has the same semantics as @code{__builtin_expect}, but the caller provides the expected probability that @var{exp} == @var{c}. The last argument, @var{probability}, is a floating-point value in the -range 0.0 to 1.0, inclusive. +range 0.0 to 1.0, inclusive. The @var{probability} argument must be +a compiler time constant. @end deftypefn @deftypefn {Built-in Function} void __builtin_trap (void) diff --git a/gcc/predict.c b/gcc/predict.c index ab2dc8e..80a8d68 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2467,6 +2467,13 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code, base = build_real_from_int_cst (t, base); tree r = fold_build2_initializer_loc (UNKNOWN_LOCATION, MULT_EXPR, t, prob, base); + if (TREE_CODE (r) != REAL_CST) + { + error_at (gimple_location (def), + "probability argument %qE must be a compile " + "time constant", prob); + return NULL; + } HOST_WIDE_INT probi = real_to_integer (TREE_REAL_CST_PTR (r)); if (probi >= 0 && probi <= REG_BR_PROB_BASE) @@ -2474,6 +2481,11 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code, *predictor = PRED_BUILTIN_EXPECT_WITH_PROBABILITY; *probability = probi; } + else + error_at (gimple_location (def), + "probability argument %qE must be a in the " + "range 0.0 to 1.0", prob); + return gimple_call_arg (def, 1); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8f5bb2a..a02831c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2018-11-05 Martin Liska + PR c/87811 + * gcc.dg/pr87811.c: New test. + * gcc.dg/pr87811-2.c: Likewise. + * gcc.dg/pr87811-3.c: Likewise. + +2018-11-05 Martin Liska + PR gcov-profile/77698 * gcc.dg/tree-prof/pr77698.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr87811-2.c b/gcc/testsuite/gcc.dg/pr87811-2.c new file mode 100644 index 0000000..aa30ddf --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr87811-2.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ + +void bar (void); + +void +foo (int i) +{ + if (__builtin_expect_with_probability (i, 0, 2.0f)) /* { dg-error "probability argument .* must be a in the range 0\\\.0 to 1\\\.0" } */ + bar (); +} + +/* { dg-final { scan-tree-dump-not "__builtin_expect_with_probability heuristics of edge" "profile_estimate"} } */ diff --git a/gcc/testsuite/gcc.dg/pr87811-3.c b/gcc/testsuite/gcc.dg/pr87811-3.c new file mode 100644 index 0000000..720d154 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr87811-3.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-profile_estimate" } */ + +void bar (void); + +void +foo (int i) +{ + if (__builtin_expect_with_probability (i, 0, 2.0f)) + bar (); +} diff --git a/gcc/testsuite/gcc.dg/pr87811.c b/gcc/testsuite/gcc.dg/pr87811.c new file mode 100644 index 0000000..9045c8e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr87811.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ + +void bar (void); + +void +foo (int i, double d) +{ + if (__builtin_expect_with_probability (i, 0, d)) /* { dg-error "probability argument .d. must be a compile time constant" } */ + bar (); +} + +/* { dg-final { scan-tree-dump-not "__builtin_expect_with_probability heuristics of edge" "profile_estimate"} } */ -- 2.7.4