This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] cache auto/decltype(auto) identifiers
- From: Nathan Sidwell <nathan at acm dot org>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Jason Merrill <jason at redhat dot com>
- Date: Wed, 7 Dec 2016 07:54:41 -0500
- Subject: [C++ PATCH] cache auto/decltype(auto) identifiers
- Authentication-results: sourceware.org; auth=none
While lookign at generic lambda mangling, I noticed we like to use
'get_identifier ("auto")' a lot. Particularly in is_auto, which is
called during tree walking. That's needlessly expensive.
Fixed by adding a couple of new global identifiers. Committed.
nathan
--
Nathan Sidwell
2016-12-07 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (enum cp_tree_index): Add CPTI_AUTO_IDENTIFIER &
CPTI_DECLTYPE_AUTO_IDENTIFIER.
(auto_identifier, decltype_auto_identifier): New.
*decl.c (initialize_predefined_identifiers): Add 'auto' and
'decltype(auto)'.
(grokdeclarator): Use cached identifier.
* pt.c (make_decltype_auto, make_auto, make_constrained_auto,
is_auto): Likewise.
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h (revision 243314)
+++ cp/cp-tree.h (working copy)
@@ -1117,6 +1117,8 @@ enum cp_tree_index
CPTI_PFN_IDENTIFIER,
CPTI_VPTR_IDENTIFIER,
CPTI_STD_IDENTIFIER,
+ CPTI_AUTO_IDENTIFIER,
+ CPTI_DECLTYPE_AUTO_IDENTIFIER,
CPTI_LANG_NAME_C,
CPTI_LANG_NAME_CPLUSPLUS,
@@ -1200,6 +1202,9 @@ extern GTY(()) tree cp_global_trees[CPTI
#define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER]
/* The name of the std namespace. */
#define std_identifier cp_global_trees[CPTI_STD_IDENTIFIER]
+/* auto and declspec(auto) identifiers. */
+#define auto_identifier cp_global_trees[CPTI_AUTO_IDENTIFIER]
+#define decltype_auto_identifier cp_global_trees[CPTI_DECLTYPE_AUTO_IDENTIFIER]
/* The name of a C++17 deduction guide. */
#define lang_name_c cp_global_trees[CPTI_LANG_NAME_C]
#define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
Index: cp/decl.c
===================================================================
--- cp/decl.c (revision 243314)
+++ cp/decl.c (working copy)
@@ -4034,6 +4034,8 @@ initialize_predefined_identifiers (void)
{ "__vtt_parm", &vtt_parm_identifier, 0 },
{ "::", &global_scope_name, 0 },
{ "std", &std_identifier, 0 },
+ { "auto", &auto_identifier, 0 },
+ { "decltype(auto)", &decltype_auto_identifier, 0 },
{ NULL, NULL, 0 }
};
@@ -10600,7 +10602,7 @@ grokdeclarator (const cp_declarator *dec
gcc_unreachable ();
}
if (TREE_CODE (type) != TEMPLATE_TYPE_PARM
- || TYPE_IDENTIFIER (type) != get_identifier ("auto"))
+ || TYPE_IDENTIFIER (type) != auto_identifier)
{
if (type != error_mark_node)
{
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 243314)
+++ cp/pt.c (working copy)
@@ -24302,13 +24302,13 @@ make_auto_1 (tree name, bool set_canonic
tree
make_decltype_auto (void)
{
- return make_auto_1 (get_identifier ("decltype(auto)"), true);
+ return make_auto_1 (decltype_auto_identifier, true);
}
tree
make_auto (void)
{
- return make_auto_1 (get_identifier ("auto"), true);
+ return make_auto_1 (auto_identifier, true);
}
/* Return a C++17 deduction placeholder for class template TMPL. */
@@ -24330,7 +24330,7 @@ make_template_placeholder (tree tmpl)
tree
make_constrained_auto (tree con, tree args)
{
- tree type = make_auto_1 (get_identifier ("auto"), false);
+ tree type = make_auto_1 (auto_identifier, false);
/* Build the constraint. */
tree tmpl = DECL_TI_TEMPLATE (con);
@@ -25016,8 +25016,8 @@ bool
is_auto (const_tree type)
{
if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
- && (TYPE_IDENTIFIER (type) == get_identifier ("auto")
- || TYPE_IDENTIFIER (type) == get_identifier ("decltype(auto)")
+ && (TYPE_IDENTIFIER (type) == auto_identifier
+ || TYPE_IDENTIFIER (type) == decltype_auto_identifier
|| CLASS_PLACEHOLDER_TEMPLATE (type)))
return true;
else