aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2019-12-05 21:53:39 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2019-12-05 20:53:39 +0000
commita414fd426346558d7a913af3ed82bcc1121fc880 (patch)
treead5a3edff5a4f5544f7171ff5f7da8a21c5467b4
parent7906797ebec6881d7d90165340f51efcf447d716 (diff)
downloadgcc-a414fd426346558d7a913af3ed82bcc1121fc880.zip
gcc-a414fd426346558d7a913af3ed82bcc1121fc880.tar.gz
gcc-a414fd426346558d7a913af3ed82bcc1121fc880.tar.bz2
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
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/ipa-inline-transform.c3
2 files changed, 6 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3cd0538..ab19c52 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
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.
(cgraph_node::create_clone): Use it for partial profiles.
* common.opt (fprofile-partial-training): New flag.
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 6ec843a..fb2726d 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -331,6 +331,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
int old_size = 0, new_size = 0;
struct cgraph_node *to = NULL;
struct cgraph_edge *curr = e;
+ bool comdat_local = e->callee->comdat_local_p ();
struct cgraph_node *callee = e->callee->ultimate_alias_target ();
bool new_edges_found = false;
@@ -502,7 +503,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
if (callee->calls_comdat_local)
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;
for (; se; se = se->next_callee)