From 7c8357def14d184fd95d506f0155c62a7141a921 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 15 Aug 2018 10:55:15 +0200 Subject: [PATCH] Fix merging of 2 predictors (PR tree-optimization/86925). 2018-08-15 Martin Liska 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 PR tree-optimization/86925 * gcc.dg/predict-20.c: New test. * gcc.dg/predict-21.c: New test. From-SVN: r263552 --- gcc/ChangeLog | 8 ++++++++ gcc/predict.c | 11 ++++++++--- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/predict-20.c | 23 +++++++++++++++++++++++ gcc/testsuite/gcc.dg/predict-21.c | 13 +++++++++++++ 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/predict-20.c create mode 100644 gcc/testsuite/gcc.dg/predict-21.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9dc9acd84c0..40c7be5470a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-08-15 Martin Liska + + 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 * config/i386/i386.c (expand_vec_perm_movs): New method matching movs diff --git a/gcc/predict.c b/gcc/predict.c index 3fbe3b704b3..8c8e79153fc 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 18cae4dc6f8..46a16279fe0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-08-15 Martin Liska + + PR tree-optimization/86925 + * gcc.dg/predict-20.c: New test. + * gcc.dg/predict-21.c: New test. + 2018-08-15 Paolo Carlini * g++.dg/init/goto3.C: Adjust for error instead of permerror. diff --git a/gcc/testsuite/gcc.dg/predict-20.c b/gcc/testsuite/gcc.dg/predict-20.c new file mode 100644 index 00000000000..31d01835b80 --- /dev/null +++ b/gcc/testsuite/gcc.dg/predict-20.c @@ -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"} } */ diff --git a/gcc/testsuite/gcc.dg/predict-21.c b/gcc/testsuite/gcc.dg/predict-21.c new file mode 100644 index 00000000000..5949e5f4c19 --- /dev/null +++ b/gcc/testsuite/gcc.dg/predict-21.c @@ -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"} } */ -- 2.30.2