diff options
author | Steven Bosscher <steven@gcc.gnu.org> | 2012-12-12 09:43:33 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-12-12 10:43:33 +0100 |
commit | 57dab7925d52135be54eec74f2b0ac569a7c48bf (patch) | |
tree | 9ae2a91660d8b652a7ae355208150479d3ce316a /gcc/varasm.c | |
parent | 62b3f0f05e1eae8828dd29e259f3fa7a184dfd60 (diff) | |
download | gcc-57dab7925d52135be54eec74f2b0ac569a7c48bf.zip gcc-57dab7925d52135be54eec74f2b0ac569a7c48bf.tar.gz gcc-57dab7925d52135be54eec74f2b0ac569a7c48bf.tar.bz2 |
re PR middle-end/52640 (performance bottleneck: gcc/tree.c;value_member)
PR middle-end/52640
* varasm.c (pending_assemble_externals_set): New pointer set.
(process_pending_assemble_externals): Destroy the pointer set.
(assemble_external): See if decl is in pending_assemble_externals_set,
and add it to pending_assemble_externals if necessary.
(init_varasm_once): Allocate pending_assemble_externals_set.
* gcc.c-torture/compile/limits-externdecl.c: New test.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r194441
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r-- | gcc/varasm.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c index b6170e6..bca852d 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2089,6 +2089,10 @@ contains_pointers_p (tree type) static GTY(()) tree pending_assemble_externals; #ifdef ASM_OUTPUT_EXTERNAL +/* Avoid O(external_decls**2) lookups in the pending_assemble_externals + TREE_LIST in assemble_external. */ +static struct pointer_set_t *pending_assemble_externals_set; + /* True if DECL is a function decl for which no out-of-line copy exists. It is assumed that DECL's assembler name has been set. */ @@ -2140,6 +2144,7 @@ process_pending_assemble_externals (void) assemble_external_real (TREE_VALUE (list)); pending_assemble_externals = 0; + pointer_set_destroy (pending_assemble_externals_set); #endif } @@ -2191,7 +2196,7 @@ assemble_external (tree decl ATTRIBUTE_UNUSED) weak_decls = tree_cons (NULL, decl, weak_decls); #ifdef ASM_OUTPUT_EXTERNAL - if (value_member (decl, pending_assemble_externals) == NULL_TREE) + if (! pointer_set_insert (pending_assemble_externals_set, decl)) pending_assemble_externals = tree_cons (NULL, decl, pending_assemble_externals); #endif @@ -5904,6 +5909,10 @@ init_varasm_once (void) if (readonly_data_section == NULL) readonly_data_section = text_section; + +#ifdef ASM_OUTPUT_EXTERNAL + pending_assemble_externals_set = pointer_set_create (); +#endif } enum tls_model |