On 6/9/22 15:37, Patrick Palka wrote:
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?

Oops, I was overlooking the gen_tmpl vs. tmpl difference.

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.

OK.


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);
       }




Reply via email to