Tested x86_64-pc-linux-gnu, initially with extra checking to make sure that
indeed nothing got saved from a namespace level.
This isn't a regression, but a 20% speedup for a simple change is pretty
attractive; what do people think about this change for GCC 15?
-- 8< --
Profiling showed that the loop to save away IDENTIFIER_BINDINGs from open
binding levels was taking 5% of total compilation time in the PR116285
testcase. This turned out to be because we were unnecessarily trying to do
this for namespaces, whose bindings are found through
DECL_NAMESPACE_BINDINGS, not IDENTIFIER_BINDING.
As a result we would frequently loop through everything in std::, checking
whether it needs to be stored, and never storing anything.
This change actually appears to speed up compilation for the PR116285
testcase by ~20%.
The replaced comments referred either to long-replaced handling of classes
and templates, or to wanting b to point to :: when the loop exits.
PR c++/64500
PR c++/116285
gcc/cp/ChangeLog:
* name-lookup.cc (push_to_top_level): Don't try to store_bindings
for namespace levels.
---
gcc/cp/name-lookup.cc | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index 7f1ee869d52..61b7bfcaf94 100644
--- a/gcc/cp/name-lookup.cc
+++ b/gcc/cp/name-lookup.cc
@@ -8675,6 +8675,9 @@ store_class_bindings (vec<cp_class_binding, va_gc> *names,
static GTY((deletable)) struct saved_scope *free_saved_scope;
+/* Temporarily make the current scope the global namespace, saving away
+ the current scope for pop_from_top_level. */
+
void
push_to_top_level (void)
{
@@ -8716,18 +8719,19 @@ push_to_top_level (void)
store_class_bindings (previous_class_level->class_shadowed,
&s->old_bindings);
- /* Have to include the global scope, because class-scope decls
- aren't listed anywhere useful. */
+ /* Save and clear any IDENTIFIER_BINDING from local scopes. */
for (; b; b = b->level_chain)
{
tree t;
- /* Template IDs are inserted into the global level. If they were
- inserted into namespace level, finish_file wouldn't find them
- when doing pending instantiations. Therefore, don't stop at
- namespace level, but continue until :: . */
- if (global_scope_p (b))
- break;
+ /* We don't need to consider namespace scopes, they don't affect
+ IDENTIFIER_BINDING. */
+ if (b->kind == sk_namespace)
+ {
+ /* Jump straight to '::'. */
+ b = NAMESPACE_LEVEL (global_namespace);
+ break;
+ }
store_bindings (b->names, &s->old_bindings);
/* We also need to check class_shadowed to save class-level type
base-commit: d9b56c65a2697e0d7a6c0f15f1977803dc94579b
--
2.49.0