On 3/12/07, Richard Kenner <[EMAIL PROTECTED]> wrote:
> It's going to have a big performance impact. To extract a 9-bit value,
> the compiler will need to do a lot of masking every time it accesses
> the TREE_CODE.

"a lot masking" means at most two additional instructions, one if we
put it in the right place.  I'd be shocked if we could even measure
this, let alone be a "big" performance impact.

I went ahead and implemented this, to see what the real impact would
be. The following patch frees up TREE_LANG_FLAG_5, and uses that extra
bit for the tree code.

On tramp3d, memory usage remains the same (obviously), and the
performance results are not as bad as I had imagined:

8-bit tree code, --enable-checking:

real    1m56.776s
user    1m54.995s
sys     0m0.541s

9-bit tree code, --enable-checking:

real    2m16.095s
user    2m12.132s
sys     0m0.562s

8-bit tree code, --disable-checking:

real    0m55.693s
user    0m43.734s
sys     0m0.414s

9-bit tree code, --disable-checking:

real    0m58.821s
user    0m46.122s
sys     0m0.443s

So, about 16% slower with --enable-checking, 5% slower with --disable-checking.

Subcodes might still be the way to go, but I'm feeling less bad about
the 9-bit tree code option.

 Cheers,
 Doug

2007-03-19  Douglas Gregor  <[EMAIL PROTECTED]>

        * java-tree.h (HAS_BEEN_ALREADY_PARSED_P): Move to TREE_PROTECTED.

2007-03-19  Douglas Gregor  <[EMAIL PROTECTED]>

        * tree.c (tree_contains_struct): Support 512 tree codes.
        * tree.h (tree_contains_struct): Ditto.
        (MAX_TREE_CODES): We now support 512 tree codes.
        (struct tree_base): Make "code" 9 bits, remove lang_flag_5.
        (TREE_LANG_FLAG_5): Remove.
        (BINFO_FLAG_5): Remove.
        * print-tree.c (print_node): Don't print TREE_LANG_FLAG_5.
        
2007-03-19  Douglas Gregor  <[EMAIL PROTECTED]>

        * cp-tree.h (C_IS_RESERVED_WORD): Move to TREE_PROTECTED.
        (BINFO_PRIMARY_P): Move to BINFO_FLAG_6.
        (DECL_VTABLE_OR_VTT_P): Move to nothrow_flag.

Index: java/java-tree.h
===================================================================
--- java/java-tree.h    (revision 122993)
+++ java/java-tree.h    (working copy)
@@ -48,7 +48,6 @@ struct JCF;
   3: HAS_FINALIZER (in RECORD_TYPE)
   4: IS_A_COMMAND_LINE_FILENAME_P (in IDENTIFIER_NODE)
      IS_ARRAY_LENGTH_ACCESS (in INDIRECT_REF)
-   5: HAS_BEEN_ALREADY_PARSED_P (in IDENTIFIER_NODE)
   6: CAN_COMPLETE_NORMALLY (in statement nodes)

   Usage of TYPE_LANG_FLAG_?:
@@ -1521,7 +1520,7 @@ extern tree *type_map;
#define IS_A_COMMAND_LINE_FILENAME_P(ID) TREE_LANG_FLAG_4 (ID)

/* True if filename ID has already been parsed */
-#define HAS_BEEN_ALREADY_PARSED_P(ID) TREE_LANG_FLAG_5 (ID)
+#define HAS_BEEN_ALREADY_PARSED_P(ID) TREE_PROTECTED (ID)

/* True if TYPE (a TREE_TYPE denoting a class type) was found to
   feature a finalizer method. */
Index: tree.c
===================================================================
--- tree.c      (revision 122993)
+++ tree.c      (working copy)
@@ -168,7 +168,7 @@ static unsigned int attribute_hash_list
tree global_trees[TI_MAX];
tree integer_types[itk_none];

-unsigned char tree_contains_struct[256][64];
+unsigned char tree_contains_struct[512][64];

/* Number of operands for each OpenMP clause.  */
unsigned const char omp_clause_num_ops[] =
Index: tree.h
===================================================================
--- tree.h      (revision 122993)
+++ tree.h      (working copy)
@@ -41,7 +41,7 @@ enum tree_code {

#undef DEFTREECODE

-extern unsigned char tree_contains_struct[256][64];
+extern unsigned char tree_contains_struct[512][64];
#define CODE_CONTAINS_STRUCT(CODE, STRUCT)
(tree_contains_struct[(CODE)][(STRUCT)])

/* Number of language-independent tree codes.  */
@@ -80,7 +80,7 @@ extern const char *const tree_code_class
#define TREE_CODE_CLASS_STRING(CLASS)\
        tree_code_class_strings[(int) (CLASS)]

-#define MAX_TREE_CODES 256
+#define MAX_TREE_CODES 512
extern const enum tree_code_class tree_code_type[];
#define TREE_CODE_CLASS(CODE)   tree_code_type[(int) (CODE)]

@@ -363,7 +363,7 @@ union tree_ann_d;

struct tree_base GTY(())
{
-  ENUM_BITFIELD(tree_code) code : 8;
+  ENUM_BITFIELD(tree_code) code : 9;

  unsigned side_effects_flag : 1;
  unsigned constant_flag : 1;
@@ -388,7 +388,8 @@ struct tree_base GTY(())
  unsigned lang_flag_2 : 1;
  unsigned lang_flag_3 : 1;
  unsigned lang_flag_4 : 1;
-  unsigned lang_flag_5 : 1;
+  /* NOTE: lang_flag_5 is intentionally absent; it was been used for the 9th
+     bit of code.  */
  unsigned lang_flag_6 : 1;
  unsigned visited : 1;

@@ -485,6 +486,12 @@ struct gimple_stmt GTY(())
       CALL_FROM_THUNK_P in
           CALL_EXPR

+       C_IS_RESERVED_WORD in
+         IDENTIFIER_NODE (C++ only)
+
+       HAS_BEEN_ALREADY_PARSED_P in
+         IDENTIFIER_NODE (Java only)
+
   side_effects_flag:

       TREE_SIDE_EFFECTS in
@@ -549,6 +556,9 @@ struct gimple_stmt GTY(())
       TREE_THIS_NOTRAP in
          (ALIGN/MISALIGNED_)INDIRECT_REF, ARRAY_REF, ARRAY_RANGE_REF

+       DECL_VTABLE_OR_VTT_P in
+          VAR_DECL (C++ only)
+
   deprecated_flag:

        TREE_DEPRECATED in
@@ -1296,7 +1306,8 @@ extern void omp_clause_range_check_faile
/* Used in classes in C++.  */
#define TREE_PRIVATE(NODE) ((NODE)->base.private_flag)
/* Used in classes in C++.
-   In a BLOCK node, this is BLOCK_HANDLER_BLOCK.  */
+   In a BLOCK node, this is BLOCK_HANDLER_BLOCK.
+   In a C++ IDENTIFIER_NODE, this is C_IS_RESERVED_WORD.  */
#define TREE_PROTECTED(NODE) ((NODE)->base.protected_flag)

/* Nonzero in a _DECL if the use of the name is defined as a
@@ -1321,7 +1332,6 @@ extern void omp_clause_range_check_faile
#define TREE_LANG_FLAG_2(NODE) ((NODE)->base.lang_flag_2)
#define TREE_LANG_FLAG_3(NODE) ((NODE)->base.lang_flag_3)
#define TREE_LANG_FLAG_4(NODE) ((NODE)->base.lang_flag_4)
-#define TREE_LANG_FLAG_5(NODE) ((NODE)->base.lang_flag_5)
#define TREE_LANG_FLAG_6(NODE) ((NODE)->base.lang_flag_6)

/* Define additional fields and accessors for nodes representing constants.  */
@@ -2286,7 +2296,6 @@ struct tree_type GTY(())
#define BINFO_FLAG_2(NODE) TREE_LANG_FLAG_2(TREE_BINFO_CHECK(NODE))
#define BINFO_FLAG_3(NODE) TREE_LANG_FLAG_3(TREE_BINFO_CHECK(NODE))
#define BINFO_FLAG_4(NODE) TREE_LANG_FLAG_4(TREE_BINFO_CHECK(NODE))
-#define BINFO_FLAG_5(NODE) TREE_LANG_FLAG_5(TREE_BINFO_CHECK(NODE))
#define BINFO_FLAG_6(NODE) TREE_LANG_FLAG_6(TREE_BINFO_CHECK(NODE))

/* The actual data type node being inherited in this basetype.  */
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h        (revision 122993)
+++ cp/cp-tree.h        (working copy)
@@ -80,8 +80,6 @@ struct diagnostic_context;
          or FIELD_DECL).
      IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
      DECL_TINFO_P (in VAR_DECL)
-   5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE)
-      DECL_VTABLE_OR_VTT_P (in VAR_DECL)
   6: IDENTIFIER_REPO_CHOSEN (in IDENTIFIER_NODE)
      DECL_CONSTRUCTION_VTABLE_P (in VAR_DECL)
      TYPE_MARKED_P (in _TYPE)
@@ -212,7 +210,7 @@ struct lang_identifier GTY(())
   keyword.  C_RID_CODE (node) is then the RID_* value of the keyword,
   and C_RID_YYCODE is the token number wanted by Yacc.  */

-#define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_5 (ID)
+#define C_IS_RESERVED_WORD(ID) TREE_PROTECTED (ID)

#define LANG_IDENTIFIER_CAST(NODE) \
        ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE))
@@ -1465,7 +1463,7 @@ struct lang_type GTY(())
#define BINFO_LOST_PRIMARY_P(NODE) BINFO_FLAG_4 (NODE)

/* Nonzero if this BINFO is a primary base class.  */
-#define BINFO_PRIMARY_P(NODE) BINFO_FLAG_5(NODE)
+#define BINFO_PRIMARY_P(NODE) BINFO_FLAG_6(NODE)

/* Used by various search routines.  */
#define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE)
@@ -2031,7 +2029,8 @@ struct lang_decl GTY(())
#define DECL_TINFO_P(NODE) TREE_LANG_FLAG_4 (VAR_DECL_CHECK (NODE))

/* 1 iff VAR_DECL node NODE is virtual table or VTT.  */
-#define DECL_VTABLE_OR_VTT_P(NODE) TREE_LANG_FLAG_5 (VAR_DECL_CHECK (NODE))
+#define DECL_VTABLE_OR_VTT_P(NODE)                      \
+  (VAR_DECL_CHECK (NODE)->base.nothrow_flag)

/* Returns 1 iff VAR_DECL is a construction virtual table.
   DECL_VTABLE_OR_VTT_P will be true in this case and must be checked
Index: print-tree.c
===================================================================
--- print-tree.c        (revision 122993)
+++ print-tree.c        (working copy)
@@ -314,8 +314,6 @@ print_node (FILE *file, const char *pref
    fputs (" tree_3", file);
  if (TREE_LANG_FLAG_4 (node))
    fputs (" tree_4", file);
-  if (TREE_LANG_FLAG_5 (node))
-    fputs (" tree_5", file);
  if (TREE_LANG_FLAG_6 (node))
    fputs (" tree_6", file);

Reply via email to