diff mbox series

Make function_code a 32-bit field

Message ID mptsgqgc7n8.fsf@arm.com
State New
Headers show
Series Make function_code a 32-bit field | expand

Commit Message

Richard Sandiford Aug. 5, 2019, 8:56 a.m. UTC
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?

Richard


2019-08-05  Richard Sandiford  <richard.sandiford@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.

Comments

Richard Biener Aug. 5, 2019, 12:04 p.m. UTC | #1
On Mon, Aug 5, 2019 at 10:56 AM Richard Sandiford
<richard.sandiford@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.sandiford@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 {
diff mbox series

Patch

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 {