[PATCH] Prevent IPA-SRA from creating calls to local comdats (PR 92676)
Martin Jambor
mjambor@suse.cz
Wed Mar 11 15:53:03 GMT 2020
Hello,
ping.
Thanks,
Martin
On Mon, Dec 16 2019, Martin Jambor wrote:
> Hi,
>
> since r278669 (fix for PR ipa/91956), IPA-SRA makes sure that the clone
> it creates is put into the same same_comdat as the original cgraph_node,
> so that it can call private comdats (such as the ipa-split bits of a
> comdat that is private).
>
> However, that means that if there is non-comdat caller of a public
> comdat that is modified by IPA-SRA, it now finds itself calling a
> private comdat, which call graph verifier does not like (and for a
> reason, in theory it can disappear and since it is private it would not
> be available from other CUs).
>
> The patch fixes this by performing the fix for PR 91956 only when the
> node in question actually calls a local comdat and when it does, also
> making sure that no callers come from a different same_comdat (disabling
> IPA-SRA if both conditions are true), so that it plays by the rules in
> both modes, does not violate the private comdat calling rule and at the
> same time does not disable the transformation unnecessarily.
>
> The patch also fixes up the calls_comdat_local of callers of the
> modified node, despite that not triggering any known issues. It has
> passed LTO-bootstrap and testing. What do you think?
>
> Thanks,
>
> Martin
>
>
> 2019-12-16 Martin Jambor <mjambor@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.
> (process_isra_node_results): Set calls_comdat_local of callers if
> appropriate.
> ---
> gcc/ipa-sra.c | 27 +++++++++++++++++++++++++--
> 1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c
> index 421c0899e11..8612c8fc920 100644
> --- a/gcc/ipa-sra.c
> +++ b/gcc/ipa-sra.c
> @@ -2895,10 +2895,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;
> };
> @@ -2920,6 +2924,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)
> @@ -2942,6 +2953,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)
> @@ -2960,6 +2972,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)
> {
> @@ -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;
> + }
> new_node->calls_comdat_local = node->calls_comdat_local;
>
> if (dump_file)
> --
> 2.24.0
More information about the Gcc-patches
mailing list