Free some more stuff in free_lang_data

Richard Biener rguenther@suse.de
Fri Nov 8 10:09:00 GMT 2019


On Thu, 7 Nov 2019, Jan Hubicka wrote:

> Hi,
> as every year, I went through reasons why types of same ODR name are not
> merged in firefox streaming.  Here are few problems I caught.  Remaining
> issues I understand are
>  1) odr violations (which is OK of course)
>  2) keyed vtables: sometimes the vtable decl is weak and sometimes it is
>     external (I have WIP patch for ipa-devirt to stream BINFO_VTABLE off
>     the main stream, but at least for Firefox it does not have any
>     dramatic effects on the size of stream)
>  3) differences in attribute list (some attributes, like aligned does
>     not make sense on incomplete types, but our FEs lets us to add them
>     there so I think there is no canonical incomplete variant here)
>  4) TYPELESS storage differences
>  5) if type is not merged also all types referring to it via
>     TYPE_CONTEXT are not.  This still causes propagation from type to
>     another
> 
> There are still some cases which I did not track down, but we have only
> couple hundred of unmerged types, so situation seems to be mostly under
> control.
> 
> There is about 700MB of trees in global stream for Firefox + 200MB of
> in_decl_state vectors and I am not sure if there are easy ways to cut it
> down.
> 
> Kind                   Nodes      Bytes
> ----------------------------------------
> constructors             12k       308k
> vecs                     15k      1593k
> refs                     55k      2702k
> binfos                   63k      6670k
> constants               253k      9760k
> random kinds            654k        25M
> exprs                   744k        23M
> identifiers            1217k        47M
> decls                  1583k       293M
> types                  1822k       298M
> ----------------------------------------
> Total                  6423k       709M
> ----------------------------------------
> 
> union_type                         4335 
> real_cst                           7244 
> mem_ref                            8429 
> array_type                           10k
> enumeral_type                        10k
> constructor                          12k
> tree_vec                             15k
> array_ref                            15k
> nop_expr                             19k
> component_ref                        30k
> pointer_plus_expr                    41k
> tree_binfo                           63k
> var_decl                             78k
> function_type                       106k
> integer_cst                         110k
> reference_type                      125k
> string_cst                          132k
> type_decl                           203k
> record_type                         335k
> field_decl                          355k
> method_type                         583k
> pointer_type                        642k
> tree_list                           654k
> addr_expr                           683k
> function_decl                       941k
> identifier_node                    1217k
> ----------------------------------------
> 
> 
> 
> Bootstrapped/regtested x86_64-linux, OK?

OK.

Thanks,
Richard.

> Honza
> 
> 	* tree.c (fld_incomplete_type_of): Clear TYPE_FINAL_P, TYPE_EMPTY_P,
> 	ENUM_IS_OPAQUE and ENUM_IS_SCOPED.
> 	(free_lang_data_in_binfo): Clear TREE_PUBLIC in BINFO
> 	(free_lang_data_in_type): Clear ENUM_IS_OPAQUE and ENUM_IS_SCOPED.
> Index: tree.c
> ===================================================================
> --- tree.c	(revision 277796)
> +++ tree.c	(working copy)
> @@ -5383,9 +5387,15 @@ fld_incomplete_type_of (tree t, class fr
>  	      TYPE_TYPELESS_STORAGE (copy) = 0;
>  	      TYPE_FIELDS (copy) = NULL;
>  	      TYPE_BINFO (copy) = NULL;
> +	      TYPE_FINAL_P (copy) = 0;
> +	      TYPE_EMPTY_P (copy) = 0;
>  	    }
>  	  else
> -	    TYPE_VALUES (copy) = NULL;
> +	    {
> +	      TYPE_VALUES (copy) = NULL;
> +	      ENUM_IS_OPAQUE (copy) = 0;
> +	      ENUM_IS_SCOPED (copy) = 0;
> +	    }
>  
>  	  /* Build copy of TYPE_DECL in TYPE_NAME if necessary.
>  	     This is needed for ODR violation warnings to come out right (we
> @@ -5468,6 +5478,7 @@ free_lang_data_in_binfo (tree binfo)
>    BINFO_INHERITANCE_CHAIN (binfo) = NULL_TREE;
>    BINFO_SUBVTT_INDEX (binfo) = NULL_TREE;
>    BINFO_VPTR_FIELD (binfo) = NULL_TREE;
> +  TREE_PUBLIC (binfo) = 0;
>  
>    FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (binfo), i, t)
>      free_lang_data_in_binfo (t);
> @@ -5569,6 +5580,8 @@ free_lang_data_in_type (tree type, class
>      {
>        if (TREE_CODE (type) == ENUMERAL_TYPE)
>  	{
> +	  ENUM_IS_OPAQUE (type) = 0;
> +	  ENUM_IS_SCOPED (type) = 0;
>  	  /* Type values are used only for C++ ODR checking.  Drop them
>  	     for all type variants and non-ODR types.
>  	     For ODR types the data is freed in free_odr_warning_data.  */
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)


More information about the Gcc-patches mailing list