On Thu, 9 Jun 2022, Jason Merrill wrote: > On 6/9/22 09:00, Patrick Palka wrote: > > This performs one of the optimizations added by the previous > > patch to lookup_template_class, to instantiate_template as well. > > (For the libstdc++ ranges tests this optimization appears to be > > effective around 30% of the time, i.e. 30% of the time context of 'tmpl' > > is non-dependent while the context of 'gen_tmpl' is dependent.) > > If this is a significant optimization, how about doing it in tsubst_aggr_type > rather than its callers?
I'm not sure how we'd do this optimization in tsubst_aggr_type? I haven't observed any significant time/memory improvements based on my limited benchmarking, but I can imagine for deeply nested templates it could be significant. And avoiding redundant work should hopefully help streamline debugging I suppose. > > > gcc/cp/ChangeLog: > > > > * pt.cc (instantiate_template): Don't substitute the context > > of the most general template if that of the partially > > instantiated template is non-dependent. > > --- > > gcc/cp/pt.cc | 10 ++++++++-- > > 1 file changed, 8 insertions(+), 2 deletions(-) > > > > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc > > index e021c254872..208daad298a 100644 > > --- a/gcc/cp/pt.cc > > +++ b/gcc/cp/pt.cc > > @@ -21661,8 +21661,14 @@ instantiate_template (tree tmpl, tree orig_args, > > tsubst_flags_t complain) > > ++processing_template_decl; > > if (DECL_CLASS_SCOPE_P (gen_tmpl)) > > { > > - tree ctx = tsubst_aggr_type (DECL_CONTEXT (gen_tmpl), targ_ptr, > > - complain, gen_tmpl, true); > > + tree ctx; > > + if (!uses_template_parms (DECL_CONTEXT (tmpl))) > > + /* If the context of the partially instantiated template is already > > + non-dependent, then we might as well use it. */ > > + ctx = DECL_CONTEXT (tmpl); > > + else > > + ctx = tsubst_aggr_type (DECL_CONTEXT (gen_tmpl), targ_ptr, > > + complain, gen_tmpl, true); > > push_nested_class (ctx); > > } > > > >