> Hello.
> 
> This is my second attempt to fix the PR I worked on with Honza and Martin 
> Jambor.
> 
> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. 
> Apart from that
> octoploid confirmed it can survive LLVM build. And I can build Firefox and 
> boost with the
> patch on x86_64-linux-gnu.
> 
> Ready to be installed?
> Martin

> >From f8934791a3d345eb8c2c51beca07177c75e5f6ac Mon Sep 17 00:00:00 2001
> From: marxin <mli...@suse.cz>
> Date: Tue, 11 Apr 2017 14:22:50 +0200
> Subject: [PATCH] Add function part to a same comdat group (PR ipa/80212).
> 
> gcc/ChangeLog:
> 
> 2017-04-11  Martin Liska  <mli...@suse.cz>
> 
>       PR ipa/80212
>       * cgraph.c (cgraph_node::dump): Dump calls_comdat_local.
>       * ipa-cp.c (determine_versionability): Handle calls_comdat_local
>       flags.
>       * ipa-split.c (split_function): Create a local comdat symbol
>       if caller is in a comdat group.
> 
> gcc/testsuite/ChangeLog:
> 
> 2017-04-11  Martin Liska  <mli...@suse.cz>
> 
>       PR ipa/80212
>       * g++.dg/ipa/pr80212.C: New test.
> ---
>  gcc/cgraph.c                       |  2 ++
>  gcc/ipa-cp.c                       |  2 ++
>  gcc/ipa-split.c                    |  7 +++++++
>  gcc/testsuite/g++.dg/ipa/pr80212.C | 18 ++++++++++++++++++
>  4 files changed, 29 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/ipa/pr80212.C
> 
> diff --git a/gcc/cgraph.c b/gcc/cgraph.c
> index 92ae0910c60..e505b10e211 100644
> --- a/gcc/cgraph.c
> +++ b/gcc/cgraph.c
> @@ -2123,6 +2123,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 (merged_comdat)
> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
> index 0b408149a88..756a335661d 100644
> --- a/gcc/ipa-cp.c
> +++ b/gcc/ipa-cp.c
> @@ -614,6 +614,8 @@ determine_versionability (struct cgraph_node *node,
>       decloned constructors, inlining is always better anyway.  */
>    else if (node->comdat_local_p ())
>      reason = "comdat-local function";
> +  else if (node->calls_comdat_local)
> +    reason = "calls comdat-local function";

Perhaps add a comment here that the call is versionable if we make sure that all
callers are inside of the comdat group.
We could improve it later if it becomes important.
>  
>    if (reason && dump_file && !node->alias && !node->thunk.thunk_p)
>      fprintf (dump_file, "Function %s/%i is not versionable, reason: %s.\n",
> diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
> index da3c2c62344..8993cae089c 100644
> --- a/gcc/ipa-split.c
> +++ b/gcc/ipa-split.c
> @@ -1360,6 +1360,13 @@ split_function (basic_block return_bb, struct 
> split_point *split_point,
>  
>    node->split_part = true;
>  
> +  if (cur_node->same_comdat_group)
> +    {
> +      cur_node->calls_comdat_local = 1;
> +      node->add_to_same_comdat_group (cur_node);
> +    }
Also please add a comment here as well.

Otherwise OK.  I would suggest commit the first part (fixing comdat local 
handling) 
first and ipa-split bits incrementally to simplify bisecting we may need to do 
in future
(I hope we won't)

Honza

Reply via email to