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 |
@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(-) > >
> 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 --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