Hi, On Fri, Mar 20 2020, Jan Hubicka wrote: >
[...] > > OK except for ... >> @@ -3759,8 +3778,12 @@ process_isra_node_results (cgraph_node *node, >> = node->create_virtual_clone (callers, NULL, new_adjustments, "isra", >> suffix_counter); >> suffix_counter++; >> - if (node->same_comdat_group) >> - new_node->add_to_same_comdat_group (node); >> + if (node->calls_comdat_local && node->same_comdat_group) >> + { >> + new_node->add_to_same_comdat_group (node); >> + for (cgraph_edge *cs = new_node->callers; cs; cs = cs->next_caller) >> + cs->caller->calls_comdat_local = true; > > You need to walk all aliases here. Oh, right. I assume thunks too? (I acknowledge I swapped most of this out since I fixed this bug and now cannot really say if we can have a thunk there in the call chain.) So like this? Passed bootstrap and testing on x86_64-linux, running LTO bootstrap now. Thanks, Martin 2020-04-01 Martin Jambor <mjam...@suse.cz> PR ipa/92676 * ipa-sra.c (struct caller_issues): New fields candidate and call_from_outside_comdat. (check_for_caller_issues): Check for calls from outsied of candidate's same_comdat_group. (check_all_callers_for_issues): Set up issues.candidate, check result of the new check. (mark_callers_calls_cdlcl): New function. (process_isra_node_results): Set calls_comdat_local of callers if appropriate. --- gcc/ChangeLog | 13 +++++++++++++ gcc/ipa-sra.c | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 654356c8dc8..e9183f4921a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2020-04-01 Martin Jambor <mjam...@suse.cz> + + PR ipa/92676 + * ipa-sra.c (struct caller_issues): New fields candidate and + call_from_outside_comdat. + (check_for_caller_issues): Check for calls from outsied of + candidate's same_comdat_group. + (check_all_callers_for_issues): Set up issues.candidate, check result + of the new check. + (mark_callers_calls_cdlcl): New function. + (process_isra_node_results): Set calls_comdat_local of callers if + appropriate. + 2020-04-01 Jakub Jelinek <ja...@redhat.com> PR middle-end/94423 diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c index 31de527d111..45ea62522ab 100644 --- a/gcc/ipa-sra.c +++ b/gcc/ipa-sra.c @@ -2897,10 +2897,14 @@ ipa_sra_ipa_function_checks (cgraph_node *node) struct caller_issues { + /* The candidate being considered. */ + cgraph_node *candidate; /* There is a thunk among callers. */ bool thunk; /* Call site with no available information. */ bool unknown_callsite; + /* Call from outside the the candidate's comdat group. */ + bool call_from_outside_comdat; /* There is a bit-aligned load into one of non-gimple-typed arguments. */ bool bit_aligned_aggregate_argument; }; @@ -2922,6 +2926,13 @@ check_for_caller_issues (struct cgraph_node *node, void *data) thunks. */ return true; } + if (issues->candidate->calls_comdat_local + && issues->candidate->same_comdat_group + && !issues->candidate->in_same_comdat_group_p (cs->caller)) + { + issues->call_from_outside_comdat = true; + return true; + } isra_call_summary *csum = call_sums->get (cs); if (!csum) @@ -2944,6 +2955,7 @@ check_all_callers_for_issues (cgraph_node *node) { struct caller_issues issues; memset (&issues, 0, sizeof (issues)); + issues.candidate = node; node->call_for_symbol_and_aliases (check_for_caller_issues, &issues, true); if (issues.unknown_callsite) @@ -2962,6 +2974,13 @@ check_all_callers_for_issues (cgraph_node *node) node->dump_name ()); return true; } + if (issues.call_from_outside_comdat) + { + if (dump_file) + fprintf (dump_file, "Function would become private comdat called " + "outside of its comdat group.\n"); + return true; + } if (issues.bit_aligned_aggregate_argument) { @@ -3679,6 +3698,17 @@ push_param_adjustments_for_index (isra_func_summary *ifs, unsigned base_index, } } +/* Worker for all call_for_symbol_thunks_and_aliases. Set calls_comdat_local + flag of all callers of NODE. */ + +static bool +mark_callers_calls_cdlcl (struct cgraph_node *node, void *) +{ + for (cgraph_edge *cs = node->callers; cs; cs = cs->next_caller) + cs->caller->calls_comdat_local = true; + return false; +} + /* Do final processing of results of IPA propagation regarding NODE, clone it if appropriate. */ @@ -3763,8 +3793,12 @@ process_isra_node_results (cgraph_node *node, = node->create_virtual_clone (callers, NULL, new_adjustments, "isra", suffix_counter); suffix_counter++; - if (node->same_comdat_group) - new_node->add_to_same_comdat_group (node); + if (node->calls_comdat_local && node->same_comdat_group) + { + new_node->add_to_same_comdat_group (node); + new_node->call_for_symbol_thunks_and_aliases (mark_callers_calls_cdlcl, + NULL, true); + } new_node->calls_comdat_local = node->calls_comdat_local; if (dump_file) -- 2.25.1