aboutsummaryrefslogtreecommitdiff
path: root/gcc/predict.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-11-05 08:33:30 +0100
committerMartin Liska <marxin@gcc.gnu.org>2018-11-05 07:33:30 +0000
commitc3210c96bc56fec2653206e49c4a2514a8c7535f (patch)
treecb481eda21cffb659bf7625a625ed074a6a40273 /gcc/predict.c
parente53f77c666d6806c2e8c288ca1affa1497453e57 (diff)
downloadgcc-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.c12
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);
}