public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-276] c++: micro-optimize most_specialized_partial_spec
@ 2023-04-26 19:43 Patrick Palka
0 siblings, 0 replies; only message in thread
From: Patrick Palka @ 2023-04-26 19:43 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:50d866038a910ceb9075b97295a12d77a8d09a3a
commit r14-276-g50d866038a910ceb9075b97295a12d77a8d09a3a
Author: Patrick Palka <ppalka@redhat.com>
Date: Wed Apr 26 15:43:26 2023 -0400
c++: micro-optimize most_specialized_partial_spec
This introduces an early exit test to most_specialized_partial_spec for
templates which have no partial specializations, saving some unnecessary
work during class template instantiation in the common case. In passing,
modernize the code a bit.
gcc/cp/ChangeLog:
* pt.cc (most_specialized_partial_spec): Exit early when
DECL_TEMPLATE_SPECIALIZATIONS is empty. Move local variable
declarations closer to their first use. Remove redundant
flag_concepts test. Remove redundant forward declaration.
Diff:
---
gcc/cp/pt.cc | 45 +++++++++++++++++++--------------------------
1 file changed, 19 insertions(+), 26 deletions(-)
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index a668825b5f9..678cb7930e3 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -183,7 +183,6 @@ static int unify_pack_expansion (tree, tree, tree,
static tree copy_template_args (tree);
static tree tsubst_template_parms (tree, tree, tsubst_flags_t);
static void tsubst_each_template_parm_constraints (tree, tree, tsubst_flags_t);
-tree most_specialized_partial_spec (tree, tsubst_flags_t);
static tree tsubst_aggr_type (tree, tree, tsubst_flags_t, tree, int);
static tree tsubst_aggr_type_1 (tree, tree, tsubst_flags_t, tree, int);
static tree tsubst_arg_types (tree, tree, tree, tsubst_flags_t, tree);
@@ -26002,15 +26001,7 @@ most_general_template (tree decl)
tree
most_specialized_partial_spec (tree target, tsubst_flags_t complain)
{
- tree list = NULL_TREE;
- tree t;
- tree champ;
- int fate;
- bool ambiguous_p;
- tree outer_args = NULL_TREE;
- tree tmpl, args;
-
- tree decl;
+ tree tmpl, args, decl;
if (TYPE_P (target))
{
tree tinfo = CLASSTYPE_TEMPLATE_INFO (target);
@@ -26034,13 +26025,18 @@ most_specialized_partial_spec (tree target, tsubst_flags_t complain)
else
gcc_unreachable ();
+ tree main_tmpl = most_general_template (tmpl);
+ tree specs = DECL_TEMPLATE_SPECIALIZATIONS (main_tmpl);
+ if (!specs)
+ /* There are no partial specializations of this template. */
+ return NULL_TREE;
+
push_access_scope_guard pas (decl);
deferring_access_check_sentinel acs (dk_no_deferred);
- tree main_tmpl = most_general_template (tmpl);
-
/* For determining which partial specialization to use, only the
innermost args are interesting. */
+ tree outer_args = NULL_TREE;
if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
{
outer_args = strip_innermost_template_args (args, 1);
@@ -26052,7 +26048,8 @@ most_specialized_partial_spec (tree target, tsubst_flags_t complain)
fully resolve everything. */
processing_template_decl_sentinel ptds;
- for (t = DECL_TEMPLATE_SPECIALIZATIONS (main_tmpl); t; t = TREE_CHAIN (t))
+ tree list = NULL_TREE;
+ for (tree t = specs; t; t = TREE_CHAIN (t))
{
const tree ospec_tmpl = TREE_VALUE (t);
@@ -26075,10 +26072,8 @@ most_specialized_partial_spec (tree target, tsubst_flags_t complain)
if (outer_args)
spec_args = add_to_template_args (outer_args, spec_args);
- /* Keep the candidate only if the constraints are satisfied,
- or if we're not compiling with concepts. */
- if (!flag_concepts
- || constraints_satisfied_p (ospec_tmpl, spec_args))
+ /* Keep the candidate only if its constraints are satisfied. */
+ if (constraints_satisfied_p (ospec_tmpl, spec_args))
{
list = tree_cons (spec_args, ospec_tmpl, list);
TREE_TYPE (list) = TREE_TYPE (t);
@@ -26089,13 +26084,11 @@ most_specialized_partial_spec (tree target, tsubst_flags_t complain)
if (! list)
return NULL_TREE;
- ambiguous_p = false;
- t = list;
- champ = t;
- t = TREE_CHAIN (t);
- for (; t; t = TREE_CHAIN (t))
+ tree champ = list;
+ bool ambiguous_p = false;
+ for (tree t = TREE_CHAIN (list); t; t = TREE_CHAIN (t))
{
- fate = more_specialized_partial_spec (tmpl, champ, t);
+ int fate = more_specialized_partial_spec (tmpl, champ, t);
if (fate == 1)
;
else
@@ -26114,9 +26107,9 @@ most_specialized_partial_spec (tree target, tsubst_flags_t complain)
}
if (!ambiguous_p)
- for (t = list; t && t != champ; t = TREE_CHAIN (t))
+ for (tree t = list; t && t != champ; t = TREE_CHAIN (t))
{
- fate = more_specialized_partial_spec (tmpl, champ, t);
+ int fate = more_specialized_partial_spec (tmpl, champ, t);
if (fate != 1)
{
ambiguous_p = true;
@@ -26135,7 +26128,7 @@ most_specialized_partial_spec (tree target, tsubst_flags_t complain)
else
error ("ambiguous template instantiation for %q#D", target);
str = ngettext ("candidate is:", "candidates are:", list_length (list));
- for (t = list; t; t = TREE_CHAIN (t))
+ for (tree t = list; t; t = TREE_CHAIN (t))
{
tree subst = build_tree_list (TREE_VALUE (t), TREE_PURPOSE (t));
inform (DECL_SOURCE_LOCATION (TREE_VALUE (t)),
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-04-26 19:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-26 19:43 [gcc r14-276] c++: micro-optimize most_specialized_partial_spec Patrick Palka
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).