On Tue, 6 Nov 2018, Jan Hubicka wrote:

> Hi,
> this patch simplifies function types.  For GCC it cuts number of type
> duplicates to half (to about 500 duplicates).  I need to analyze the
> remaining ones, but i think they are mostly caused by mixing up
> complete/incomplete enums and arrays of pointers that should be last
> necessary changes to avoid duplicated ODR types at the GCC bootstrap.
> 
> We are now down from 650MB to 450MB of ltrans files since my last
> report https://gcc.gnu.org/ml/gcc-patches/2018-10/msg02034.html
> 
>  phase opt and generate             :  39.37 ( 78%)   0.87 ( 13%)  40.27 ( 
> 70%)  411110 kB ( 29%)
>  phase stream in                    :  10.34 ( 20%)   0.40 (  6%)  10.74 ( 
> 19%)  980729 kB ( 70%)
>  ipa function summary               :   0.20 (  0%)   0.05 (  1%)   0.24 (  
> 0%)   67974 kB (  5%)
>  ipa cp                             :   0.85 (  2%)   0.05 (  1%)   0.93 (  
> 2%)  126839 kB (  9%)
>  ipa inlining heuristics            :  30.71 ( 61%)   0.08 (  1%)  30.81 ( 
> 53%)  119761 kB (  9%)
>  lto stream inflate                 :   2.41 (  5%)   0.20 (  3%)   2.51 (  
> 4%)       0 kB (  0%)
>  ipa lto gimple in                  :   1.21 (  2%)   0.50 (  8%)   1.65 (  
> 3%)  201610 kB ( 14%)
>  ipa lto gimple out                 :   0.04 (  0%)   0.03 (  0%)   0.07 (  
> 0%)       0 kB (  0%)
>  whopr partitioning                 :   1.31 (  3%)   0.01 (  0%)   1.32 (  
> 2%)    5338 kB (  0%)
>  ipa icf                            :   2.93 (  6%)   0.07 (  1%)   3.04 (  
> 5%)   12830 kB (  1%)
>  TOTAL                              :  50.54          6.60         57.72      
>   1393898 kB
> 
> Thus even relatively small improvements in type merging still translate
> to large improvements in overal ltrans stream size, because types keeps
> dupicating everything else.
> 
> lto-bootstrapped/regtested x86_64-linux before some last minute change.
> Re-testing, OK if it passes?

OK.

Richard.

> Honza
> 
>       * tree.c (free_lang_data_in_type): Add fld parameter; simplify
>       return and parameter types of function and method types.
>       (free_lang_data_in_cgraph): Update.
> Index: tree.c
> ===================================================================
> --- tree.c    (revision 265848)
> +++ tree.c    (working copy)
> @@ -5261,7 +5261,7 @@ free_lang_data_in_binfo (tree binfo)
>  /* Reset all language specific information still present in TYPE.  */
>  
>  static void
> -free_lang_data_in_type (tree type)
> +free_lang_data_in_type (tree type, struct free_lang_data_d *fld)
>  {
>    gcc_assert (TYPE_P (type));
>  
> @@ -5280,6 +5280,7 @@ free_lang_data_in_type (tree type)
>  
>    if (TREE_CODE (type) == FUNCTION_TYPE)
>      {
> +      TREE_TYPE (type) = fld_simplified_type (TREE_TYPE (type), fld);
>        /* Remove the const and volatile qualifiers from arguments.  The
>        C++ front end removes them, but the C front end does not,
>        leading to false ODR violation errors when merging two
> @@ -5287,6 +5288,7 @@ free_lang_data_in_type (tree type)
>        different front ends.  */
>        for (tree p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
>       {
> +          TREE_VALUE (p) = fld_simplified_type (TREE_VALUE (p), fld);
>         tree arg_type = TREE_VALUE (p);
>  
>         if (TYPE_READONLY (arg_type) || TYPE_VOLATILE (arg_type))
> @@ -5295,16 +5297,22 @@ free_lang_data_in_type (tree type)
>                         & ~TYPE_QUAL_CONST
>                         & ~TYPE_QUAL_VOLATILE;
>             TREE_VALUE (p) = build_qualified_type (arg_type, quals);
> -           free_lang_data_in_type (TREE_VALUE (p));
> +           free_lang_data_in_type (TREE_VALUE (p), fld);
>           }
>         /* C++ FE uses TREE_PURPOSE to store initial values.  */
>         TREE_PURPOSE (p) = NULL;
>       }
>      }
>    else if (TREE_CODE (type) == METHOD_TYPE)
> -    for (tree p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
> -      /* C++ FE uses TREE_PURPOSE to store initial values.  */
> -      TREE_PURPOSE (p) = NULL;
> +    {
> +      TREE_TYPE (type) = fld_simplified_type (TREE_TYPE (type), fld);
> +      for (tree p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
> +     {
> +       /* C++ FE uses TREE_PURPOSE to store initial values.  */
> +       TREE_VALUE (p) = fld_simplified_type (TREE_VALUE (p), fld);
> +       TREE_PURPOSE (p) = NULL;
> +     }
> +    }
>    else if (RECORD_OR_UNION_TYPE_P (type))
>      {
>        /* Remove members that are not FIELD_DECLs from the field list
> @@ -5985,7 +5994,7 @@ free_lang_data_in_cgraph (void)
>  
>    /* Traverse every type found freeing its language data.  */
>    FOR_EACH_VEC_ELT (fld.types, i, t)
> -    free_lang_data_in_type (t);
> +    free_lang_data_in_type (t, &fld);
>    if (flag_checking)
>      {
>        FOR_EACH_VEC_ELT (fld.types, i, t)
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to