diff mbox series

c++: clean up cp_identifier_kind checks

Message ID 20240808153104.1953795-1-ppalka@redhat.com
State New
Headers show
Series c++: clean up cp_identifier_kind checks | expand

Commit Message

Patrick Palka Aug. 8, 2024, 3:31 p.m. UTC
The predicates for checking an IDENTIFIER node's cp_identifier_kind
currently directly test the three flag bits that encode the kind.  This
patch instead makes the checks first reconstruct the cp_identifier_kind
in its entirety and then compare that.

gcc/cp/ChangeLog:

	* cp-tree.h (get_identifier_kind): Define.
	(IDENTIFIER_KEYWORD_P): Redefine using get_identifier_kind.
	(IDENTIFIER_CDTOR_P): Likewise.
	(IDENTIFIER_CTOR_P): Likewise.
	(IDENTIFIER_DTOR_P): Likewise.
	(IDENTIFIER_ANY_OP_P): Likewise.
	(IDENTIFIER_OVL_OP_P): Likewise.
	(IDENTIFIER_ASSIGN_OP_P): Likewise.
	(IDENTIFIER_CONV_OP_P): Likewise.
	(IDENTIFIER_TRAIT_P): Likewise.
	* parser.cc (cp_lexer_peek_trait): Mark IDENTIFIER_TRAIT_P
	test UNLIKELY.
---
 gcc/cp/cp-tree.h | 41 +++++++++++++++++++++--------------------
 gcc/cp/parser.cc |  3 ++-
 2 files changed, 23 insertions(+), 21 deletions(-)

Comments

Jason Merrill Aug. 9, 2024, 5:15 p.m. UTC | #1
On 8/8/24 11:31 AM, Patrick Palka wrote:
> The predicates for checking an IDENTIFIER node's cp_identifier_kind
> currently directly test the three flag bits that encode the kind.  This
> patch instead makes the checks first reconstruct the cp_identifier_kind
> in its entirety and then compare that.

OK.

> gcc/cp/ChangeLog:
> 
> 	* cp-tree.h (get_identifier_kind): Define.
> 	(IDENTIFIER_KEYWORD_P): Redefine using get_identifier_kind.
> 	(IDENTIFIER_CDTOR_P): Likewise.
> 	(IDENTIFIER_CTOR_P): Likewise.
> 	(IDENTIFIER_DTOR_P): Likewise.
> 	(IDENTIFIER_ANY_OP_P): Likewise.
> 	(IDENTIFIER_OVL_OP_P): Likewise.
> 	(IDENTIFIER_ASSIGN_OP_P): Likewise.
> 	(IDENTIFIER_CONV_OP_P): Likewise.
> 	(IDENTIFIER_TRAIT_P): Likewise.
> 	* parser.cc (cp_lexer_peek_trait): Mark IDENTIFIER_TRAIT_P
> 	test UNLIKELY.
> ---
>   gcc/cp/cp-tree.h | 41 +++++++++++++++++++++--------------------
>   gcc/cp/parser.cc |  3 ++-
>   2 files changed, 23 insertions(+), 21 deletions(-)
> 
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index b81bc91208f..0c25ec5a04e 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -1255,56 +1255,57 @@ enum cp_identifier_kind {
>   #define IDENTIFIER_VIRTUAL_P(NODE) \
>     TREE_LANG_FLAG_5 (IDENTIFIER_NODE_CHECK (NODE))
>   
> +/* Return the cp_identifier_kind of the given IDENTIFIER node ID.  */
> +
> +ATTRIBUTE_PURE inline cp_identifier_kind
> +get_identifier_kind (tree id)
> +{
> +  unsigned bit0 = IDENTIFIER_KIND_BIT_0 (id);
> +  unsigned bit1 = IDENTIFIER_KIND_BIT_1 (id);
> +  unsigned bit2 = IDENTIFIER_KIND_BIT_2 (id);
> +  return cp_identifier_kind ((bit2 << 2) | (bit1 << 1) | bit0);
> +}
> +
>   /* True if this identifier is a reserved word.  C_RID_CODE (node) is
>      then the RID_* value of the keyword.  Value 1.  */
>   #define IDENTIFIER_KEYWORD_P(NODE)		\
> -  ((!IDENTIFIER_KIND_BIT_2 (NODE))		\
> -   & (!IDENTIFIER_KIND_BIT_1 (NODE))		\
> -   & IDENTIFIER_KIND_BIT_0 (NODE))
> +  (get_identifier_kind (NODE) == cik_keyword)
>   
>   /* True if this identifier is the name of a constructor or
>      destructor.  Value 2 or 3.  */
>   #define IDENTIFIER_CDTOR_P(NODE)		\
> -  ((!IDENTIFIER_KIND_BIT_2 (NODE))		\
> -   & IDENTIFIER_KIND_BIT_1 (NODE))
> +  (IDENTIFIER_CTOR_P (NODE) || IDENTIFIER_DTOR_P (NODE))
>   
>   /* True if this identifier is the name of a constructor.  Value 2.  */
>   #define IDENTIFIER_CTOR_P(NODE)			\
> -  (IDENTIFIER_CDTOR_P(NODE)			\
> -    & (!IDENTIFIER_KIND_BIT_0 (NODE)))
> +  (get_identifier_kind (NODE) == cik_ctor)
>   
>   /* True if this identifier is the name of a destructor.  Value 3.  */
>   #define IDENTIFIER_DTOR_P(NODE)			\
> -  (IDENTIFIER_CDTOR_P(NODE)			\
> -    & IDENTIFIER_KIND_BIT_0 (NODE))
> +  (get_identifier_kind (NODE) == cik_dtor)
>   
>   /* True if this identifier is for any operator name (including
>      conversions).  Value 4, 5, or 6.  */
>   #define IDENTIFIER_ANY_OP_P(NODE)		\
> -  (IDENTIFIER_KIND_BIT_2 (NODE) && !IDENTIFIER_TRAIT_P (NODE))
> +  (IDENTIFIER_OVL_OP_P (NODE) || IDENTIFIER_CONV_OP_P (NODE))
>   
>   /* True if this identifier is for an overloaded operator. Values 4, 5.  */
>   #define IDENTIFIER_OVL_OP_P(NODE)		\
> -  (IDENTIFIER_ANY_OP_P (NODE)			\
> -   & (!IDENTIFIER_KIND_BIT_1 (NODE)))
> +  (get_identifier_kind (NODE) == cik_simple_op  \
> +   || get_identifier_kind (NODE) == cik_assign_op)
>   
>   /* True if this identifier is for any assignment. Values 5.  */
>   #define IDENTIFIER_ASSIGN_OP_P(NODE)		\
> -  (IDENTIFIER_OVL_OP_P (NODE)			\
> -   & IDENTIFIER_KIND_BIT_0 (NODE))
> +  (get_identifier_kind (NODE) == cik_assign_op)
>   
>   /* True if this identifier is the name of a type-conversion
>      operator.  Value 6.  */
>   #define IDENTIFIER_CONV_OP_P(NODE)		\
> -  (IDENTIFIER_ANY_OP_P (NODE)			\
> -   & IDENTIFIER_KIND_BIT_1 (NODE)		\
> -   & (!IDENTIFIER_KIND_BIT_0 (NODE)))
> +  (get_identifier_kind (NODE) == cik_conv_op)
>   
>   /* True if this identifier is the name of a built-in trait.  */
>   #define IDENTIFIER_TRAIT_P(NODE)		\
> -  (IDENTIFIER_KIND_BIT_0 (NODE)			\
> -   & IDENTIFIER_KIND_BIT_1 (NODE)		\
> -   & IDENTIFIER_KIND_BIT_2 (NODE))
> +  (get_identifier_kind (NODE) == cik_trait)
>   
>   /* True if this identifier is a new or delete operator.  */
>   #define IDENTIFIER_NEWDEL_OP_P(NODE)		\
> diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
> index f625b0a310c..60ff41ec9fa 100644
> --- a/gcc/cp/parser.cc
> +++ b/gcc/cp/parser.cc
> @@ -1198,7 +1198,8 @@ static const cp_trait *
>   cp_lexer_peek_trait (cp_lexer *lexer)
>   {
>     const cp_token *token1 = cp_lexer_peek_token (lexer);
> -  if (token1->type == CPP_NAME && IDENTIFIER_TRAIT_P (token1->u.value))
> +  if (token1->type == CPP_NAME
> +      && UNLIKELY (IDENTIFIER_TRAIT_P (token1->u.value)))
>       {
>         const cp_trait &trait = cp_traits[IDENTIFIER_CP_INDEX (token1->u.value)];
>         const bool is_pack_element = (trait.kind == CPTK_TYPE_PACK_ELEMENT);
diff mbox series

Patch

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index b81bc91208f..0c25ec5a04e 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1255,56 +1255,57 @@  enum cp_identifier_kind {
 #define IDENTIFIER_VIRTUAL_P(NODE) \
   TREE_LANG_FLAG_5 (IDENTIFIER_NODE_CHECK (NODE))
 
+/* Return the cp_identifier_kind of the given IDENTIFIER node ID.  */
+
+ATTRIBUTE_PURE inline cp_identifier_kind
+get_identifier_kind (tree id)
+{
+  unsigned bit0 = IDENTIFIER_KIND_BIT_0 (id);
+  unsigned bit1 = IDENTIFIER_KIND_BIT_1 (id);
+  unsigned bit2 = IDENTIFIER_KIND_BIT_2 (id);
+  return cp_identifier_kind ((bit2 << 2) | (bit1 << 1) | bit0);
+}
+
 /* True if this identifier is a reserved word.  C_RID_CODE (node) is
    then the RID_* value of the keyword.  Value 1.  */
 #define IDENTIFIER_KEYWORD_P(NODE)		\
-  ((!IDENTIFIER_KIND_BIT_2 (NODE))		\
-   & (!IDENTIFIER_KIND_BIT_1 (NODE))		\
-   & IDENTIFIER_KIND_BIT_0 (NODE))
+  (get_identifier_kind (NODE) == cik_keyword)
 
 /* True if this identifier is the name of a constructor or
    destructor.  Value 2 or 3.  */
 #define IDENTIFIER_CDTOR_P(NODE)		\
-  ((!IDENTIFIER_KIND_BIT_2 (NODE))		\
-   & IDENTIFIER_KIND_BIT_1 (NODE))
+  (IDENTIFIER_CTOR_P (NODE) || IDENTIFIER_DTOR_P (NODE))
 
 /* True if this identifier is the name of a constructor.  Value 2.  */
 #define IDENTIFIER_CTOR_P(NODE)			\
-  (IDENTIFIER_CDTOR_P(NODE)			\
-    & (!IDENTIFIER_KIND_BIT_0 (NODE)))
+  (get_identifier_kind (NODE) == cik_ctor)
 
 /* True if this identifier is the name of a destructor.  Value 3.  */
 #define IDENTIFIER_DTOR_P(NODE)			\
-  (IDENTIFIER_CDTOR_P(NODE)			\
-    & IDENTIFIER_KIND_BIT_0 (NODE))
+  (get_identifier_kind (NODE) == cik_dtor)
 
 /* True if this identifier is for any operator name (including
    conversions).  Value 4, 5, or 6.  */
 #define IDENTIFIER_ANY_OP_P(NODE)		\
-  (IDENTIFIER_KIND_BIT_2 (NODE) && !IDENTIFIER_TRAIT_P (NODE))
+  (IDENTIFIER_OVL_OP_P (NODE) || IDENTIFIER_CONV_OP_P (NODE))
 
 /* True if this identifier is for an overloaded operator. Values 4, 5.  */
 #define IDENTIFIER_OVL_OP_P(NODE)		\
-  (IDENTIFIER_ANY_OP_P (NODE)			\
-   & (!IDENTIFIER_KIND_BIT_1 (NODE)))
+  (get_identifier_kind (NODE) == cik_simple_op  \
+   || get_identifier_kind (NODE) == cik_assign_op)
 
 /* True if this identifier is for any assignment. Values 5.  */
 #define IDENTIFIER_ASSIGN_OP_P(NODE)		\
-  (IDENTIFIER_OVL_OP_P (NODE)			\
-   & IDENTIFIER_KIND_BIT_0 (NODE))
+  (get_identifier_kind (NODE) == cik_assign_op)
 
 /* True if this identifier is the name of a type-conversion
    operator.  Value 6.  */
 #define IDENTIFIER_CONV_OP_P(NODE)		\
-  (IDENTIFIER_ANY_OP_P (NODE)			\
-   & IDENTIFIER_KIND_BIT_1 (NODE)		\
-   & (!IDENTIFIER_KIND_BIT_0 (NODE)))
+  (get_identifier_kind (NODE) == cik_conv_op)
 
 /* True if this identifier is the name of a built-in trait.  */
 #define IDENTIFIER_TRAIT_P(NODE)		\
-  (IDENTIFIER_KIND_BIT_0 (NODE)			\
-   & IDENTIFIER_KIND_BIT_1 (NODE)		\
-   & IDENTIFIER_KIND_BIT_2 (NODE))
+  (get_identifier_kind (NODE) == cik_trait)
 
 /* True if this identifier is a new or delete operator.  */
 #define IDENTIFIER_NEWDEL_OP_P(NODE)		\
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index f625b0a310c..60ff41ec9fa 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -1198,7 +1198,8 @@  static const cp_trait *
 cp_lexer_peek_trait (cp_lexer *lexer)
 {
   const cp_token *token1 = cp_lexer_peek_token (lexer);
-  if (token1->type == CPP_NAME && IDENTIFIER_TRAIT_P (token1->u.value))
+  if (token1->type == CPP_NAME
+      && UNLIKELY (IDENTIFIER_TRAIT_P (token1->u.value)))
     {
       const cp_trait &trait = cp_traits[IDENTIFIER_CP_INDEX (token1->u.value)];
       const bool is_pack_element = (trait.kind == CPTK_TYPE_PACK_ELEMENT);