ipa-utils.c (scale_ipa_profile_for_fn): Break out from ...

* ipa-utils.c (scale_ipa_profile_for_fn): Break out from ...
	(ipa_merge_profiles): ... here; do not ICE on thunks and aliases.

From-SVN: r267549
This commit is contained in:
Jan Hubicka 2019-01-03 11:19:03 +01:00 committed by Jan Hubicka
parent cc3dac976e
commit 8ae4d4298d
2 changed files with 28 additions and 10 deletions

View File

@ -1,3 +1,8 @@
2019-01-03 Jan Hubicka <hubicka@ucw.cz>
* ipa-utils.c (scale_ipa_profile_for_fn): Break out from ...
(ipa_merge_profiles): ... here; do not ICE on thunks and aliases.
2019-01-02 Martin Sebor <msebor@redhat.com>
Jeff Law <law@redhat.com>

View File

@ -375,6 +375,20 @@ get_base_var (tree t)
return t;
}
/* Scale function of calls in NODE by ratio ORIG_COUNT/NODE->count. */
void
scale_ipa_profile_for_fn (struct cgraph_node *node, profile_count orig_count)
{
profile_count to = node->count;
profile_count::adjust_for_ipa_scaling (&to, &orig_count);
struct cgraph_edge *e;
for (e = node->callees; e; e = e->next_callee)
e->count = e->count.apply_scale (to, orig_count);
for (e = node->indirect_calls; e; e = e->next_callee)
e->count = e->count.apply_scale (to, orig_count);
}
/* SRC and DST are going to be merged. Take SRC's profile and merge it into
DST so it is not going to be lost. Possibly destroy SRC's body on the way
@ -424,6 +438,14 @@ ipa_merge_profiles (struct cgraph_node *dst,
else
dst->count = src->count.ipa ();
/* First handle functions with no gimple body. */
if (dst->thunk.thunk_p || dst->alias
|| src->thunk.thunk_p || src->alias)
{
scale_ipa_profile_for_fn (dst, orig_count);
return;
}
/* This is ugly. We need to get both function bodies into memory.
If declaration is merged, we need to duplicate it to be able
to load body that is being replaced. This makes symbol table
@ -652,16 +674,7 @@ ipa_merge_profiles (struct cgraph_node *dst,
/* We can't update CFG profile, but we can scale IPA profile. CFG
will be scaled according to dst->count after IPA passes. */
else
{
profile_count to = dst->count;
profile_count::adjust_for_ipa_scaling (&to, &orig_count);
struct cgraph_edge *e;
for (e = dst->callees; e; e = e->next_callee)
e->count = e->count.apply_scale (to, orig_count);
for (e = dst->indirect_calls; e; e = e->next_callee)
e->count = e->count.apply_scale (to, orig_count);
}
scale_ipa_profile_for_fn (dst, orig_count);
src->decl = oldsrcdecl;
}