mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
e53f77c666
commit
c3210c96bc
|
@ -1,3 +1,16 @@
|
||||||
|
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.
|
||||||
|
|
||||||
|
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>
|
2018-11-05 Martin Liska <mliska@suse.cz>
|
||||||
|
|
||||||
PR gcov-profile/77698
|
PR gcov-profile/77698
|
||||||
|
|
|
@ -12046,7 +12046,8 @@ when testing pointer or floating-point values.
|
||||||
This function has the same semantics as @code{__builtin_expect},
|
This function has the same semantics as @code{__builtin_expect},
|
||||||
but the caller provides the expected probability that @var{exp} == @var{c}.
|
but the caller provides the expected probability that @var{exp} == @var{c}.
|
||||||
The last argument, @var{probability}, is a floating-point value in the
|
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
|
@end deftypefn
|
||||||
|
|
||||||
@deftypefn {Built-in Function} void __builtin_trap (void)
|
@deftypefn {Built-in Function} void __builtin_trap (void)
|
||||||
|
|
|
@ -2467,6 +2467,13 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code,
|
||||||
base = build_real_from_int_cst (t, base);
|
base = build_real_from_int_cst (t, base);
|
||||||
tree r = fold_build2_initializer_loc (UNKNOWN_LOCATION,
|
tree r = fold_build2_initializer_loc (UNKNOWN_LOCATION,
|
||||||
MULT_EXPR, t, prob, base);
|
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
|
HOST_WIDE_INT probi
|
||||||
= real_to_integer (TREE_REAL_CST_PTR (r));
|
= real_to_integer (TREE_REAL_CST_PTR (r));
|
||||||
if (probi >= 0 && probi <= REG_BR_PROB_BASE)
|
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;
|
*predictor = PRED_BUILTIN_EXPECT_WITH_PROBABILITY;
|
||||||
*probability = probi;
|
*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);
|
return gimple_call_arg (def, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
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>
|
2018-11-05 Martin Liska <mliska@suse.cz>
|
||||||
|
|
||||||
PR gcov-profile/77698
|
PR gcov-profile/77698
|
||||||
|
|
|
@ -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"} } */
|
|
@ -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 ();
|
||||||
|
}
|
|
@ -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"} } */
|
Loading…
Reference in New Issue