RFA (cgraph): C++ 'structor decloning patch, Mark III

Jan Hubicka hubicka@ucw.cz
Sun Dec 22 21:09:00 GMT 2013


> commit be1b04c77a420288e29c48c07e68c3ec87dd5b24
> Author: Jason Merrill <jason@redhat.com>
> Date:   Thu Jan 12 14:04:42 2012 -0500
> 
>     	PR c++/41090
>     	Add -fdeclone-ctor-dtor.
>     gcc/cp/
>     	* optimize.c (can_alias_cdtor, populate_clone_array): Split out
>     	from maybe_clone_body.
>     	(maybe_thunk_body): New function.
>     	(maybe_clone_body): Call it.
>     	* mangle.c (write_mangled_name): Remove code to suppress
>     	writing of mangled name for cloned constructor or destructor.
>     	(write_special_name_constructor): Handle decloned constructor.
>     	(write_special_name_destructor): Handle decloned destructor.
>     	* method.c (trivial_fn_p): Handle decloning.
>     	* semantics.c (expand_or_defer_fn_1): Clone after setting linkage.
>     gcc/c-family/
>     	* c.opt: Add -fdeclone-ctor-dtor.
>     	* c-opts.c (c_common_post_options): Default to on iff -Os.
>     gcc/
>     	* cgraph.h (struct cgraph_node): Add calls_comdat_local.
>     	(symtab_comdat_local_p, symtab_in_same_comdat_p): New.
>     	* cif-code.def: Add USES_COMDAT_LOCAL.
>     	* symtab.c (verify_symtab_base): Make sure we don't refer to a
>     	comdat-local symbol from outside its comdat.
>     	* cgraph.c (verify_cgraph_node): Likewise.
>     	* cgraphunit.c (mark_functions_to_output): Don't mark comdat-locals.
>     	* ipa.c (symtab_remove_unreachable_nodes): Likewise.
>     	(function_and_variable_visibility): Handle comdat-local fns.
>     	* ipa-cp.c (determine_versionability): Don't clone comdat-locals.
>     	* ipa-inline-analysis.c (compute_inline_parameters): Update
>     	calls_comdat_local.
>     	* ipa-inline-transform.c (inline_call): Likewise.
>     	(save_inline_function_body): Don't clear DECL_COMDAT_GROUP.
>     	* ipa-inline.c (can_inline_edge_p): Check calls_comdat_local.
>     	* lto-cgraph.c (input_overwrite_node): Read calls_comdat_local.
>     	(lto_output_node): Write it.
>     	* symtab.c (symtab_dissolve_same_comdat_group_list): Clear
>     	DECL_COMDAT_GROUP for comdat-locals.
>     include/
>     	* demangle.h (enum gnu_v3_ctor_kinds):
>     	Added literal gnu_v3_unified_ctor.
>     	(enum gnu_v3_ctor_kinds):
>     	Added literal gnu_v3_unified_dtor.
>     libiberty/
>     	* cp-demangle.c (cplus_demangle_fill_ctor,cplus_demangle_fill_dtor):
>     	Handle unified ctor/dtor.
>     	(d_ctor_dtor_name): Handle unified ctor/dtor.

> --- a/gcc/ipa-inline-transform.c
> +++ b/gcc/ipa-inline-transform.c
> @@ -272,6 +272,18 @@ inline_call (struct cgraph_edge *e, bool update_original,
>     inline_update_overall_summary (to);
>    new_size = inline_summary (to)->size;
>  
> +  if (callee->calls_comdat_local)
> +    to->calls_comdat_local = true;
> +  else if (to->calls_comdat_local && symtab_comdat_local_p (callee))
> +    {
> +      struct cgraph_edge *se = to->callees;
> +      for (; se; se = se->next_callee)
> +	if (se->inline_failed && symtab_comdat_local_p (se->callee))
> +	  break;
> +      if (se == NULL)
> +	to->calls_comdat_local = false;
> +    }

I still do not think this is quite right.  A function (after inlining) as at this
stage represented by tree of functions linked via call edges with inline_failed 
set to NULL.

TO represents a root of this tree, E->CALLER is the function we inlined into.
I think we want to keep calls_comdat_local up to doate even for inline clones,
so here we should update calls_comdat_local of e->caller (instead of to) and if
it changes propagate the change into callers until we reach TO.

I can handle this incrementally, since I do not think it will reproduce with
our current limited use of comdat locals.

The patch is OK,
thanks!
Honza



More information about the Gcc-patches mailing list