From: Martin Liska Date: Mon, 29 May 2017 09:11:42 +0000 (+0200) Subject: Backport r246848 X-Git-Tag: releases/gcc-5.5.0~324 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8790cddd49414f5381e3d03115bb2da9ccb87825;p=thirdparty%2Fgcc.git Backport r246848 2017-05-29 Martin Liska Backport from mainline 2017-04-11 Martin Liska PR ipa/80212 * cgraph.c (cgraph_node::dump): Dump calls_comdat_local. * ipa-split.c (split_function): Create a local comdat symbol if caller is in a comdat group. 2017-05-29 Martin Liska Backport from mainline 2017-04-11 Martin Liska PR ipa/80212 * g++.dg/ipa/pr80212.C: New test. From-SVN: r248564 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3350677a032d..8eca3975c629 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2017-05-29 Martin Liska + + Backport from mainline + 2017-04-11 Martin Liska + + PR ipa/80212 + * cgraph.c (cgraph_node::dump): Dump calls_comdat_local. + * ipa-split.c (split_function): Create a local comdat symbol + if caller is in a comdat group. + 2017-05-29 Martin Liska Backport from mainline diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 448e940586fa..0fcd9364b189 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2027,6 +2027,8 @@ cgraph_node::dump (FILE *f) fprintf (f, " only_called_at_exit"); if (tm_clone) fprintf (f, " tm_clone"); + if (calls_comdat_local) + fprintf (f, " calls_comdat_local"); if (icf_merged) fprintf (f, " icf_merged"); if (nonfreeing_fn) diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index b9678e11db07..c276b148859d 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -1390,6 +1390,15 @@ split_function (basic_block return_bb, struct split_point *split_point, node->split_part = true; + if (cur_node->same_comdat_group) + { + /* TODO: call is versionable if we make sure that all + callers are inside of a comdat group. */ + cur_node->calls_comdat_local = 1; + node->add_to_same_comdat_group (cur_node); + } + + /* Let's take a time profile for splitted function. */ node->tp_first_run = cur_node->tp_first_run + 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c88b91b937f4..d64e5e8f90fb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-05-29 Martin Liska + + Backport from mainline + 2017-04-11 Martin Liska + + PR ipa/80212 + * g++.dg/ipa/pr80212.C: New test. + 2017-05-29 Martin Liska Backport from mainline diff --git a/gcc/testsuite/g++.dg/ipa/pr80212.C b/gcc/testsuite/g++.dg/ipa/pr80212.C new file mode 100644 index 000000000000..60d3b613035c --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr80212.C @@ -0,0 +1,18 @@ +// PR ipa/80212 +// { dg-options "-O2 --param partial-inlining-entry-probability=403796683 -fno-early-inlining" } + +struct b +{ + virtual b *c () const; +}; +struct d : virtual b +{ +}; +struct e : d +{ + e * + c () const + { + } +}; +main () { e a; }