On Fri, 28 Mar 2025, Jason Merrill wrote: > 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%.
Nice, this also speeds up compilation of stdc++.h by ~20%! And std module compilation by ~10%. +1 > > 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 > >