public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] ipa-sra: Disable candidates with no known callers (PR 110276)
@ 2023-06-16 16:17 Martin Jambor
  2023-06-16 19:41 ` Jan Hubicka
  0 siblings, 1 reply; 2+ messages in thread
From: Martin Jambor @ 2023-06-16 16:17 UTC (permalink / raw)
  To: GCC Patches; +Cc: Jan Hubicka

Hi,

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.

Bootstrapped and tested on x86_64-linux, LTO bootstrap is still
underway.  OK if it passes too?

Thanks,

Martin


gcc/ChangeLog:

2023-06-16  Martin Jambor  <mjambor@suse.cz>

	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  <mjambor@suse.cz>

	PR ipa/110276
	* gcc.dg/ipa/pr110276.c: New test.
---
 gcc/ipa-sra.cc                      | 11 +++++++++++
 gcc/testsuite/gcc.dg/ipa/pr110276.c | 15 +++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/ipa/pr110276.c

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();
+}
-- 
2.40.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] ipa-sra: Disable candidates with no known callers (PR 110276)
  2023-06-16 16:17 [PATCH] ipa-sra: Disable candidates with no known callers (PR 110276) Martin Jambor
@ 2023-06-16 19:41 ` Jan Hubicka
  0 siblings, 0 replies; 2+ messages in thread
From: Jan Hubicka @ 2023-06-16 19:41 UTC (permalink / raw)
  To: Martin Jambor; +Cc: GCC Patches

> Hi,
> 
> 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.

Do we also have some cost model that we do not privatize very large
comdats?
> 
> 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.
> 
> Bootstrapped and tested on x86_64-linux, LTO bootstrap is still
> underway.  OK if it passes too?

OK. (It is run during WPA, not during early compilation, right?)

Honza
> 
> Thanks,
> 
> Martin
> 
> 
> gcc/ChangeLog:
> 
> 2023-06-16  Martin Jambor  <mjambor@suse.cz>
> 
> 	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  <mjambor@suse.cz>
> 
> 	PR ipa/110276
> 	* gcc.dg/ipa/pr110276.c: New test.
> ---
>  gcc/ipa-sra.cc                      | 11 +++++++++++
>  gcc/testsuite/gcc.dg/ipa/pr110276.c | 15 +++++++++++++++
>  2 files changed, 26 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/ipa/pr110276.c
> 
> 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();
> +}
> -- 
> 2.40.1
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-06-16 19:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-16 16:17 [PATCH] ipa-sra: Disable candidates with no known callers (PR 110276) Martin Jambor
2023-06-16 19:41 ` Jan Hubicka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).