mirror of git://gcc.gnu.org/git/gcc.git
Fix merging of 2 predictors (PR tree-optimization/86925).
2018-08-15 Martin Liska <mliska@suse.cz>
PR tree-optimization/86925
* predict.c (expr_expected_value_1): When taking
later predictor, assign also probability.
Use fold_build2_initializer_loc in order to fold
the expression in -frounding-math.
2018-08-15 Martin Liska <mliska@suse.cz>
PR tree-optimization/86925
* gcc.dg/predict-20.c: New test.
* gcc.dg/predict-21.c: New test.
From-SVN: r263552
This commit is contained in:
parent
0806181f23
commit
7c8357def1
|
|
@ -1,3 +1,11 @@
|
|||
2018-08-15 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR tree-optimization/86925
|
||||
* predict.c (expr_expected_value_1): When taking
|
||||
later predictor, assign also probability.
|
||||
Use fold_build2_initializer_loc in order to fold
|
||||
the expression in -frounding-math.
|
||||
|
||||
2018-08-14 Allan Sandfeld Jensen <allan.jensen@qt.io>
|
||||
|
||||
* config/i386/i386.c (expand_vec_perm_movs): New method matching movs
|
||||
|
|
|
|||
|
|
@ -2332,13 +2332,17 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code,
|
|||
if (arg == PHI_RESULT (def))
|
||||
continue;
|
||||
|
||||
HOST_WIDE_INT probability2;
|
||||
new_val = expr_expected_value (arg, visited, &predictor2,
|
||||
probability);
|
||||
&probability2);
|
||||
|
||||
/* It is difficult to combine value predictors. Simply assume
|
||||
that later predictor is weaker and take its prediction. */
|
||||
if (*predictor < predictor2)
|
||||
*predictor = predictor2;
|
||||
{
|
||||
*predictor = predictor2;
|
||||
*probability = probability2;
|
||||
}
|
||||
if (!new_val)
|
||||
return NULL;
|
||||
if (!val)
|
||||
|
|
@ -2423,7 +2427,8 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code,
|
|||
tree base = build_int_cst (integer_type_node,
|
||||
REG_BR_PROB_BASE);
|
||||
base = build_real_from_int_cst (t, base);
|
||||
tree r = fold_build2 (MULT_EXPR, t, prob, base);
|
||||
tree r = fold_build2_initializer_loc (UNKNOWN_LOCATION,
|
||||
MULT_EXPR, t, prob, base);
|
||||
HOST_WIDE_INT probi
|
||||
= real_to_integer (TREE_REAL_CST_PTR (r));
|
||||
if (probi >= 0 && probi <= REG_BR_PROB_BASE)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
2018-08-15 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR tree-optimization/86925
|
||||
* gcc.dg/predict-20.c: New test.
|
||||
* gcc.dg/predict-21.c: New test.
|
||||
|
||||
2018-08-15 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
* g++.dg/init/goto3.C: Adjust for error instead of permerror.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
/* PR tree-optimization/86925 */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
|
||||
|
||||
int a, b;
|
||||
|
||||
void
|
||||
c ()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
if (__builtin_expect (b < 0, 0))
|
||||
break;
|
||||
if (__builtin_expect (a, 1))
|
||||
break;
|
||||
}
|
||||
int d = b < 0;
|
||||
if (__builtin_expect (d, 0))
|
||||
asm("");
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "__builtin_expect heuristics of edge" 3 "profile_estimate"} } */
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-profile_estimate -frounding-math" } */
|
||||
|
||||
extern int global;
|
||||
|
||||
void foo (int base)
|
||||
{
|
||||
for (int i = 0; __builtin_expect_with_probability (i < base, 1, 0.05f); i++)
|
||||
global++;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "first match heuristics: 5.00%" "profile_estimate"} } */
|
||||
/* { dg-final { scan-tree-dump "__builtin_expect_with_probability heuristics of edge .*->.*: 5.00%" "profile_estimate"} } */
|
||||
Loading…
Reference in New Issue