> This patch adds remapping of node order for each lto partition.
> Resulting order conserves relative order inside partition, but
> is independent of outside symbols. So if lto partition contains
> identical set of symbols, their remapped order will be stable
> between compilations.
> 
> gcc/ChangeLog:
> 
>       * ipa-devirt.cc (ipa_odr_summary_write):
>       Add unused argument.
>       * ipa-fnsummary.cc (ipa_fn_summary_write): Likewise.
>       * ipa-icf.cc (sem_item_optimizer::write_summary): Likewise.
>       * ipa-modref.cc (modref_write): Likewise.
>       * ipa-prop.cc (ipa_prop_write_jump_functions): Likewise.
>       (ipcp_write_transformation_summaries): Likewise.
>       * ipa-sra.cc (ipa_sra_write_summary): Likewise.
>       * lto-cgraph.cc (lto_symtab_encoder_delete): Delete remap.
>       (lto_output_node): Remap order.
>       (lto_output_varpool_node): Likewise.
>       (output_cgraph_opt_summary): Add unused argument.
>       * lto-streamer-out.cc (produce_asm): Use remapped order.
>       (output_function): Propagate remapped order.
>       (output_constructor): Likewise.
>       (copy_function_or_variable): Likewise.
>       (cmp_int): New.
>       (create_order_remap): New.
>       (lto_output): Create remap. Remap order.
>       * lto-streamer.h (struct lto_symtab_encoder_d): Remap hash_map.
>       (produce_asm): Add order argument.

> ---
>  gcc/ipa-devirt.cc       |  2 +-
>  gcc/ipa-fnsummary.cc    |  2 +-
>  gcc/ipa-icf.cc          |  2 +-
>  gcc/ipa-modref.cc       |  4 +-
>  gcc/ipa-prop.cc         |  4 +-
>  gcc/ipa-sra.cc          |  2 +-
>  gcc/lto-cgraph.cc       | 10 +++--
>  gcc/lto-streamer-out.cc | 84 +++++++++++++++++++++++++++++++++++------
>  gcc/lto-streamer.h      |  5 ++-
>  9 files changed, 91 insertions(+), 24 deletions(-)
> 
> diff --git a/gcc/ipa-devirt.cc b/gcc/ipa-devirt.cc
> index c406e5138db..098798281b7 100644
> --- a/gcc/ipa-devirt.cc
> +++ b/gcc/ipa-devirt.cc
> @@ -4131,7 +4131,7 @@ ipa_odr_summary_write (void)
>        odr_enum_map = NULL;
>      }
>  
> -  produce_asm (ob, NULL);
> +  produce_asm (ob, NULL, -1);
Arguments of produce_asm seems somewhat magical.
> +/* Compare ints, callback for qsort.  */
> +
> +static int
> +cmp_int (const void *a, const void *b)
> +{
> +  int ia = *(int const*) a;
> +  int ib = *(int const*) b;
> +  return ia - ib;
> +}
Given that it is no longer C source, perhaps std::sort would allow doing
this without extra comparator.  But I am fine with the function as it is :)
> +extern void produce_asm (struct output_block *ob, tree fn, int output_order);

I would suggest renaming produce_asm to produce_symbol_asm 
and making produce_asm wrapper which passes fn=NULL and output_order=-1,
so we do not have odd parameters everywhere in streaming code.

OK with this change.
Honza

Reply via email to