Prevent inconsistent profiles to be created in inlin_transform

* ipa-inline-transform.c (inline_transform): Scale profile before
	redirecting.

From-SVN: r278814
This commit is contained in:
Jan Hubicka 2019-11-28 17:59:43 +01:00 committed by Jan Hubicka
parent 97dd1ee8de
commit c3f1ae8a30
2 changed files with 31 additions and 25 deletions

View file

@ -1,3 +1,8 @@
2019-11-28 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline-transform.c (inline_transform): Scale profile before
redirecting.
2019-11-28 Jan Hubicka <hubicka@ucw.cz>
* profile-count.h (profile_count::max): Work on profiles of different

View file

@ -681,6 +681,31 @@ inline_transform (struct cgraph_node *node)
if (preserve_function_body_p (node))
save_inline_function_body (node);
profile_count num = node->count;
profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
bool scale = num.initialized_p () && !(num == den);
if (scale)
{
profile_count::adjust_for_ipa_scaling (&num, &den);
if (dump_file)
{
fprintf (dump_file, "Applying count scale ");
num.dump (dump_file);
fprintf (dump_file, "/");
den.dump (dump_file);
fprintf (dump_file, "\n");
}
basic_block bb;
cfun->cfg->count_max = profile_count::uninitialized ();
FOR_ALL_BB_FN (bb, cfun)
{
bb->count = bb->count.apply_scale (num, den);
cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count);
}
ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count;
}
for (e = node->callees; e; e = next)
{
if (!e->inline_failed)
@ -693,32 +718,8 @@ inline_transform (struct cgraph_node *node)
timevar_push (TV_INTEGRATION);
if (node->callees && (opt_for_fn (node->decl, optimize) || has_inline))
{
profile_count num = node->count;
profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
bool scale = num.initialized_p () && !(num == den);
if (scale)
{
profile_count::adjust_for_ipa_scaling (&num, &den);
if (dump_file)
{
fprintf (dump_file, "Applying count scale ");
num.dump (dump_file);
fprintf (dump_file, "/");
den.dump (dump_file);
fprintf (dump_file, "\n");
}
basic_block bb;
cfun->cfg->count_max = profile_count::uninitialized ();
FOR_ALL_BB_FN (bb, cfun)
{
bb->count = bb->count.apply_scale (num, den);
cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count);
}
ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count;
}
todo = optimize_inline_calls (current_function_decl);
}
}
timevar_pop (TV_INTEGRATION);
cfun->always_inline_functions_inlined = true;