This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Reorder fields in struct cgraph_edge et al


On Mon, 30 Nov 2009, Martin Jambor wrote:

> Hi,
> 
> I have noticed that struct cgraph_edge is currently misaligned by one
> bit.  This patch fixes that by making loop_nest an unsigned short, and
> so leaving plenty of bits available for future flags.  When doing so,
> I also reordered the fields according to their size which should also
> decrease the size of the structure.  Then I did the same thing with a
> very similar structure in ipa-prop.h, namely param_call_note.
> Finally, because I have noticed that loop_nest is not set, I fixed
> that.
> 
> I have bootstrapped and tested this on x86_64-linux.  I seek
> permission to commit this to trunk despite stage 4 looming on the
> horizon.  (Fortunately I do not have any more patches like this :-)
> 
> Thanks,
> 
> Martin
> 
> 
> 
> 2009-11-30  Martin Jambor  <mjambor@suse.cz>
> 
>         * cgraph.h (GTY): Reorder fields.  Make loop_nest unsigned short int.
> 	* ipa-prop.h (struct ipa_param_call_note): Likewise.
> 	* ipa-prop.c (ipa_note_param_call): Set note->loop_nest.
> 
> Index: icln/gcc/cgraph.h
> ===================================================================
> --- icln.orig/gcc/cgraph.h
> +++ icln/gcc/cgraph.h
> @@ -310,6 +310,8 @@ typedef enum {
>  } cgraph_inline_failed_t;
>  
>  struct GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"))) cgraph_edge {
> +  /* Expected number of executions: calculated in profile.c.  */
> +  gcov_type count;

you now have introduced 32bit padding here ...

>    struct cgraph_node *caller;
>    struct cgraph_node *callee;
>    struct cgraph_edge *prev_caller;
> @@ -317,29 +319,27 @@ struct GTY((chain_next ("%h.next_caller"
>    struct cgraph_edge *prev_callee;
>    struct cgraph_edge *next_callee;
>    gimple call_stmt;
> -  /* The stmt_uid of this call stmt.  This is used by LTO to recover
> -     the call_stmt when the function is serialized in.  */
> -  unsigned int lto_stmt_uid;
>    PTR GTY ((skip (""))) aux;
>    /* When equal to CIF_OK, inline this call.  Otherwise, points to the
>       explanation why function was not inlined.  */
>    cgraph_inline_failed_t inline_failed;
> -  /* Expected number of executions: calculated in profile.c.  */
> -  gcov_type count;
> +  /* The stmt_uid of call_stmt.  This is used by LTO to recover the call_stmt
> +     when the function is serialized in.  */
> +  unsigned int lto_stmt_uid;

moving this is ok, please leave count where it is

>    /* Expected frequency of executions within the function.
>       When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
>       per function call.  The range is 0 to CGRAPH_FREQ_MAX.  */
>    int frequency;
> +  /* Unique id of the edge.  */
> +  int uid;
>    /* Depth of loop nest, 1 means no loop nest.  */
> -  unsigned int loop_nest : 30;
> +  unsigned short int loop_nest;
>    /* Whether this edge describes a call that was originally indirect.  */
>    unsigned int indirect_call : 1;
>    /* True if the corresponding CALL stmt cannot be inlined.  */
>    unsigned int call_stmt_cannot_inline_p : 1;
>    /* Can this call throw externally?  */
>    unsigned int can_throw_external : 1;
> -  /* Unique id of the edge.  */
> -  int uid;
>  };
>  
>  #define CGRAPH_FREQ_BASE 1000
> Index: icln/gcc/ipa-prop.c
> ===================================================================
> --- icln.orig/gcc/ipa-prop.c
> +++ icln/gcc/ipa-prop.c
> @@ -754,6 +754,7 @@ ipa_note_param_call (struct ipa_node_par
>    note->lto_stmt_uid = gimple_uid (stmt);
>    note->count = bb->count;
>    note->frequency = compute_call_stmt_bb_frequency (current_function_decl, bb);
> +  note->loop_nest = bb->loop_depth;
>  
>    note->next = info->param_calls;
>    info->param_calls = note;
> Index: icln/gcc/ipa-prop.h
> ===================================================================
> --- icln.orig/gcc/ipa-prop.h
> +++ icln/gcc/ipa-prop.h
> @@ -139,6 +139,8 @@ struct ipcp_lattice
>     are linked in a list.  */
>  struct ipa_param_call_note
>  {
> +  /* Expected number of executions: calculated in profile.c.  */
> +  gcov_type count;

Likewise.  gcov_type is 32bit.

Ok with that chagnes.

Richard.

>    /* Linked list's next */
>    struct ipa_param_call_note *next;
>    /* Statement that contains the call to the parameter above.  */
> @@ -147,13 +149,11 @@ struct ipa_param_call_note
>    unsigned int lto_stmt_uid;
>    /* Index of the parameter that is called.  */
>    int formal_id;
> -  /* Expected number of executions: calculated in profile.c.  */
> -  gcov_type count;
>    /* Expected frequency of executions within the function. see cgraph_edge in
>       cgraph.h for more on this. */
>    int frequency;
>    /* Depth of loop nest, 1 means no loop nest.  */
> -  int loop_nest;
> +  unsigned short int loop_nest;
>    /* Set when we have already found the target to be a compile time constant
>       and turned this into an edge or when the note was found unusable for some
>       reason.  */
> 
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]