[PATCH] pack structures better on 64-bit hosts

Nathan Froyd froydnj@codesourcery.com
Thu Apr 22 06:19:00 GMT 2010


The patch below is the result of spending quality time with pahole on an
x86-64 host.  The changes suggested by pahole range from the
almost-useless (diagnostic-context.h) to the possibly-useful (df.h,
c-tree.h, cp-tree.h).  I've attached the output from pahole (in emacs
org format) showing before/after formats for each affected structure so
the effects of the patch are somewhat more understandable.

No, I haven't measured the effect of these changes.

Bootstrapped on x86-64-linux-gnu.  OK to commit?

-Nathan

gcc/
	* basic-block.h (struct control_flow_graph): Move last_label_uid field up.
	* c-parser.c (struct c_token): Move location field up.
	* c-tree.h (struct c_typespec): Move expr_const_operands field up.
	(struct c_declspecs): Convert typespec_word, storage_class, and
	default_int_p into bitfields.
	(struct c_declarator): Move loc field up.
	* cfgloop.h (struct loop): Move can_be_parallel field up.
	* df.h (struct df_base_ref): Move regno field up.
	* diagnostic.h (struct diagnostic_context): Move classify_diagnostic
	field down.
	* dwarf2out.c (struct dw_fde_struct): Move funcdef_number field down.
	* expr.h (struct separate_ops): Move location field up.
	* ipa-prop.h (struct ipa_node_params): Move bitfields up.
	* optabs.h (struct optab_d): Move libcall_basename field down.
	* tree-ssa-loop-ivopts.c (struct version_info): Move inv_id field down.
	(struct iv_cand): Convert pos field into a bitfield.
	* tree-vectorizer.h (struct _loop_vec_info): Move loop_line_number field up.
	(struct _stmt_vec_info): Shuffle fields for better packing.
	* config/i386/i386.c (struct ix86_frame): Move red_zone_size up.
	* config/i386/i386.h (struct machine_function): Convert call_abi field
	into a bitfield.  Move cfa field to the end of the structure.

gcc/cp/
	* cp-tree.h (struct cp_decl_specifier_seq): Move type_location field up.
	(struct cp_declarator): Move id_loc field up.

diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 34b18bd..836c23e 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -389,6 +389,9 @@ struct GTY(()) control_flow_graph {
   /* The first free basic block number.  */
   int x_last_basic_block;
 
+  /* UIDs for LABEL_DECLs.  */
+  int last_label_uid;
+
   /* Mapping of labels to their associated blocks.  At present
      only used for the gimple CFG.  */
   VEC(basic_block,gc) *x_label_to_block_map;
@@ -404,9 +407,6 @@ struct GTY(()) control_flow_graph {
   /* Maximal number of entities in the single jumptable.  Used to estimate
      final flowgraph size.  */
   int max_jumptable_ents;
-
-  /* UIDs for LABEL_DECLs.  */
-  int last_label_uid;
 };
 
 /* Defines for accessing the fields of the CFG structure for function FN.  */
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 27f0b81..62f1ea3 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -156,10 +156,10 @@ typedef struct GTY (()) c_token {
   /* 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;
-  /* The value associated with this token, if any.  */
-  tree value;
   /* The location at which this token was found.  */
   location_t location;
+  /* The value associated with this token, if any.  */
+  tree value;
 } c_token;
 
 /* A parser structure recording information about the state and
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index 3681ed7..882f545 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -160,6 +160,9 @@ enum c_typespec_kind {
 struct c_typespec {
   /* What kind of type specifier this is.  */
   enum c_typespec_kind kind;
+  /* Whether the expression has operands suitable for use in constant
+     expressions.  */
+  bool expr_const_operands;
   /* The specifier itself.  */
   tree spec;
   /* An expression to be evaluated before the type specifier, in the
@@ -171,9 +174,6 @@ struct c_typespec {
      expression itself (as opposed to the array sizes) forms no part
      of the type and so needs to be recorded separately.  */
   tree expr;
-  /* Whether the expression has operands suitable for use in constant
-     expressions.  */
-  bool expr_const_operands;
 };
 
 /* A storage class specifier.  */
@@ -220,11 +220,11 @@ struct c_declspecs {
      NULL; attributes (possibly from multiple lists) will be passed
      separately.  */
   tree attrs;
-  /* Any type specifier keyword used such as "int", not reflecting
-     modifiers such as "short", or cts_none if none.  */
-  enum c_typespec_keyword typespec_word;
   /* The storage class specifier, or csc_none if none.  */
   enum c_storage_class storage_class;
+  /* Any type specifier keyword used such as "int", not reflecting
+     modifiers such as "short", or cts_none if none.  */
+  ENUM_BITFIELD (c_typespec_keyword) typespec_word : 8;
   /* Whether any expressions in typeof specifiers may appear in
      constant expressions.  */
   BOOL_BITFIELD expr_const_operands : 1;
@@ -252,7 +252,7 @@ struct c_declspecs {
   BOOL_BITFIELD deprecated_p : 1;
   /* Whether the type defaulted to "int" because there were no type
      specifiers.  */
-  BOOL_BITFIELD default_int_p;
+  BOOL_BITFIELD default_int_p : 1;
   /* Whether "long" was specified.  */
   BOOL_BITFIELD long_p : 1;
   /* Whether "long" was specified more than once.  */
@@ -319,9 +319,9 @@ struct c_arg_info {
 struct c_declarator {
   /* The kind of declarator.  */
   enum c_declarator_kind kind;
+  location_t id_loc; /* Currently only set for cdk_id, cdk_array. */
   /* Except for cdk_id, the contained declarator.  For cdk_id, NULL.  */
   struct c_declarator *declarator;
-  location_t id_loc; /* Currently only set for cdk_id, cdk_array. */
   union {
     /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract
        declarator.  */
diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
index 26f9050..4135ed7 100644
--- a/gcc/cfgloop.h
+++ b/gcc/cfgloop.h
@@ -148,6 +148,9 @@ struct GTY ((chain_next ("%h.next"))) loop {
   bool any_upper_bound;
   bool any_estimate;
 
+  /* True if the loop can be parallel.  */
+  bool can_be_parallel;
+
   /* An integer estimation of the number of iterations.  Estimate_state
      describes what is the state of the estimation.  */
   enum loop_estimation estimate_state;
@@ -158,9 +161,6 @@ struct GTY ((chain_next ("%h.next"))) loop {
   /* Head of the cyclic list of the exits of the loop.  */
   struct loop_exit *exits;
 
-  /* True if the loop can be parallel.  */
-  bool can_be_parallel;
-
   /* The single induction variable of the loop when the loop is in
      normal form.  */
   tree single_iv;
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index f91410a..7b094dc 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -1759,10 +1759,10 @@ struct ix86_frame
   int nregs;
   int padding1;
   int va_arg_size;
+  int red_zone_size;
   HOST_WIDE_INT frame;
   int padding2;
   int outgoing_arguments_size;
-  int red_zone_size;
 
   HOST_WIDE_INT to_allocate;
   /* The offsets relative to ARG_POINTER.  */
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 4b83370..4f564a1 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2364,12 +2364,9 @@ struct GTY(()) machine_function {
      has been computed for.  */
   int use_fast_prologue_epilogue_nregs;
 
-  /* The CFA state at the end of the prologue.  */
-  struct machine_cfa_state cfa;
-
   /* This value is used for amd64 targets and specifies the current abi
      to be used. MS_ABI means ms abi. Otherwise SYSV_ABI means sysv abi.  */
-  enum calling_abi call_abi;
+  ENUM_BITFIELD(calling_abi) call_abi : 8;
 
   /* Nonzero if the function accesses a previous frame.  */
   BOOL_BITFIELD accesses_prev_frame : 1;
@@ -2395,6 +2392,9 @@ struct GTY(()) machine_function {
   /* If true, the current function has a STATIC_CHAIN is placed on the
      stack below the return address.  */
   BOOL_BITFIELD static_chain_on_stack : 1;
+
+  /* The CFA state at the end of the prologue.  */
+  struct machine_cfa_state cfa;
 };
 #endif
 
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 22ee2d7..5981f2c 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4363,14 +4363,14 @@ typedef enum cp_decl_spec {
 typedef struct cp_decl_specifier_seq {
   /* The number of times each of the keywords has been seen.  */
   unsigned specs[(int) ds_last];
+  /* The location of the primary type. Mainly used for error
+     reporting.  */
+  location_t type_location;
   /* The primary type, if any, given by the decl-specifier-seq.
      Modifiers, like "short", "const", and "unsigned" are not
      reflected here.  This field will be a TYPE, unless a typedef-name
      was used, in which case it will be a TYPE_DECL.  */
   tree type;
-  /* The location of the primary type. Mainly used for error
-     reporting.  */
-  location_t type_location;
   /* The attributes, if any, provided with the specifier sequence.  */
   tree attributes;
   /* If non-NULL, a built-in type that the user attempted to redefine
@@ -4438,12 +4438,12 @@ struct cp_declarator {
   /* Whether we parsed an ellipsis (`...') just before the declarator,
      to indicate this is a parameter pack.  */
   BOOL_BITFIELD parameter_pack_p : 1;
+  location_t id_loc; /* Currently only set for cdk_id and cdk_function. */
   /* Attributes that apply to this declarator.  */
   tree attributes;
   /* For all but cdk_id and cdk_error, the contained declarator.  For
      cdk_id and cdk_error, guaranteed to be NULL.  */
   cp_declarator *declarator;
-  location_t id_loc; /* Currently only set for cdk_id and cdk_function. */
   union {
     /* For identifiers.  */
     struct {
diff --git a/gcc/df.h b/gcc/df.h
index 194cbcf..2e9f19f 100644
--- a/gcc/df.h
+++ b/gcc/df.h
@@ -362,6 +362,7 @@ struct df_base_ref
   ENUM_BITFIELD(df_ref_type) type : 8;
 				/* Type of ref.  */
   int flags : 16;		/* Various df_ref_flags.  */
+  unsigned int regno;		/* The register number referenced.  */
   rtx reg;			/* The register referenced.  */
   struct df_link *chain;	/* Head of def-use, use-def.  */
   /* Pointer to the insn info of the containing instruction.  FIXME!
@@ -373,7 +374,6 @@ struct df_base_ref
      themselves rather than using an external structure.  */
   union df_ref_d *next_reg;     /* Next ref with same regno and type.  */
   union df_ref_d *prev_reg;     /* Prev ref with same regno and type.  */
-  unsigned int regno;		/* The register number referenced.  */
   /* Location in the ref table.  This is only valid after a call to
      df_maybe_reorganize_[use,def]_refs which is an expensive operation.  */
   int id;
diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
index 65e8c7f..3e0a032 100644
--- a/gcc/diagnostic.h
+++ b/gcc/diagnostic.h
@@ -74,13 +74,6 @@ struct diagnostic_context
   /* True if it has been requested that warnings be treated as errors.  */
   bool warning_as_error_requested;
 
-  /* For each option index that can be passed to warning() et all
-     (OPT_* from options.h), this array may contain a new kind that
-     the diagnostic should be changed to before reporting, or
-     DK_UNSPECIFIED to leave it as the reported kind, or DK_IGNORED to
-     not report it at all.  N_OPTS is from <options.h>.  */
-  diagnostic_t classify_diagnostic[N_OPTS];
-
   /* True if we should print the command line option which controls
      each diagnostic, if known.  */
   bool show_option_requested;
@@ -88,6 +81,13 @@ struct diagnostic_context
   /* True if we should raise a SIGABRT on errors.  */
   bool abort_on_error;
 
+  /* For each option index that can be passed to warning() et all
+     (OPT_* from options.h), this array may contain a new kind that
+     the diagnostic should be changed to before reporting, or
+     DK_UNSPECIFIED to leave it as the reported kind, or DK_IGNORED to
+     not report it at all.  N_OPTS is from <options.h>.  */
+  diagnostic_t classify_diagnostic[N_OPTS];
+
   /* This function is called before any message is printed out.  It is
      responsible for preparing message prefix and such.  For example, it
      might say:
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 6e76998..58be89b 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -305,8 +305,8 @@ typedef struct GTY(()) dw_fde_struct {
   const char *dw_fde_unlikely_section_end_label;
   dw_cfi_ref dw_fde_cfi;
   dw_cfi_ref dw_fde_switch_cfi; /* Last CFI before switching sections.  */
-  unsigned funcdef_number;
   HOST_WIDE_INT stack_realignment;
+  unsigned funcdef_number;
   /* Dynamic realign argument pointer register.  */
   unsigned int drap_reg;
   /* Virtual dynamic realign argument pointer register.  */
diff --git a/gcc/expr.h b/gcc/expr.h
index 4fddde6..af230a6 100644
--- a/gcc/expr.h
+++ b/gcc/expr.h
@@ -273,9 +273,9 @@ do {								\
 typedef struct separate_ops
 {
   enum tree_code code;
+  location_t location;
   tree type;
   tree op0, op1, op2;
-  location_t location;
 } *sepops;
 
 /* Functions from optabs.c, commonly used, and without need for the optabs
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 4cb2469..1df3abd 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -181,6 +181,15 @@ struct ipa_node_params
      this function's parameters would not be analyzed by the different
      stages of IPA CP.  */
   int param_count;
+  /* Whether this function is called with variable number of actual
+     arguments.  */
+  unsigned called_with_var_arguments : 1;
+  /* Whether the modification analysis has already been performed. */
+  unsigned modification_analysis_done : 1;
+  /* Whether the param uses analysis has already been performed.  */
+  unsigned uses_analysis_done : 1;
+  /* Whether the function is enqueued in an ipa_func_list.  */
+  unsigned node_enqueued : 1;
   /* Pointer to an array of structures describing individual formal
      parameters.  */
   struct ipa_param_descriptor *params;
@@ -195,16 +204,6 @@ struct ipa_node_params
      the profiling information of the original function and the versioned
      one.  */
   gcov_type count_scale;
-
-  /* Whether this function is called with variable number of actual
-     arguments.  */
-  unsigned called_with_var_arguments : 1;
-  /* Whether the modification analysis has already been performed. */
-  unsigned modification_analysis_done : 1;
-  /* Whether the param uses analysis has already been performed.  */
-  unsigned uses_analysis_done : 1;
-  /* Whether the function is enqueued in an ipa_func_list.  */
-  unsigned node_enqueued : 1;
 };
 
 /* ipa_node_params access functions.  Please use these to access fields that
diff --git a/gcc/optabs.h b/gcc/optabs.h
index 0161d3e..038ef2f 100644
--- a/gcc/optabs.h
+++ b/gcc/optabs.h
@@ -46,8 +46,8 @@ struct optab_handlers
 struct optab_d
 {
   enum rtx_code code;
-  const char *libcall_basename;
   char libcall_suffix;
+  const char *libcall_basename;
   void (*libcall_gen)(struct optab_d *, const char *name, char suffix,
 		      enum machine_mode);
   struct optab_handlers handlers[NUM_MACHINE_MODES];
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index f6db241..bb63be2 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -120,8 +120,8 @@ struct version_info
   struct iv *iv;	/* Induction variable description.  */
   bool has_nonlin_use;	/* For a loop-level invariant, whether it is used in
 			   an expression that is not an induction variable.  */
-  unsigned inv_id;	/* Id of an invariant.  */
   bool preserve_biv;	/* For the original biv, whether to preserve it.  */
+  unsigned inv_id;	/* Id of an invariant.  */
 };
 
 /* Types of uses.  */
@@ -192,7 +192,7 @@ struct iv_cand
   unsigned id;		/* The number of the candidate.  */
   bool important;	/* Whether this is an "important" candidate, i.e. such
 			   that it should be considered by all uses.  */
-  enum iv_position pos;	/* Where it is computed.  */
+  ENUM_BITFIELD(iv_position) pos : 8;	/* Where it is computed.  */
   gimple incremented_at;/* For original biv, the statement where it is
 			   incremented.  */
   tree var_before;	/* The variable used for it before increment.  */
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index bd43a4b..2c38c7f 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -198,6 +198,9 @@ typedef struct _loop_vec_info {
   /* Unrolling factor  */
   int vectorization_factor;
 
+  /* The loop location in the source.  */
+  LOC loop_line_number;
+
   /* Unknown DRs according to which loop was peeled.  */
   struct data_reference *unaligned_dr;
 
@@ -228,9 +231,6 @@ typedef struct _loop_vec_info {
      runtime (loop versioning) misalignment check.  */
   VEC(gimple,heap) *may_misalign_stmts;
 
-  /* The loop location in the source.  */
-  LOC loop_line_number;
-
   /* All interleaving chains of stores in the loop, represented by the first
      stmt in the chain.  */
   VEC(gimple, heap) *strided_stores;
@@ -398,21 +398,23 @@ typedef struct _stmt_vec_info {
 
   enum stmt_vec_info_type type;
 
+  /* Indicates whether this stmts is part of a computation whose result is
+     used outside the loop.  */
+  bool live;
+
+  /* Stmt is part of some pattern (computation idiom)  */
+  bool in_pattern_p;
+
+  /* For loads only, if there is a store with the same location, this field is
+     TRUE.  */
+  bool read_write_dep;
+
   /* The stmt to which this info struct refers to.  */
   gimple stmt;
 
   /* The loop_vec_info with respect to which STMT is vectorized.  */
   loop_vec_info loop_vinfo;
 
-  /* Not all stmts in the loop need to be vectorized. e.g, the increment
-     of the loop induction variable and computation of array indexes. relevant
-     indicates whether the stmt needs to be vectorized.  */
-  enum vect_relevant relevant;
-
-  /* Indicates whether this stmts is part of a computation whose result is
-     used outside the loop.  */
-  bool live;
-
   /* The vector type to be used for the LHS of this statement.  */
   tree vectype;
 
@@ -436,9 +438,6 @@ typedef struct _stmt_vec_info {
   tree dr_step;
   tree dr_aligned_to;
 
-  /* Stmt is part of some pattern (computation idiom)  */
-  bool in_pattern_p;
-
   /* Used for various bookkeeping purposes, generally holding a pointer to
      some other stmt S that is in some way "related" to this stmt.
      Current use of this field is:
@@ -457,11 +456,17 @@ typedef struct _stmt_vec_info {
   /* Classify the def of this stmt.  */
   enum vect_def_type def_type;
 
+  /*  Whether the stmt is SLPed, loop-based vectorized, or both.  */
+  enum slp_vect_type slp_type;
+
   /* Interleaving info.  */
   /* First data-ref in the interleaving group.  */
   gimple first_dr;
   /* Pointer to the next data-ref in the group.  */
   gimple next_dr;
+  /* In case that two or more stmts share data-ref, this is the pointer to the
+     previously detected stmt with the same dr.  */
+  gimple same_dr_stmt;
   /* The size of the interleaving group.  */
   unsigned int size;
   /* For stores, number of stores from this group seen. We vectorize the last
@@ -470,12 +475,11 @@ typedef struct _stmt_vec_info {
   /* For loads only, the gap from the previous load. For consecutive loads, GAP
      is 1.  */
   unsigned int gap;
-  /* In case that two or more stmts share data-ref, this is the pointer to the
-     previously detected stmt with the same dr.  */
-  gimple same_dr_stmt;
-  /* For loads only, if there is a store with the same location, this field is
-     TRUE.  */
-  bool read_write_dep;
+
+  /* Not all stmts in the loop need to be vectorized. e.g, the increment
+     of the loop induction variable and computation of array indexes. relevant
+     indicates whether the stmt needs to be vectorized.  */
+  enum vect_relevant relevant;
 
   /* Vectorization costs associated with statement.  */
   struct
@@ -484,9 +488,6 @@ typedef struct _stmt_vec_info {
     int inside_of_loop;      /* Statements generated inside loop.  */
   } cost;
 
-  /*  Whether the stmt is SLPed, loop-based vectorized, or both.  */
-  enum slp_vect_type slp_type;
-
   /* The bb_vec_info with respect to which STMT is vectorized.  */
   bb_vec_info bb_vinfo;
 } *stmt_vec_info;
-------------- next part --------------
* struct df_base_ref
** BEFORE
struct df_base_ref {
        enum df_ref_class          cl:8;                 /*     0:24  4 */
        enum df_ref_type           type:8;               /*     0:16  4 */
        int                        flags:16;             /*     0: 0  4 */

        /* XXX 4 bytes hole, try to pack */

        rtx                        reg;                  /*     8     8 */
        struct df_link *           chain;                /*    16     8 */
        struct df_insn_info *      insn_info;            /*    24     8 */
        union df_ref_d *           next_reg;             /*    32     8 */
        union df_ref_d *           prev_reg;             /*    40     8 */
        unsigned int               regno;                /*    48     4 */
        int                        id;                   /*    52     4 */
        unsigned int               ref_order;            /*    56     4 */

        /* size: 64, cachelines: 1 */
        /* sum members: 56, holes: 1, sum holes: 4 */
        /* padding: 4 */
};      /* definitions: 1 */
** AFTER
struct df_base_ref {
        enum df_ref_class          cl:8;                 /*     0:24  4 */
        enum df_ref_type           type:8;               /*     0:16  4 */
        int                        flags:16;             /*     0: 0  4 */
        unsigned int               regno;                /*     4     4 */
        rtx                        reg;                  /*     8     8 */
        struct df_link *           chain;                /*    16     8 */
        struct df_insn_info *      insn_info;            /*    24     8 */
        union df_ref_d *           next_reg;             /*    32     8 */
        union df_ref_d *           prev_reg;             /*    40     8 */
        int                        id;                   /*    48     4 */
        unsigned int               ref_order;            /*    52     4 */

        /* size: 56, cachelines: 1 */
        /* last cacheline: 56 bytes */
};      /* definitions: 1 */
* struct c_token
** BEFORE
struct c_token {
        enum cpp_ttype             type:8;               /*     0:24  4 */
        enum c_id_kind             id_kind:8;            /*     0:16  4 */
        enum rid                   keyword:8;            /*     0: 8  4 */
        enum pragma_kind           pragma_kind:8;        /*     0: 0  4 */

        /* XXX 4 bytes hole, try to pack */

        tree                       value;                /*     8     8 */
        location_t                 location;             /*    16     4 */

        /* size: 24, cachelines: 1 */
        /* sum members: 16, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* last cacheline: 24 bytes */
};      /* definitions: 1 */
** AFTER
struct c_token {
        enum cpp_ttype             type:8;               /*     0:24  4 */
        enum c_id_kind             id_kind:8;            /*     0:16  4 */
        enum rid                   keyword:8;            /*     0: 8  4 */
        enum pragma_kind           pragma_kind:8;        /*     0: 0  4 */
        location_t                 location;             /*     4     4 */
        tree                       value;                /*     8     8 */

        /* size: 16, cachelines: 1 */
        /* last cacheline: 16 bytes */
};      /* definitions: 1 */
* struct c_declarator
** BEFORE
struct c_declarator {
        enum c_declarator_kind     kind;                 /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        struct c_declarator *      declarator;           /*     8     8 */
        location_t                 id_loc;               /*    16     4 */

        /* XXX 4 bytes hole, try to pack */

        union {
                tree               id;                   /*           8 */
                struct c_arg_info * arg_info;            /*           8 */
                struct {
                        tree       dimen;                /*    24     8 */
                        int        quals;                /*    32     4 */
                        tree       attrs;                /*    40     8 */
                        unsigned int static_p:1;         /*    48:31  4 */
                        unsigned int vla_unspec_p:1;     /*    48:30  4 */
                } array;                                 /*          32 */
                int                pointer_quals;        /*           4 */
                tree               attrs;                /*           8 */
        } u;                                             /*    24    32 */

        /* size: 56, cachelines: 1 */
        /* sum members: 48, holes: 2, sum holes: 8 */
        /* last cacheline: 56 bytes */
};      /* definitions: 1 */
** AFTER
struct c_declarator {
        enum c_declarator_kind     kind;                 /*     0     4 */
        location_t                 id_loc;               /*     4     4 */
        struct c_declarator *      declarator;           /*     8     8 */
        union {
                tree               id;                   /*           8 */
                struct c_arg_info * arg_info;            /*           8 */
                struct {
                        tree       dimen;                /*    16     8 */
                        int        quals;                /*    24     4 */
                        tree       attrs;                /*    32     8 */
                        unsigned int static_p:1;         /*    40:31  4 */
                        unsigned int vla_unspec_p:1;     /*    40:30  4 */
                } array;                                 /*          32 */
                int                pointer_quals;        /*           4 */
                tree               attrs;                /*           8 */
        } u;                                             /*    16    32 */

        /* size: 48, cachelines: 1 */
        /* last cacheline: 48 bytes */
};      /* definitions: 1 */
* struct c_typespec
** BEFORE
struct c_typespec {
        enum c_typespec_kind       kind;                 /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        tree                       spec;                 /*     8     8 */
        tree                       expr;                 /*    16     8 */
        unsigned char              expr_const_operands;  /*    24     1 */

        /* size: 32, cachelines: 1 */
        /* sum members: 21, holes: 1, sum holes: 4 */
        /* padding: 7 */
        /* last cacheline: 32 bytes */
};      /* definitions: 1 */
** AFTER
struct c_typespec {
        enum c_typespec_kind       kind;                 /*     0     4 */
        unsigned char              expr_const_operands;  /*     4     1 */

        /* XXX 3 bytes hole, try to pack */

        tree                       spec;                 /*     8     8 */
        tree                       expr;                 /*    16     8 */

        /* size: 24, cachelines: 1 */
        /* sum members: 21, holes: 1, sum holes: 3 */
        /* last cacheline: 24 bytes */
};      /* definitions: 1 */
* struct cp_declarator
** BEFORE
struct cp_declarator {
        enum cp_declarator_kind    kind:4;               /*     0:28  4 */
        unsigned int               parameter_pack_p:1;   /*     0:27  4 */

        /* XXX 27 bits hole, try to pack */
        /* XXX 4 bytes hole, try to pack */

        tree                       attributes;           /*     8     8 */
        cp_declarator *            declarator;           /*    16     8 */
        location_t                 id_loc;               /*    24     4 */

        /* XXX 4 bytes hole, try to pack */

        union {
                struct {
                        tree       qualifying_scope;     /*    32     8 */
                        tree       unqualified_name;     /*    40     8 */
                        special_function_kind sfk;       /*    48     4 */
                } id;                                    /*          24 */
                struct {
                        tree       parameters;           /*    32     8 */
                        cp_cv_quals qualifiers;          /*    40     4 */
                        tree       exception_specification; /*    48     8 */
                        tree       late_return_type;     /*    56     8 */
                } function;                              /*          32 */
                struct {
                        tree       bounds;               /*    32     8 */
                } array;                                 /*           8 */
                struct {
                        cp_cv_quals qualifiers;          /*    32     4 */
                        tree       class_type;           /*    40     8 */
                } pointer;                               /*          16 */
                struct {
                        cp_cv_quals qualifiers;          /*    32     4 */
                        unsigned char rvalue_ref;        /*    36     1 */
                } reference;                             /*           8 */
        } u;                                             /*    32    32 */
        /* --- cacheline 1 boundary (64 bytes) --- */

        /* size: 64, cachelines: 1 */
        /* sum members: 56, holes: 2, sum holes: 8 */
        /* bit holes: 1, sum bit holes: 27 bits */
};      /* definitions: 1 */
** AFTER
struct cp_declarator {
        enum cp_declarator_kind    kind:4;               /*     0:28  4 */
        unsigned int               parameter_pack_p:1;   /*     0:27  4 */

        /* XXX 27 bits hole, try to pack */

        location_t                 id_loc;               /*     4     4 */
        tree                       attributes;           /*     8     8 */
        cp_declarator *            declarator;           /*    16     8 */
        union {
                struct {
                        tree       qualifying_scope;     /*    24     8 */
                        tree       unqualified_name;     /*    32     8 */
                        special_function_kind sfk;       /*    40     4 */
                } id;                                    /*          24 */
                struct {
                        tree       parameters;           /*    24     8 */
                        cp_cv_quals qualifiers;          /*    32     4 */
                        tree       exception_specification; /*    40     8 */
                        tree       late_return_type;     /*    48     8 */
                } function;                              /*          32 */
                struct {
                        tree       bounds;               /*    24     8 */
                } array;                                 /*           8 */
                struct {
                        cp_cv_quals qualifiers;          /*    24     4 */
                        tree       class_type;           /*    32     8 */
                } pointer;                               /*          16 */
                struct {
                        cp_cv_quals qualifiers;          /*    24     4 */
                        unsigned char rvalue_ref;        /*    28     1 */
                } reference;                             /*           8 */
        } u;                                             /*    24    32 */

        /* size: 56, cachelines: 1 */
        /* bit holes: 1, sum bit holes: 27 bits */
        /* last cacheline: 56 bytes */
};      /* definitions: 1 */
* struct cp_decl_specifier_seq
** BEFORE
struct cp_decl_specifier_seq {
        unsigned int               specs[15];            /*     0    60 */

        /* XXX 4 bytes hole, try to pack */

        /* --- cacheline 1 boundary (64 bytes) --- */
        tree                       type;                 /*    64     8 */
        location_t                 type_location;        /*    72     4 */

        /* XXX 4 bytes hole, try to pack */

        tree                       attributes;           /*    80     8 */
        tree                       redefined_builtin_type; /*    88     8 */
        cp_storage_class           storage_class;        /*    96     4 */
        unsigned int               user_defined_type_p:1; /*   100:31  4 */
        unsigned int               multiple_types_p:1;   /*   100:30  4 */
        unsigned int               conflicting_specifiers_p:1; /*   100:29  4 */
        unsigned int               any_specifiers_p:1;   /*   100:28  4 */
        unsigned int               any_type_specifiers_p:1; /*   100:27  4 */
        unsigned int               explicit_int_p:1;     /*   100:26  4 */
        unsigned int               explicit_char_p:1;    /*   100:25  4 */

        /* size: 104, cachelines: 2 */
        /* sum members: 96, holes: 2, sum holes: 8 */
        /* bit_padding: 25 bits */
        /* last cacheline: 40 bytes */
};      /* definitions: 1 */
** AFTER
struct cp_decl_specifier_seq {
        unsigned int               specs[15];            /*     0    60 */
        location_t                 type_location;        /*    60     4 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        tree                       type;                 /*    64     8 */
        tree                       attributes;           /*    72     8 */
        tree                       redefined_builtin_type; /*    80     8 */
        cp_storage_class           storage_class;        /*    88     4 */
        unsigned int               user_defined_type_p:1; /*    92:31  4 */
        unsigned int               multiple_types_p:1;   /*    92:30  4 */
        unsigned int               conflicting_specifiers_p:1; /*    92:29  4 */
        unsigned int               any_specifiers_p:1;   /*    92:28  4 */
        unsigned int               any_type_specifiers_p:1; /*    92:27  4 */
        unsigned int               explicit_int_p:1;     /*    92:26  4 */
        unsigned int               explicit_char_p:1;    /*    92:25  4 */

        /* size: 96, cachelines: 2 */
        /* bit_padding: 25 bits */
        /* last cacheline: 32 bytes */
};      /* definitions: 1 */
* struct optab_d
** BEFORE
struct optab_d {
        enum rtx_code              code;                 /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        const char  *              libcall_basename;     /*     8     8 */
        char                       libcall_suffix;       /*    16     1 */

        /* XXX 7 bytes hole, try to pack */

        void                       (*libcall_gen)(struct optab_d *, const char  *, char, enum machine_mode); /*    24     8 */
        struct optab_handlers      handlers[87];         /*    32   348 */
        /* --- cacheline 5 boundary (320 bytes) was 60 bytes ago --- */

        /* size: 384, cachelines: 6 */
        /* sum members: 369, holes: 2, sum holes: 11 */
        /* padding: 4 */
};      /* definitions: 1 */
** AFTER
struct optab_d {
        enum rtx_code              code;                 /*     0     4 */
        char                       libcall_suffix;       /*     4     1 */

        /* XXX 3 bytes hole, try to pack */

        const char  *              libcall_basename;     /*     8     8 */
        void                       (*libcall_gen)(struct optab_d *, const char  *, char, enum machine_mode); /*    16     8 */
        struct optab_handlers      handlers[87];         /*    24   348 */
        /* --- cacheline 5 boundary (320 bytes) was 52 bytes ago --- */

        /* size: 376, cachelines: 6 */
        /* sum members: 369, holes: 1, sum holes: 3 */
        /* padding: 4 */
        /* last cacheline: 56 bytes */
};      /* definitions: 1 */
* struct separate_ops
** BEFORE
struct separate_ops {
        enum tree_code             code;                 /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        tree                       type;                 /*     8     8 */
        tree                       op0;                  /*    16     8 */
        tree                       op1;                  /*    24     8 */
        tree                       op2;                  /*    32     8 */
        location_t                 location;             /*    40     4 */

        /* size: 48, cachelines: 1 */
        /* sum members: 40, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* last cacheline: 48 bytes */
};      /* definitions: 1 */
** AFTER
struct separate_ops {
        enum tree_code             code;                 /*     0     4 */
        location_t                 location;             /*     4     4 */
        tree                       type;                 /*     8     8 */
        tree                       op0;                  /*    16     8 */
        tree                       op1;                  /*    24     8 */
        tree                       op2;                  /*    32     8 */

        /* size: 40, cachelines: 1 */
        /* last cacheline: 40 bytes */
};      /* definitions: 1 */
* struct _loop_vec_info
** BEFORE
struct _loop_vec_info {
        struct loop *              loop;                 /*     0     8 */
        basic_block *              bbs;                  /*     8     8 */
        tree                       num_iters;            /*    16     8 */
        tree                       num_iters_unchanged;  /*    24     8 */
        int                        min_profitable_iters; /*    32     4 */
        unsigned char              vectorizable;         /*    36     1 */

        /* XXX 3 bytes hole, try to pack */

        int                        vectorization_factor; /*    40     4 */

        /* XXX 4 bytes hole, try to pack */

        struct data_reference *    unaligned_dr;         /*    48     8 */
        int                        peeling_for_alignment; /*    56     4 */
        int                        ptr_mask;             /*    60     4 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        VEC_data_reference_p_heap * datarefs;            /*    64     8 */
        VEC_ddr_p_heap *           ddrs;                 /*    72     8 */
        VEC_ddr_p_heap *           may_alias_ddrs;       /*    80     8 */
        VEC_gimple_heap *          may_misalign_stmts;   /*    88     8 */
        LOC                        loop_line_number;     /*    96     4 */

        /* XXX 4 bytes hole, try to pack */

        VEC_gimple_heap *          strided_stores;       /*   104     8 */
        VEC_slp_instance_heap *    slp_instances;        /*   112     8 */
        unsigned int               slp_unrolling_factor; /*   120     4 */

        /* XXX 4 bytes hole, try to pack */

        /* --- cacheline 2 boundary (128 bytes) --- */
        VEC_gimple_heap *          reductions;           /*   128     8 */

        /* size: 136, cachelines: 3 */
        /* sum members: 121, holes: 4, sum holes: 15 */
        /* last cacheline: 8 bytes */
};      /* definitions: 1 */
** AFTER
struct _loop_vec_info {
        struct loop *              loop;                 /*     0     8 */
        basic_block *              bbs;                  /*     8     8 */
        tree                       num_iters;            /*    16     8 */
        tree                       num_iters_unchanged;  /*    24     8 */
        int                        min_profitable_iters; /*    32     4 */
        unsigned char              vectorizable;         /*    36     1 */

        /* XXX 3 bytes hole, try to pack */

        int                        vectorization_factor; /*    40     4 */
        LOC                        loop_line_number;     /*    44     4 */
        struct data_reference *    unaligned_dr;         /*    48     8 */
        int                        peeling_for_alignment; /*    56     4 */
        int                        ptr_mask;             /*    60     4 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        VEC_data_reference_p_heap * datarefs;            /*    64     8 */
        VEC_ddr_p_heap *           ddrs;                 /*    72     8 */
        VEC_ddr_p_heap *           may_alias_ddrs;       /*    80     8 */
        VEC_gimple_heap *          may_misalign_stmts;   /*    88     8 */
        VEC_gimple_heap *          strided_stores;       /*    96     8 */
        VEC_slp_instance_heap *    slp_instances;        /*   104     8 */
        unsigned int               slp_unrolling_factor; /*   112     4 */

        /* XXX 4 bytes hole, try to pack */

        VEC_gimple_heap *          reductions;           /*   120     8 */
        /* --- cacheline 2 boundary (128 bytes) --- */

        /* size: 128, cachelines: 2 */
        /* sum members: 121, holes: 2, sum holes: 7 */
};      /* definitions: 1 */
* struct _stmt_vec_info
** BEFORE
struct _stmt_vec_info {
        enum stmt_vec_info_type    type;                 /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        gimple                     stmt;                 /*     8     8 */
        loop_vec_info              loop_vinfo;           /*    16     8 */
        enum vect_relevant         relevant;             /*    24     4 */
        unsigned char              live;                 /*    28     1 */

        /* XXX 3 bytes hole, try to pack */

        tree                       vectype;              /*    32     8 */
        gimple                     vectorized_stmt;      /*    40     8 */
        struct data_reference *    data_ref_info;        /*    48     8 */
        tree                       dr_base_address;      /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        tree                       dr_init;              /*    64     8 */
        tree                       dr_offset;            /*    72     8 */
        tree                       dr_step;              /*    80     8 */
        tree                       dr_aligned_to;        /*    88     8 */
        unsigned char              in_pattern_p;         /*    96     1 */

        /* XXX 7 bytes hole, try to pack */

        gimple                     related_stmt;         /*   104     8 */
        VEC_dr_p_heap *            same_align_refs;      /*   112     8 */
        enum vect_def_type         def_type;             /*   120     4 */

        /* XXX 4 bytes hole, try to pack */

        /* --- cacheline 2 boundary (128 bytes) --- */
        gimple                     first_dr;             /*   128     8 */
        gimple                     next_dr;              /*   136     8 */
        unsigned int               size;                 /*   144     4 */
        unsigned int               store_count;          /*   148     4 */
        unsigned int               gap;                  /*   152     4 */

        /* XXX 4 bytes hole, try to pack */

        gimple                     same_dr_stmt;         /*   160     8 */
        unsigned char              read_write_dep;       /*   168     1 */

        /* XXX 3 bytes hole, try to pack */

        struct {
                int                outside_of_loop;      /*   172     4 */
                int                inside_of_loop;       /*   176     4 */
        } cost;                                          /*   172     8 */
        enum slp_vect_type         slp_type;             /*   180     4 */
        bb_vec_info                bb_vinfo;             /*   184     8 */
        /* --- cacheline 3 boundary (192 bytes) --- */

        /* size: 192, cachelines: 3 */
        /* sum members: 167, holes: 6, sum holes: 25 */
};      /* definitions: 1 */
** AFTER
struct _stmt_vec_info {
        enum stmt_vec_info_type    type;                 /*     0     4 */
        unsigned char              live;                 /*     4     1 */
        unsigned char              in_pattern_p;         /*     5     1 */
        unsigned char              read_write_dep;       /*     6     1 */

        /* XXX 1 byte hole, try to pack */

        gimple                     stmt;                 /*     8     8 */
        loop_vec_info              loop_vinfo;           /*    16     8 */
        tree                       vectype;              /*    24     8 */
        gimple                     vectorized_stmt;      /*    32     8 */
        struct data_reference *    data_ref_info;        /*    40     8 */
        tree                       dr_base_address;      /*    48     8 */
        tree                       dr_init;              /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        tree                       dr_offset;            /*    64     8 */
        tree                       dr_step;              /*    72     8 */
        tree                       dr_aligned_to;        /*    80     8 */
        gimple                     related_stmt;         /*    88     8 */
        VEC_dr_p_heap *            same_align_refs;      /*    96     8 */
        enum vect_def_type         def_type;             /*   104     4 */
        enum slp_vect_type         slp_type;             /*   108     4 */
        gimple                     first_dr;             /*   112     8 */
        gimple                     next_dr;              /*   120     8 */
        /* --- cacheline 2 boundary (128 bytes) --- */
        gimple                     same_dr_stmt;         /*   128     8 */
        unsigned int               size;                 /*   136     4 */
        unsigned int               store_count;          /*   140     4 */
        unsigned int               gap;                  /*   144     4 */
        enum vect_relevant         relevant;             /*   148     4 */
        struct {
                int                outside_of_loop;      /*   152     4 */
                int                inside_of_loop;       /*   156     4 */
        } cost;                                          /*   152     8 */
        bb_vec_info                bb_vinfo;             /*   160     8 */

        /* size: 168, cachelines: 3 */
        /* sum members: 167, holes: 1, sum holes: 1 */
        /* last cacheline: 40 bytes */
};      /* definitions: 1 */
* struct loop
** BEFORE
struct loop {
        int                        num;                  /*     0     4 */
        unsigned int               ninsns;               /*     4     4 */
        struct basic_block_def *   header;               /*     8     8 */
        struct basic_block_def *   latch;                /*    16     8 */
        struct lpt_decision        lpt_decision;         /*    24     8 */
        unsigned int               av_ninsns;            /*    32     4 */
        unsigned int               num_nodes;            /*    36     4 */
        VEC_loop_p_gc *            superloops;           /*    40     8 */
        struct loop *              inner;                /*    48     8 */
        struct loop *              next;                 /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        void *                     aux;                  /*    64     8 */
        tree                       nb_iterations;        /*    72     8 */
        double_int                 nb_iterations_upper_bound; /*    80    16 */
        double_int                 nb_iterations_estimate; /*    96    16 */
        unsigned char              any_upper_bound;      /*   112     1 */
        unsigned char              any_estimate;         /*   113     1 */

        /* XXX 2 bytes hole, try to pack */

        enum loop_estimation       estimate_state;       /*   116     4 */
        struct nb_iter_bound *     bounds;               /*   120     8 */
        /* --- cacheline 2 boundary (128 bytes) --- */
        struct loop_exit *         exits;                /*   128     8 */
        unsigned char              can_be_parallel;      /*   136     1 */

        /* XXX 7 bytes hole, try to pack */

        tree                       single_iv;            /*   144     8 */

        /* size: 152, cachelines: 3 */
        /* sum members: 143, holes: 2, sum holes: 9 */
        /* last cacheline: 24 bytes */
};      /* definitions: 1 */
** AFTER
struct loop {
        int                        num;                  /*     0     4 */
        unsigned int               ninsns;               /*     4     4 */
        struct basic_block_def *   header;               /*     8     8 */
        struct basic_block_def *   latch;                /*    16     8 */
        struct lpt_decision        lpt_decision;         /*    24     8 */
        unsigned int               av_ninsns;            /*    32     4 */
        unsigned int               num_nodes;            /*    36     4 */
        VEC_loop_p_gc *            superloops;           /*    40     8 */
        struct loop *              inner;                /*    48     8 */
        struct loop *              next;                 /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        void *                     aux;                  /*    64     8 */
        tree                       nb_iterations;        /*    72     8 */
        double_int                 nb_iterations_upper_bound; /*    80    16 */
        double_int                 nb_iterations_estimate; /*    96    16 */
        unsigned char              any_upper_bound;      /*   112     1 */
        unsigned char              any_estimate;         /*   113     1 */
        unsigned char              can_be_parallel;      /*   114     1 */

        /* XXX 1 byte hole, try to pack */

        enum loop_estimation       estimate_state;       /*   116     4 */
        struct nb_iter_bound *     bounds;               /*   120     8 */
        /* --- cacheline 2 boundary (128 bytes) --- */
        struct loop_exit *         exits;                /*   128     8 */
        tree                       single_iv;            /*   136     8 */

        /* size: 144, cachelines: 3 */
        /* sum members: 143, holes: 1, sum holes: 1 */
        /* last cacheline: 16 bytes */
};      /* definitions: 1 */
* struct control_flow_graph
** BEFORE
struct control_flow_graph {
        basic_block                x_entry_block_ptr;    /*     0     8 */
        basic_block                x_exit_block_ptr;     /*     8     8 */
        VEC_basic_block_gc *       x_basic_block_info;   /*    16     8 */
        int                        x_n_basic_blocks;     /*    24     4 */
        int                        x_n_edges;            /*    28     4 */
        int                        x_last_basic_block;   /*    32     4 */

        /* XXX 4 bytes hole, try to pack */

        VEC_basic_block_gc *       x_label_to_block_map; /*    40     8 */
        enum profile_status_d      x_profile_status;     /*    48     4 */
        enum dom_state             x_dom_computed[2];    /*    52     8 */
        unsigned int               x_n_bbs_in_dom_tree[2]; /*    60     8 */
        /* --- cacheline 1 boundary (64 bytes) was 4 bytes ago --- */
        int                        max_jumptable_ents;   /*    68     4 */
        int                        last_label_uid;       /*    72     4 */

        /* size: 80, cachelines: 2 */
        /* sum members: 72, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* last cacheline: 16 bytes */
};      /* definitions: 1 */
** AFTER
struct control_flow_graph {
        basic_block                x_entry_block_ptr;    /*     0     8 */
        basic_block                x_exit_block_ptr;     /*     8     8 */
        VEC_basic_block_gc *       x_basic_block_info;   /*    16     8 */
        int                        x_n_basic_blocks;     /*    24     4 */
        int                        x_n_edges;            /*    28     4 */
        int                        x_last_basic_block;   /*    32     4 */
        int                        last_label_uid;       /*    36     4 */
        VEC_basic_block_gc *       x_label_to_block_map; /*    40     8 */
        enum profile_status_d      x_profile_status;     /*    48     4 */
        enum dom_state             x_dom_computed[2];    /*    52     8 */
        unsigned int               x_n_bbs_in_dom_tree[2]; /*    60     8 */
        /* --- cacheline 1 boundary (64 bytes) was 4 bytes ago --- */
        int                        max_jumptable_ents;   /*    68     4 */

        /* size: 72, cachelines: 2 */
        /* last cacheline: 8 bytes */
};      /* definitions: 1 */
* struct dw_fde_struct
** BEFORE
struct dw_fde_struct {
        tree                       decl;                 /*     0     8 */
        const char  *              dw_fde_begin;         /*     8     8 */
        const char  *              dw_fde_current_label; /*    16     8 */
        const char  *              dw_fde_end;           /*    24     8 */
        const char  *              dw_fde_hot_section_label; /*    32     8 */
        const char  *              dw_fde_hot_section_end_label; /*    40     8 */
        const char  *              dw_fde_unlikely_section_label; /*    48     8 */
        const char  *              dw_fde_unlikely_section_end_label; /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        dw_cfi_ref                 dw_fde_cfi;           /*    64     8 */
        dw_cfi_ref                 dw_fde_switch_cfi;    /*    72     8 */
        unsigned int               funcdef_number;       /*    80     4 */

        /* XXX 4 bytes hole, try to pack */

        long int                   stack_realignment;    /*    88     8 */
        unsigned int               drap_reg;             /*    96     4 */
        unsigned int               vdrap_reg;            /*   100     4 */
        unsigned int               all_throwers_are_sibcalls:1; /*   104:31  4 */
        unsigned int               nothrow:1;            /*   104:30  4 */
        unsigned int               uses_eh_lsda:1;       /*   104:29  4 */
        unsigned int               stack_realign:1;      /*   104:28  4 */
        unsigned int               drap_reg_saved:1;     /*   104:27  4 */
        unsigned int               in_std_section:1;     /*   104:26  4 */
        unsigned int               cold_in_std_section:1; /*   104:25  4 */
        unsigned int               dw_fde_switched_sections:1; /*   104:24  4 */
        unsigned int               dw_fde_switched_cold_to_hot:1; /*   104:23  4 */

        /* size: 112, cachelines: 2 */
        /* sum members: 104, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* bit_padding: 23 bits */
        /* last cacheline: 48 bytes */
};      /* definitions: 1 */
** AFTER
struct dw_fde_struct {
        tree                       decl;                 /*     0     8 */
        const char  *              dw_fde_begin;         /*     8     8 */
        const char  *              dw_fde_current_label; /*    16     8 */
        const char  *              dw_fde_end;           /*    24     8 */
        const char  *              dw_fde_hot_section_label; /*    32     8 */
        const char  *              dw_fde_hot_section_end_label; /*    40     8 */
        const char  *              dw_fde_unlikely_section_label; /*    48     8 */
        const char  *              dw_fde_unlikely_section_end_label; /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        dw_cfi_ref                 dw_fde_cfi;           /*    64     8 */
        dw_cfi_ref                 dw_fde_switch_cfi;    /*    72     8 */
        long int                   stack_realignment;    /*    80     8 */
        unsigned int               funcdef_number;       /*    88     4 */
        unsigned int               drap_reg;             /*    92     4 */
        unsigned int               vdrap_reg;            /*    96     4 */
        unsigned int               all_throwers_are_sibcalls:1; /*   100:31  4 */
        unsigned int               nothrow:1;            /*   100:30  4 */
        unsigned int               uses_eh_lsda:1;       /*   100:29  4 */
        unsigned int               stack_realign:1;      /*   100:28  4 */
        unsigned int               drap_reg_saved:1;     /*   100:27  4 */
        unsigned int               in_std_section:1;     /*   100:26  4 */
        unsigned int               cold_in_std_section:1; /*   100:25  4 */
        unsigned int               dw_fde_switched_sections:1; /*   100:24  4 */
        unsigned int               dw_fde_switched_cold_to_hot:1; /*   100:23  4 */

        /* size: 104, cachelines: 2 */
        /* bit_padding: 23 bits */
        /* last cacheline: 40 bytes */
};      /* definitions: 1 */
* struct diagnostic_context
** BEFORE
struct diagnostic_context {
        pretty_printer *           printer;              /*     0     8 */
        int                        diagnostic_count[12]; /*     8    48 */
        unsigned char              some_warnings_are_errors; /*    56     1 */
        unsigned char              warning_as_error_requested; /*    57     1 */

        /* XXX 2 bytes hole, try to pack */

        diagnostic_t               classify_diagnostic[875]; /*    60  3500 */
        /* --- cacheline 55 boundary (3520 bytes) was 40 bytes ago --- */
        unsigned char              show_option_requested; /*  3560     1 */
        unsigned char              abort_on_error;       /*  3561     1 */

        /* XXX 6 bytes hole, try to pack */

        diagnostic_starter_fn      begin_diagnostic;     /*  3568     8 */
        diagnostic_finalizer_fn    end_diagnostic;       /*  3576     8 */
        /* --- cacheline 56 boundary (3584 bytes) --- */
        void                       (*internal_error)(const char  *, va_list *); /*  3584     8 */
        tree                       last_function;        /*  3592     8 */
        const struct line_map  *   last_module;          /*  3600     8 */
        int                        lock;                 /*  3608     4 */
        unsigned char              inhibit_notes_p;      /*  3612     1 */

        /* size: 3616, cachelines: 57 */
        /* sum members: 3605, holes: 2, sum holes: 8 */
        /* padding: 3 */
        /* last cacheline: 32 bytes */
};      /* definitions: 1 */
** AFTER
struct diagnostic_context {
        pretty_printer *           printer;              /*     0     8 */
        int                        diagnostic_count[12]; /*     8    48 */
        unsigned char              some_warnings_are_errors; /*    56     1 */
        unsigned char              warning_as_error_requested; /*    57     1 */
        unsigned char              show_option_requested; /*    58     1 */
        unsigned char              abort_on_error;       /*    59     1 */
        diagnostic_t               classify_diagnostic[875]; /*    60  3500 */
        /* --- cacheline 55 boundary (3520 bytes) was 40 bytes ago --- */
        diagnostic_starter_fn      begin_diagnostic;     /*  3560     8 */
        diagnostic_finalizer_fn    end_diagnostic;       /*  3568     8 */
        void                       (*internal_error)(const char  *, va_list *); /*  3576     8 */
        /* --- cacheline 56 boundary (3584 bytes) --- */
        tree                       last_function;        /*  3584     8 */
        const struct line_map  *   last_module;          /*  3592     8 */
        int                        lock;                 /*  3600     4 */
        unsigned char              inhibit_notes_p;      /*  3604     1 */

        /* size: 3608, cachelines: 57 */
        /* padding: 3 */
        /* last cacheline: 24 bytes */
};      /* definitions: 1 */
* struct ipa_node_params
** BEFORE
struct ipa_node_params {
        int                        param_count;          /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        struct ipa_param_descriptor * params;            /*     8     8 */
        struct ipa_param_call_note * param_calls;        /*    16     8 */
        struct cgraph_node *       ipcp_orig_node;       /*    24     8 */
        gcov_type                  count_scale;          /*    32     8 */
        unsigned int               called_with_var_arguments:1; /*    40:31  4 */
        unsigned int               modification_analysis_done:1; /*    40:30  4 */
        unsigned int               uses_analysis_done:1; /*    40:29  4 */
        unsigned int               node_enqueued:1;      /*    40:28  4 */

        /* size: 48, cachelines: 1 */
        /* sum members: 40, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* bit_padding: 28 bits */
        /* last cacheline: 48 bytes */
};      /* definitions: 1 */
** AFTER
struct ipa_node_params {
        int                        param_count;          /*     0     4 */
        unsigned int               called_with_var_arguments:1; /*     4:31  4 */
        unsigned int               modification_analysis_done:1; /*     4:30  4 */
        unsigned int               uses_analysis_done:1; /*     4:29  4 */
        unsigned int               node_enqueued:1;      /*     4:28  4 */

        /* XXX 28 bits hole, try to pack */

        struct ipa_param_descriptor * params;            /*     8     8 */
        struct ipa_param_call_note * param_calls;        /*    16     8 */
        struct cgraph_node *       ipcp_orig_node;       /*    24     8 */
        gcov_type                  count_scale;          /*    32     8 */

        /* size: 40, cachelines: 1 */
        /* bit holes: 1, sum bit holes: 28 bits */
        /* last cacheline: 40 bytes */
};      /* definitions: 1 */
* struct version_info
** BEFORE
struct version_info {
        tree                       name;                 /*     0     8 */
        struct iv *                iv;                   /*     8     8 */
        unsigned char              has_nonlin_use;       /*    16     1 */

        /* XXX 3 bytes hole, try to pack */

        unsigned int               inv_id;               /*    20     4 */
        unsigned char              preserve_biv;         /*    24     1 */

        /* size: 32, cachelines: 1 */
        /* sum members: 22, holes: 1, sum holes: 3 */
        /* padding: 7 */
        /* last cacheline: 32 bytes */
};      /* definitions: 1 */
** AFTER
struct version_info {
        tree                       name;                 /*     0     8 */
        struct iv *                iv;                   /*     8     8 */
        unsigned char              has_nonlin_use;       /*    16     1 */
        unsigned char              preserve_biv;         /*    17     1 */

        /* XXX 2 bytes hole, try to pack */

        unsigned int               inv_id;               /*    20     4 */

        /* size: 24, cachelines: 1 */
        /* sum members: 22, holes: 1, sum holes: 2 */
        /* last cacheline: 24 bytes */
};      /* definitions: 1 */
* struct iv_cand
** BEFORE
struct iv_cand {
        unsigned int               id;                   /*     0     4 */
        unsigned char              important;            /*     4     1 */

        /* XXX 3 bytes hole, try to pack */

        enum iv_position           pos;                  /*     8     4 */

        /* XXX 4 bytes hole, try to pack */

        gimple                     incremented_at;       /*    16     8 */
        tree                       var_before;           /*    24     8 */
        tree                       var_after;            /*    32     8 */
        struct iv *                iv;                   /*    40     8 */
        unsigned int               cost;                 /*    48     4 */
        unsigned int               cost_step;            /*    52     4 */
        struct iv_use *            ainc_use;             /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        bitmap                     depends_on;           /*    64     8 */

        /* size: 72, cachelines: 2 */
        /* sum members: 65, holes: 2, sum holes: 7 */
        /* last cacheline: 8 bytes */
};      /* definitions: 1 */
** AFTER
struct iv_cand {
        unsigned int               id;                   /*     0     4 */
        unsigned char              important;            /*     4     1 */

        /* Bitfield combined with previous fields */

        enum iv_position           pos:8;                /*     4:16  4 */

        /* XXX 24 bits hole, try to pack */

        gimple                     incremented_at;       /*     8     8 */
        tree                       var_before;           /*    16     8 */
        tree                       var_after;            /*    24     8 */
        struct iv *                iv;                   /*    32     8 */
        unsigned int               cost;                 /*    40     4 */
        unsigned int               cost_step;            /*    44     4 */
        struct iv_use *            ainc_use;             /*    48     8 */
        bitmap                     depends_on;           /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */

        /* size: 64, cachelines: 1 */
        /* bit holes: 1, sum bit holes: 24 bits */
};      /* definitions: 1 */
* struct ix86_frame
** BEFORE
struct ix86_frame {
        int                        padding0;             /*     0     4 */
        int                        nsseregs;             /*     4     4 */
        int                        nregs;                /*     8     4 */
        int                        padding1;             /*    12     4 */
        int                        va_arg_size;          /*    16     4 */

        /* XXX 4 bytes hole, try to pack */

        long int                   frame;                /*    24     8 */
        int                        padding2;             /*    32     4 */
        int                        outgoing_arguments_size; /*    36     4 */
        int                        red_zone_size;        /*    40     4 */

        /* XXX 4 bytes hole, try to pack */

        long int                   to_allocate;          /*    48     8 */
        long int                   frame_pointer_offset; /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        long int                   hard_frame_pointer_offset; /*    64     8 */
        long int                   stack_pointer_offset; /*    72     8 */
        unsigned char              save_regs_using_mov;  /*    80     1 */

        /* size: 88, cachelines: 2 */
        /* sum members: 73, holes: 2, sum holes: 8 */
        /* padding: 7 */
        /* last cacheline: 24 bytes */
};      /* definitions: 1 */
** AFTER
struct ix86_frame {
        int                        padding0;             /*     0     4 */
        int                        nsseregs;             /*     4     4 */
        int                        nregs;                /*     8     4 */
        int                        padding1;             /*    12     4 */
        int                        va_arg_size;          /*    16     4 */
        int                        red_zone_size;        /*    20     4 */
        long int                   frame;                /*    24     8 */
        int                        padding2;             /*    32     4 */
        int                        outgoing_arguments_size; /*    36     4 */
        long int                   to_allocate;          /*    40     8 */
        long int                   frame_pointer_offset; /*    48     8 */
        long int                   hard_frame_pointer_offset; /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        long int                   stack_pointer_offset; /*    64     8 */
        unsigned char              save_regs_using_mov;  /*    72     1 */

        /* size: 80, cachelines: 2 */
        /* padding: 7 */
        /* last cacheline: 16 bytes */
};      /* definitions: 1 */
* struct machine_function (x86)
** BEFORE
struct machine_function {
        struct stack_local_entry * stack_locals;         /*     0     8 */
        const char  *              some_ld_name;         /*     8     8 */
        int                        varargs_gpr_size;     /*    16     4 */
        int                        varargs_fpr_size;     /*    20     4 */
        int                        optimize_mode_switching[4]; /*    24    16 */
        int                        use_fast_prologue_epilogue_nregs; /*    40     4 */

        /* XXX 4 bytes hole, try to pack */

        struct machine_cfa_state   cfa;                  /*    48    16 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        enum calling_abi           call_abi;             /*    64     4 */
        unsigned int               accesses_prev_frame:1; /*    68:31  4 */
        unsigned int               needs_cld:1;          /*    68:30  4 */
        unsigned int               use_fast_prologue_epilogue:1; /*    68:29  4 */
        unsigned int               tls_descriptor_call_expanded_p:1; /*    68:28  4 */
        unsigned int               static_chain_on_stack:1; /*    68:27  4 */

        /* size: 72, cachelines: 2 */
        /* sum members: 68, holes: 1, sum holes: 4 */
        /* bit_padding: 27 bits */
        /* last cacheline: 8 bytes */
};      /* definitions: 1 */
** AFTER
struct machine_function {
        struct stack_local_entry * stack_locals;         /*     0     8 */
        const char  *              some_ld_name;         /*     8     8 */
        int                        varargs_gpr_size;     /*    16     4 */
        int                        varargs_fpr_size;     /*    20     4 */
        int                        optimize_mode_switching[4]; /*    24    16 */
        int                        use_fast_prologue_epilogue_nregs; /*    40     4 */
        enum calling_abi           call_abi:8;           /*    44:24  4 */
        unsigned int               accesses_prev_frame:1; /*    44:23  4 */
        unsigned int               needs_cld:1;          /*    44:22  4 */
        unsigned int               use_fast_prologue_epilogue:1; /*    44:21  4 */
        unsigned int               tls_descriptor_call_expanded_p:1; /*    44:20  4 */
        unsigned int               static_chain_on_stack:1; /*    44:19  4 */

        /* XXX 19 bits hole, try to pack */

        struct machine_cfa_state   cfa;                  /*    48    16 */
        /* --- cacheline 1 boundary (64 bytes) --- */

        /* size: 64, cachelines: 1 */
        /* bit holes: 1, sum bit holes: 19 bits */
};      /* definitions: 1 */
* struct c_declspecs
** BEFORE
struct c_declspecs {
        tree                       type;                 /*     0     8 */
        tree                       expr;                 /*     8     8 */
        tree                       decl_attr;            /*    16     8 */
        tree                       attrs;                /*    24     8 */
        enum c_typespec_keyword    typespec_word;        /*    32     4 */
        enum c_storage_class       storage_class;        /*    36     4 */
        unsigned int               expr_const_operands:1; /*    40:31  4 */
        unsigned int               declspecs_seen_p:1;   /*    40:30  4 */
        unsigned int               type_seen_p:1;        /*    40:29  4 */
        unsigned int               non_sc_seen_p:1;      /*    40:28  4 */
        unsigned int               typedef_p:1;          /*    40:27  4 */
        unsigned int               tag_defined_p:1;      /*    40:26  4 */
        unsigned int               explicit_signed_p:1;  /*    40:25  4 */
        unsigned int               deprecated_p:1;       /*    40:24  4 */

        /* XXX 24 bits hole, try to pack */

        unsigned int               default_int_p;        /*    44     4 */
        unsigned int               long_p:1;             /*    48:31  4 */
        unsigned int               long_long_p:1;        /*    48:30  4 */
        unsigned int               short_p:1;            /*    48:29  4 */
        unsigned int               signed_p:1;           /*    48:28  4 */
        unsigned int               unsigned_p:1;         /*    48:27  4 */
        unsigned int               complex_p:1;          /*    48:26  4 */
        unsigned int               inline_p:1;           /*    48:25  4 */
        unsigned int               thread_p:1;           /*    48:24  4 */
        unsigned int               const_p:1;            /*    48:23  4 */
        unsigned int               volatile_p:1;         /*    48:22  4 */
        unsigned int               restrict_p:1;         /*    48:21  4 */
        unsigned int               saturating_p:1;       /*    48:20  4 */

        /* XXX 4 bits hole, try to pack */
        /* Bitfield combined with next fields */

        addr_space_t               address_space;        /*    50     1 */

        /* size: 56, cachelines: 1 */
        /* bit holes: 2, sum bit holes: 28 bits */
        /* padding: 5 */
        /* last cacheline: 56 bytes */
};      /* definitions: 1 */
** AFTER


More information about the Gcc-patches mailing list