From: Martin Liska Date: Thu, 2 Jun 2016 12:51:57 +0000 (+0200) Subject: Fix first match heuristics X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f3c5ecc2b984e186f043ad03cc7a96a6275f4670;p=gcc.git Fix first match heuristics * predict.c (combine_predictions_for_bb): Fix first match in cases where a first predictor contains more than one occurence in list of predictors. Take the best value in such case. * gcc.dg/predict-9.c: New test. From-SVN: r237036 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 01beb954298..d4af6afc87e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-06-02 Martin Liska + + * predict.c (combine_predictions_for_bb): Fix first match in + cases where a first predictor contains more than one occurence + in list of predictors. Take the best value in such case. + 2016-06-02 Kyrylo Tkachov PR rtl-optimization/71295 diff --git a/gcc/predict.c b/gcc/predict.c index e9dda20a0f7..429f44e0271 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -939,7 +939,7 @@ combine_predictions_for_bb (basic_block bb, bool dry_run) pred2; pred2 = pred2->ep_next) if (pred2 != pred && pred2->ep_predictor == pred->ep_predictor) { - int probability2 = pred->ep_probability; + int probability2 = pred2->ep_probability; if (pred2->ep_edge != first) probability2 = REG_BR_PROB_BASE - probability2; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b0fa91b8171..fcf6bbd2279 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-06-02 Martin Liska + + * gcc.dg/predict-9.c: New test. + 2016-06-02 Jakub Jelinek * lib/gcc-dg.exp (cleanup-after-saved-dg-test): Add missing diff --git a/gcc/testsuite/gcc.dg/predict-9.c b/gcc/testsuite/gcc.dg/predict-9.c new file mode 100644 index 00000000000..59be16e6842 --- /dev/null +++ b/gcc/testsuite/gcc.dg/predict-9.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ + +extern int global; +extern int global2; +extern int global3; + +void foo (int base) +{ + int i; + while (global < 10) + { + if(global || global2 || global3) + return; + + for (i = base; i < 10; i++) + if (i > 123) + return; + } +} + +/* { dg-final { scan-tree-dump-times "first match heuristics: 2.0%" 4 "profile_estimate"} } */ +/* { dg-final { scan-tree-dump-times "first match heuristics: 4.5%" 0 "profile_estimate"} } */