From 33e9feb53082ee79d5f4321bcedf025f1bbd691d Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 18 Jul 2017 15:49:30 +0200 Subject: [PATCH] re PR tree-optimization/81462 (ICE in estimate_bb_frequencies at gcc/predict.c:3546) PR middle-end/81462 * predict.c (set_even_probabilities): Cleanup; do not affect probabilities that are already known. (combine_predictions_for_bb): Call even when count is set. * g++.dg/torture/pr81462.C: New testcase. From-SVN: r250310 --- gcc/ChangeLog | 7 +++++++ gcc/predict.c | 26 ++++++++++++++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr81462.C | 17 +++++++++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr81462.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1d11ab5b95e..892c0258534 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-07-18 Jan Hubicka + + PR middle-end/81462 + * predict.c (set_even_probabilities): Cleanup; do not affect + probabilities that are already known. + (combine_predictions_for_bb): Call even when count is set. + 2017-07-18 Nathan Sidwell * tree-parloops.c (try_transform_to_exit_first_loop_alt): Use diff --git a/gcc/predict.c b/gcc/predict.c index 310d9b0aced..1e2e11d71f0 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -817,16 +817,25 @@ static void set_even_probabilities (basic_block bb, hash_set *unlikely_edges = NULL) { - unsigned nedges = 0; + unsigned nedges = 0, unlikely_count = 0; edge e = NULL; edge_iterator ei; + profile_probability all = profile_probability::always (); FOR_EACH_EDGE (e, ei, bb->succs) - if (!unlikely_executed_edge_p (e)) - nedges ++; + if (e->probability.initialized_p ()) + all -= e->probability; + else if (!unlikely_executed_edge_p (e)) + { + nedges ++; + if (unlikely_edges != NULL && unlikely_edges->contains (e)) + { + all -= profile_probability::very_unlikely (); + unlikely_count++; + } + } /* Make the distribution even if all edges are unlikely. */ - unsigned unlikely_count = unlikely_edges ? unlikely_edges->elements () : 0; if (unlikely_count == nedges) { unlikely_edges = NULL; @@ -836,13 +845,14 @@ set_even_probabilities (basic_block bb, unsigned c = nedges - unlikely_count; FOR_EACH_EDGE (e, ei, bb->succs) - if (!unlikely_executed_edge_p (e)) + if (e->probability.initialized_p ()) + ; + else if (!unlikely_executed_edge_p (e)) { if (unlikely_edges != NULL && unlikely_edges->contains (e)) e->probability = profile_probability::very_unlikely (); else - e->probability = profile_probability::guessed_always () - .apply_scale (1, c); + e->probability = all.apply_scale (1, c).guessed (); } else e->probability = profile_probability::never (); @@ -1151,7 +1161,7 @@ combine_predictions_for_bb (basic_block bb, bool dry_run) if (pred->ep_probability <= PROB_VERY_UNLIKELY) unlikely_edges.add (pred->ep_edge); - if (!bb->count.initialized_p () && !dry_run) + if (!dry_run) set_even_probabilities (bb, &unlikely_edges); clear_bb_predictions (bb); if (dump_file) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 91aa26c0cbc..01f24abca7c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-07-18 Jan Hubicka + + PR middle-end/81462 + * g++.dg/torture/pr81462.C: New testcase. + 2017-07-18 Bin Cheng PR target/81408 diff --git a/gcc/testsuite/g++.dg/torture/pr81462.C b/gcc/testsuite/g++.dg/torture/pr81462.C new file mode 100644 index 00000000000..044c8b78ee5 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr81462.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O1 -fno-ipa-pure-const" } +struct B { + B* self; + B() : self( this ) { self->f(); } + virtual void f() = 0; + }; + + struct D : B + { + void f() {} + }; + + int main() + { + D d; + } -- 2.30.2