aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-08-15 10:55:15 +0200
committerMartin Liska <marxin@gcc.gnu.org>2018-08-15 08:55:15 +0000
commit7c8357def14d184fd95d506f0155c62a7141a921 (patch)
treef6bc1fc8f9dbd6e1c5544d6c8d9a027c792a424e
parent0806181f233acd921de0881a65423eafc7cf8a5e (diff)
downloadgcc-7c8357def14d184fd95d506f0155c62a7141a921.zip
gcc-7c8357def14d184fd95d506f0155c62a7141a921.tar.gz
gcc-7c8357def14d184fd95d506f0155c62a7141a921.tar.bz2
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/predict.c11
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/predict-20.c23
-rw-r--r--gcc/testsuite/gcc.dg/predict-21.c13
5 files changed, 58 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9dc9acd..40c7be5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/predict.c b/gcc/predict.c
index 3fbe3b7..8c8e791 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 18cae4d..46a1627 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/predict-20.c b/gcc/testsuite/gcc.dg/predict-20.c
new file mode 100644
index 0000000..31d0183
--- /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 0000000..5949e5f
--- /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"} } */