From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1611) id 45EE13858C66; Tue, 20 Jun 2023 16:17:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 45EE13858C66 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1687277849; bh=s+be0/MFZp9EKASIEGbemAXdCFIkY0YEt0OyaueyReY=; h=From:To:Subject:Date:From; b=Azo8QNV/EhNEVKLokTxByS/vVt5NgTOjnMFahITe+sTPI/o2DYYsqRzjyWME5/DS7 EhPyMy1Qc4DEmlSV9NmBkR7+opBQhoyEbRdrSWAU/t0ko6R0VbqGMev16aSkaOrIV+ kqn+rMMa/WbXVVTva/vXQP44WYfSNKEbIQ8iHbcg= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Martin Jambor To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-1998] ipa-sra: Disable candidates with no known callers (PR 110276) X-Act-Checkin: gcc X-Git-Author: Martin Jambor X-Git-Refname: refs/heads/master X-Git-Oldrev: 7f986e2ed9323099bf142756d282002baa869289 X-Git-Newrev: 0be3a051c03965c5c0385b783837154902bc08fa Message-Id: <20230620161729.45EE13858C66@sourceware.org> Date: Tue, 20 Jun 2023 16:17:29 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0be3a051c03965c5c0385b783837154902bc08fa commit r14-1998-g0be3a051c03965c5c0385b783837154902bc08fa Author: Martin Jambor Date: Tue Jun 20 18:15:22 2023 +0200 ipa-sra: Disable candidates with no known callers (PR 110276) In IPA-SRA we use can_be_local_p () predicate rather than just plain local call graph flag in order to figure out whether the node is a part of an external API that we cannot change. Although there are cases where this can allow more transformations, it also means we can analyze functions which have no callers at all, which is pointless. Moreover, it makes an assert of hint propagation trigger, which checks that we have looked at callers before processing hints that come from them. This has been reported as PR 110276. This patch simply adds a check that a node has at least one caller into the early checks and makes the node a non-candidate for any transformation if it does not. gcc/ChangeLog: 2023-06-16 Martin Jambor PR ipa/110276 * ipa-sra.cc (struct caller_issues): New field there_is_one. (check_for_caller_issues): Set it. (check_all_callers_for_issues): Check it. gcc/testsuite/ChangeLog: 2023-06-16 Martin Jambor PR ipa/110276 * gcc.dg/ipa/pr110276.c: New test. Diff: --- gcc/ipa-sra.cc | 11 +++++++++++ gcc/testsuite/gcc.dg/ipa/pr110276.c | 15 +++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc index 3fee8fb22ce..21d281a9756 100644 --- a/gcc/ipa-sra.cc +++ b/gcc/ipa-sra.cc @@ -3074,6 +3074,8 @@ struct caller_issues cgraph_node *candidate; /* There is a thunk among callers. */ bool thunk; + /* Set if there is at least one caller that is OK. */ + bool there_is_one; /* Call site with no available information. */ bool unknown_callsite; /* Call from outside the candidate's comdat group. */ @@ -3116,6 +3118,8 @@ check_for_caller_issues (struct cgraph_node *node, void *data) if (csum->m_bit_aligned_arg) issues->bit_aligned_aggregate_argument = true; + + issues->there_is_one = true; } return false; } @@ -3170,6 +3174,13 @@ check_all_callers_for_issues (cgraph_node *node) for (unsigned i = 0; i < param_count; i++) (*ifs->m_parameters)[i].split_candidate = false; } + if (!issues.there_is_one) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "There is no call to %s that we can modify. " + "Disabling all modifications.\n", node->dump_name ()); + return true; + } return false; } diff --git a/gcc/testsuite/gcc.dg/ipa/pr110276.c b/gcc/testsuite/gcc.dg/ipa/pr110276.c new file mode 100644 index 00000000000..5a1e2f3fb1c --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr110276.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef long (*EFI_PCI_IO_PROTOCOL_CONFIG)(); +typedef struct { + EFI_PCI_IO_PROTOCOL_CONFIG Read; +} EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS; +typedef struct { + EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS Pci; +} EFI_PCI_IO_PROTOCOL; +int init_regs_0; +static void __attribute__((constructor)) init(EFI_PCI_IO_PROTOCOL *pci_io) { + if (init_regs_0) + pci_io->Pci.Read(); +}