Commit c3f1ae8a by Jan Hubicka Committed by Jan Hubicka

Prevent inconsistent profiles to be created in inlin_transform

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

From-SVN: r278814
parent 97dd1ee8
2019-11-28 Jan Hubicka <hubicka@ucw.cz> 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 * profile-count.h (profile_count::max): Work on profiles of different
type. type.
(profile_count::apply_scale): Be sure that ret is not local or global0 (profile_count::apply_scale): Be sure that ret is not local or global0
...@@ -681,6 +681,31 @@ inline_transform (struct cgraph_node *node) ...@@ -681,6 +681,31 @@ inline_transform (struct cgraph_node *node)
if (preserve_function_body_p (node)) if (preserve_function_body_p (node))
save_inline_function_body (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) for (e = node->callees; e; e = next)
{ {
if (!e->inline_failed) if (!e->inline_failed)
...@@ -693,32 +718,8 @@ inline_transform (struct cgraph_node *node) ...@@ -693,32 +718,8 @@ inline_transform (struct cgraph_node *node)
timevar_push (TV_INTEGRATION); timevar_push (TV_INTEGRATION);
if (node->callees && (opt_for_fn (node->decl, optimize) || has_inline)) 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); todo = optimize_inline_calls (current_function_decl);
} }
timevar_pop (TV_INTEGRATION); timevar_pop (TV_INTEGRATION);
cfun->always_inline_functions_inlined = true; cfun->always_inline_functions_inlined = true;
......
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