Commit 19e502d4 by Jan Hubicka Committed by Jan Hubicka

re PR tree-optimization/83055 (ICE in operator>, at profile-count.h:834)


	PR middle-end/83055
	* predict.c (drop_profile): Do not push/pop cfun; update also
	node->count.
	(handle_missing_profiles): Fix logic looking for zero profiles.

	* gcc.dg/torture/pr83055.c: New testcase.

From-SVN: r257059
parent 41df0109
2018-01-25 Jan Hubicka <hubicka@ucw.cz>
PR middle-end/83055
* predict.c (drop_profile): Do not push/pop cfun; update also
node->count.
(handle_missing_profiles): Fix logic looking for zero profiles.
2018-01-25 Jakub Jelinek <jakub@redhat.com> 2018-01-25 Jakub Jelinek <jakub@redhat.com>
PR middle-end/83977 PR middle-end/83977
......
...@@ -3311,32 +3311,28 @@ drop_profile (struct cgraph_node *node, profile_count call_count) ...@@ -3311,32 +3311,28 @@ drop_profile (struct cgraph_node *node, profile_count call_count)
} }
basic_block bb; basic_block bb;
push_cfun (DECL_STRUCT_FUNCTION (node->decl)); if (opt_for_fn (node->decl, flag_guess_branch_prob))
if (flag_guess_branch_prob)
{ {
bool clear_zeros bool clear_zeros
= ENTRY_BLOCK_PTR_FOR_FN = !ENTRY_BLOCK_PTR_FOR_FN (fn)->count.nonzero_p ();
(DECL_STRUCT_FUNCTION (node->decl))->count.nonzero_p ();
FOR_ALL_BB_FN (bb, fn) FOR_ALL_BB_FN (bb, fn)
if (clear_zeros || !(bb->count == profile_count::zero ())) if (clear_zeros || !(bb->count == profile_count::zero ()))
bb->count = bb->count.guessed_local (); bb->count = bb->count.guessed_local ();
DECL_STRUCT_FUNCTION (node->decl)->cfg->count_max = fn->cfg->count_max = fn->cfg->count_max.guessed_local ();
DECL_STRUCT_FUNCTION (node->decl)->cfg->count_max.guessed_local ();
} }
else else
{ {
FOR_ALL_BB_FN (bb, fn) FOR_ALL_BB_FN (bb, fn)
bb->count = profile_count::uninitialized (); bb->count = profile_count::uninitialized ();
DECL_STRUCT_FUNCTION (node->decl)->cfg->count_max fn->cfg->count_max = profile_count::uninitialized ();
= profile_count::uninitialized ();
} }
pop_cfun ();
struct cgraph_edge *e; struct cgraph_edge *e;
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
e->count = gimple_bb (e->call_stmt)->count; e->count = gimple_bb (e->call_stmt)->count;
for (e = node->indirect_calls; e; e = e->next_callee) for (e = node->indirect_calls; e; e = e->next_callee)
e->count = gimple_bb (e->call_stmt)->count; e->count = gimple_bb (e->call_stmt)->count;
node->count = ENTRY_BLOCK_PTR_FOR_FN (fn)->count;
profile_status_for_fn (fn) profile_status_for_fn (fn)
= (flag_guess_branch_prob ? PROFILE_GUESSED : PROFILE_ABSENT); = (flag_guess_branch_prob ? PROFILE_GUESSED : PROFILE_ABSENT);
...@@ -3373,12 +3369,12 @@ handle_missing_profiles (void) ...@@ -3373,12 +3369,12 @@ handle_missing_profiles (void)
gcov_type max_tp_first_run = 0; gcov_type max_tp_first_run = 0;
struct function *fn = DECL_STRUCT_FUNCTION (node->decl); struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
if (!(node->count == profile_count::zero ())) if (node->count.ipa ().nonzero_p ())
continue; continue;
for (e = node->callers; e; e = e->next_caller) for (e = node->callers; e; e = e->next_caller)
if (e->count.initialized_p () && e->count > 0) if (e->count.ipa ().initialized_p () && e->count.ipa () > 0)
{ {
call_count = call_count + e->count; call_count = call_count + e->count.ipa ();
if (e->caller->tp_first_run > max_tp_first_run) if (e->caller->tp_first_run > max_tp_first_run)
max_tp_first_run = e->caller->tp_first_run; max_tp_first_run = e->caller->tp_first_run;
...@@ -3411,7 +3407,8 @@ handle_missing_profiles (void) ...@@ -3411,7 +3407,8 @@ handle_missing_profiles (void)
struct cgraph_node *callee = e->callee; struct cgraph_node *callee = e->callee;
struct function *fn = DECL_STRUCT_FUNCTION (callee->decl); struct function *fn = DECL_STRUCT_FUNCTION (callee->decl);
if (callee->count > 0) if (!(e->count.ipa () == profile_count::zero ())
&& callee->count.ipa ().nonzero_p ())
continue; continue;
if ((DECL_COMDAT (callee->decl) || DECL_EXTERNAL (callee->decl)) if ((DECL_COMDAT (callee->decl) || DECL_EXTERNAL (callee->decl))
&& fn && fn->cfg && fn && fn->cfg
......
2018-01-25 Jan Hubicka <hubicka@ucw.cz>
PR middle-end/83055
* gcc.dg/torture/pr83055.c: New testcase.
2018-01-25 Jakub Jelinek <jakub@redhat.com> 2018-01-25 Jakub Jelinek <jakub@redhat.com>
PR c++/84031 PR c++/84031
......
/* { dg-do compile } */
/* { dg-additional-options "-fprofile-generate" } */
void __attribute__ ((__cold__)) a (void);
void b (void);
void __attribute__ ((noinline)) c (void) { a (); }
void
d (void)
{
b ();
c ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment