Commit a414fd42 by Jan Hubicka Committed by Jan Hubicka

Fix g++.dg/torture/pr59226.C

this patch fixes ICE in g++.dg/torture/pr59226.C which was triggered by
new comdat_local sanity check.  What happens here is that function gets
inlined into its own thunk which makes it !comdat_local_p but the updating
code does not notice since thunk calls comdat local alias of the function
itself and we look at alias target rather than original callee.

This also shows that we miss optimization here.  Currently we will not inline
thunk out of its comdat local group w/o inlining function it is associated with
into it.

We should teach inline_call to reoslve edges to aliases while inlining and 
relax calls_comdat_local flag.  But this needs bit more work, so I fix the
ICE first.

	* ipa-inline-transform.c (inline_call): Fix maintenatnce of comdat_local

From-SVN: r279021
parent 7906797e
2019-12-05 Jan Hubicka <hubicka@ucw.cz> 2019-12-05 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline-transform.c (inline_call): Fix maintenatnce of comdat_local
2019-12-05 Jan Hubicka <hubicka@ucw.cz>
* cgraphclones.c (localize_profile): New function. * cgraphclones.c (localize_profile): New function.
(cgraph_node::create_clone): Use it for partial profiles. (cgraph_node::create_clone): Use it for partial profiles.
* common.opt (fprofile-partial-training): New flag. * common.opt (fprofile-partial-training): New flag.
...@@ -331,6 +331,7 @@ inline_call (struct cgraph_edge *e, bool update_original, ...@@ -331,6 +331,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
int old_size = 0, new_size = 0; int old_size = 0, new_size = 0;
struct cgraph_node *to = NULL; struct cgraph_node *to = NULL;
struct cgraph_edge *curr = e; struct cgraph_edge *curr = e;
bool comdat_local = e->callee->comdat_local_p ();
struct cgraph_node *callee = e->callee->ultimate_alias_target (); struct cgraph_node *callee = e->callee->ultimate_alias_target ();
bool new_edges_found = false; bool new_edges_found = false;
...@@ -502,7 +503,7 @@ inline_call (struct cgraph_edge *e, bool update_original, ...@@ -502,7 +503,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
if (callee->calls_comdat_local) if (callee->calls_comdat_local)
to->calls_comdat_local = true; to->calls_comdat_local = true;
else if (to->calls_comdat_local && callee->comdat_local_p ()) else if (to->calls_comdat_local && comdat_local)
{ {
struct cgraph_edge *se = to->callees; struct cgraph_edge *se = to->callees;
for (; se; se = se->next_callee) for (; se; se = se->next_callee)
......
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