On Mon, Aug 5, 2019 at 10:56 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > Adding SVE intrinsics on top of the existing AArch64 intrinsics blows > the 12-bit function_code in tree_function_decl. That bitfield has no > spare bits, but it comes at the end of the structure and is preceded > by a pointer, so on LP64 hosts there's currently a 32-bit hole at end. > > This patch therefore makes function_code an independent field and > moves the bitfield to the 32-bit hole. > > I wondered about instead making function_code 16 bits, so that the > patch leaves 28 spare bits instead of just 12. That seemed a bit > short-term though; I can't guarantee that we won't blow 16 bits once > the SVE2 functions are added... > > If we run out of bits again, we can start chomping from the top > of the enum. E.g. 24 bits should surely be enough, but there's > no point paying the overhead of the masking until we need it. > > Tested on aarch64-linux-gnu, armeb-eabi and x86_64-linux-gnu. > OK to install?
OK. Richard. > Richard > > > 2019-08-05 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * tree-core.h (tree_function_decl): Make function_code an > independent field. Group the remaining bitfields into bytes > and move decl_type so that it contines to be at a byte boundary. > Leave 12 bits for future expansion. > > Index: gcc/tree-core.h > =================================================================== > --- gcc/tree-core.h 2019-08-05 09:55:26.000000000 +0100 > +++ gcc/tree-core.h 2019-08-05 09:55:26.626500651 +0100 > @@ -1857,36 +1857,32 @@ struct GTY(()) tree_function_decl { > tree vindex; > > /* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is > - DECL_FUNCTION_CODE. Otherwise unused. > - ??? The bitfield needs to be able to hold all target function > - codes as well. */ > - ENUM_BITFIELD(built_in_function) function_code : 12; > - ENUM_BITFIELD(built_in_class) built_in_class : 2; > + DECL_FUNCTION_CODE. Otherwise unused. */ > + enum built_in_function function_code; > > + ENUM_BITFIELD(built_in_class) built_in_class : 2; > unsigned static_ctor_flag : 1; > unsigned static_dtor_flag : 1; > - > unsigned uninlinable : 1; > unsigned possibly_inlined : 1; > unsigned novops_flag : 1; > unsigned returns_twice_flag : 1; > + > unsigned malloc_flag : 1; > unsigned declared_inline_flag : 1; > unsigned no_inline_warning_flag : 1; > - > unsigned no_instrument_function_entry_exit : 1; > - > - /* Align the bitfield to boundary of a byte. */ > - ENUM_BITFIELD(function_decl_type) decl_type: 2; > - > unsigned no_limit_stack : 1; > unsigned disregard_inline_limits : 1; > unsigned pure_flag : 1; > unsigned looping_const_or_pure_flag : 1; > + > + /* Align the bitfield to boundary of a byte. */ > + ENUM_BITFIELD(function_decl_type) decl_type: 2; > unsigned has_debug_args_flag : 1; > unsigned versioned_function : 1; > > - /* 0 bits left. */ > + /* 12 bits left for future expansion. */ > }; > > struct GTY(()) tree_translation_unit_decl {