diff options
author | Martin Liska <mliska@suse.cz> | 2018-08-15 10:55:15 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-08-15 08:55:15 +0000 |
commit | 7c8357def14d184fd95d506f0155c62a7141a921 (patch) | |
tree | f6bc1fc8f9dbd6e1c5544d6c8d9a027c792a424e /gcc/predict.c | |
parent | 0806181f233acd921de0881a65423eafc7cf8a5e (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 11 |
1 files changed, 8 insertions, 3 deletions
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) |