On Thu, Sep 14, 2023 at 10:54 AM Joseph Myers <jos...@codesourcery.com> wrote: > > On Wed, 13 Sep 2023, Ken Matsui via Gcc-patches wrote: > > > diff --git a/gcc/c/c-parser.h b/gcc/c/c-parser.h > > index 545f0f4d9eb..eed6deaf0f8 100644 > > --- a/gcc/c/c-parser.h > > +++ b/gcc/c/c-parser.h > > @@ -51,14 +51,14 @@ enum c_id_kind { > > /* A single C token after string literal concatenation and conversion > > of preprocessing tokens to tokens. */ > > struct GTY (()) c_token { > > + /* If this token is a keyword, this value indicates which keyword. > > + Otherwise, this value is RID_MAX. */ > > + ENUM_BITFIELD (rid) keyword : 16; > > /* The kind of token. */ > > ENUM_BITFIELD (cpp_ttype) type : 8; > > /* If this token is a CPP_NAME, this value indicates whether also > > declared as some kind of type. Otherwise, it is C_ID_NONE. */ > > ENUM_BITFIELD (c_id_kind) id_kind : 8; > > - /* If this token is a keyword, this value indicates which keyword. > > - Otherwise, this value is RID_MAX. */ > > - ENUM_BITFIELD (rid) keyword : 8; > > /* If this token is a CPP_PRAGMA, this indicates the pragma that > > was seen. Otherwise it is PRAGMA_NONE. */ > > ENUM_BITFIELD (pragma_kind) pragma_kind : 8; > > If you want to optimize layout, I'd expect flags to move so it can share > the same 32-bit unit as the pragma_kind bit-field (not sure if any changes > should be made to the declaration of flags to maximise the chance of such > sharing across different host bit-field ABIs). > > > diff --git a/gcc/cp/parser.h b/gcc/cp/parser.h > > index 6cbb9a8e031..3c3c482c6ce 100644 > > --- a/gcc/cp/parser.h > > +++ b/gcc/cp/parser.h > > @@ -40,11 +40,11 @@ struct GTY(()) tree_check { > > /* A C++ token. */ > > > > struct GTY (()) cp_token { > > - /* The kind of token. */ > > - enum cpp_ttype type : 8; > > /* If this token is a keyword, this value indicates which keyword. > > Otherwise, this value is RID_MAX. */ > > - enum rid keyword : 8; > > + enum rid keyword : 16; > > + /* The kind of token. */ > > + enum cpp_ttype type : 8; > > /* Token flags. */ > > unsigned char flags; > > /* True if this token is from a context where it is implicitly extern > > "C" */ > > You're missing an update to the "3 unused bits." comment further down. > > > @@ -988,7 +988,7 @@ struct GTY(()) cpp_hashnode { > > unsigned int directive_index : 7; /* If is_directive, > > then index into directive table. > > Otherwise, a NODE_OPERATOR. */ > > - unsigned int rid_code : 8; /* Rid code - for front ends. */ > > + unsigned int rid_code : 16; /* Rid code - for front ends. > > */ > > unsigned int flags : 9; /* CPP flags. */ > > ENUM_BITFIELD(node_type) type : 2; /* CPP node type. */ > > You're missing an update to the "5 bits spare." comment further down. > > Do you have any figures for the effects on compilation time or memory > usage from the increase in size of these structures? >
Here is the benchmark result: https://github.com/ken-matsui/gsoc23/tree/main/reports/gcc-build I can see regression for compilation time but not for memory. * Time: +0.950995% * Memory: No difference proven at 95.0% confidence Sincerely, Ken Matsui > -- > Joseph S. Myers > jos...@codesourcery.com