diff options
author | Martin Liska <mliska@suse.cz> | 2018-11-05 08:33:30 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-11-05 07:33:30 +0000 |
commit | c3210c96bc56fec2653206e49c4a2514a8c7535f (patch) | |
tree | cb481eda21cffb659bf7625a625ed074a6a40273 /gcc/predict.c | |
parent | e53f77c666d6806c2e8c288ca1affa1497453e57 (diff) | |
download | gcc-c3210c96bc56fec2653206e49c4a2514a8c7535f.zip gcc-c3210c96bc56fec2653206e49c4a2514a8c7535f.tar.gz gcc-c3210c96bc56fec2653206e49c4a2514a8c7535f.tar.bz2 |
Verify that last argument of __builtin_expect_with_probability is a real cst (PR c/87811).
2018-11-05 Martin Liska <mliska@suse.cz>
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 <mliska@suse.cz>
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 <mliska@suse.cz>
PR c/87811
* doc/extend.texi: Update constrain about the last argument
of __builtin_expect_with_probability.
From-SVN: r265785
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 12 |
1 files changed, 12 insertions, 0 deletions
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); } |