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
> 
> 

Reply via email to