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