diff mbox series

Significantly speed up verifiers for a cgraph_node with many clones.

Message ID cfba0eaf-7006-4b18-2ece-1b8e2c6abf6b@suse.cz
State New
Headers show
Series Significantly speed up verifiers for a cgraph_node with many clones. | expand

Commit Message

Martin Liška Feb. 22, 2019, 10:59 a.m. UTC
Hi.

The patch makes a significant verifier speed up in a project that
has a dtor for which we create ~70.000 clones.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

2019-02-22  Martin Liska  <mliska@suse.cz>

	* cgraph.c (cgraph_node::verify_node): Verify with a neighbour
	which is equivalent to searching for this in clones chain.
	* symtab.c (symtab_node::verify_base): Similarly compare ASM
	names with a neighbour and special case first node in a chain.
---
 gcc/cgraph.c | 14 +++++++-------
 gcc/symtab.c | 39 +++++++++++++++++++++++----------------
 2 files changed, 30 insertions(+), 23 deletions(-)

Comments

Martin Liška March 6, 2019, 10:05 a.m. UTC | #1
@Honza: PING^1

On 2/22/19 11:59 AM, Martin Liška wrote:
> Hi.
> 
> The patch makes a significant verifier speed up in a project that
> has a dtor for which we create ~70.000 clones.
> 
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> 
> Ready to be installed?
> Thanks,
> Martin
> 
> gcc/ChangeLog:
> 
> 2019-02-22  Martin Liska  <mliska@suse.cz>
> 
> 	* cgraph.c (cgraph_node::verify_node): Verify with a neighbour
> 	which is equivalent to searching for this in clones chain.
> 	* symtab.c (symtab_node::verify_base): Similarly compare ASM
> 	names with a neighbour and special case first node in a chain.
> ---
>  gcc/cgraph.c | 14 +++++++-------
>  gcc/symtab.c | 39 +++++++++++++++++++++++----------------
>  2 files changed, 30 insertions(+), 23 deletions(-)
> 
>
Jan Hubicka March 7, 2019, 3:09 p.m. UTC | #2
> Hi.
> 
> The patch makes a significant verifier speed up in a project that
> has a dtor for which we create ~70.000 clones.
> 
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> 
> Ready to be installed?
> Thanks,
> Martin
> 
> gcc/ChangeLog:
> 
> 2019-02-22  Martin Liska  <mliska@suse.cz>
> 
> 	* cgraph.c (cgraph_node::verify_node): Verify with a neighbour
> 	which is equivalent to searching for this in clones chain.
> 	* symtab.c (symtab_node::verify_base): Similarly compare ASM
> 	names with a neighbour and special case first node in a chain.

OK, thanks!
Honza
diff mbox series

Patch

diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index de82316d4b1..dfe1833ed1d 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -3240,14 +3240,14 @@  cgraph_node::verify_node (void)
 
   if (clone_of)
     {
-      cgraph_node *n;
-      for (n = clone_of->clones; n; n = n->next_sibling_clone)
-	if (n == this)
-	  break;
-      if (!n)
+      cgraph_node *first_clone = clone_of->clones;
+      if (first_clone != this)
 	{
-	  error ("cgraph_node has wrong clone_of");
-	  error_found = true;
+	  if (prev_sibling_clone->clone_of != clone_of)
+	    {
+	      error ("cgraph_node has wrong clone_of");
+	      error_found = true;
+	    }
 	}
     }
   if (clones)
diff --git a/gcc/symtab.c b/gcc/symtab.c
index c9fa16b353b..16a21359f8d 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -1040,23 +1040,30 @@  symtab_node::verify_base (void)
   if (symtab->assembler_name_hash)
     {
       hashed_node = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (decl));
-      if (hashed_node && hashed_node->previous_sharing_asm_name)
+      if (hashed_node)
 	{
-          error ("assembler name hash list corrupted");
-          error_found = true;
-	}
-      while (hashed_node)
-	{
-	  if (hashed_node == this)
-	    break;
-	  hashed_node = hashed_node->next_sharing_asm_name;
-	}
-      if (!hashed_node
-	  && !(is_a <varpool_node *> (this)
-	       && DECL_HARD_REGISTER (decl)))
-	{
-          error ("node not found in symtab assembler name hash");
-          error_found = true;
+	  if (hashed_node->previous_sharing_asm_name)
+	    {
+	      error ("assembler name hash list corrupted");
+	      error_found = true;
+	    }
+	  else if (previous_sharing_asm_name == NULL)
+	    {
+	      if (hashed_node != this)
+		{
+		  error ("assembler name hash list corrupted");
+		  error_found = true;
+		}
+	    }
+	  else if (!(is_a <varpool_node *> (this) && DECL_HARD_REGISTER (decl)))
+	    {
+	      if (!asmname_hasher::equal (previous_sharing_asm_name,
+					  DECL_ASSEMBLER_NAME (decl)))
+		{
+		  error ("node not found in symtab assembler name hash");
+		  error_found = true;
+		}
+	    }
 	}
     }
   if (previous_sharing_asm_name