aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2012-12-12 09:43:33 +0000
committerJakub Jelinek <jakub@gcc.gnu.org>2012-12-12 10:43:33 +0100
commit57dab7925d52135be54eec74f2b0ac569a7c48bf (patch)
tree9ae2a91660d8b652a7ae355208150479d3ce316a /gcc/varasm.c
parent62b3f0f05e1eae8828dd29e259f3fa7a184dfd60 (diff)
downloadgcc-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.c11
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