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 {

Reply via email to