Release ipa-prop's agg.items and make alocation more careful
authorJan Hubicka <jh@suse.cz>
Mon, 23 Nov 2020 15:58:23 +0000 (16:58 +0100)
committerJan Hubicka <jh@suse.cz>
Mon, 23 Nov 2020 15:58:23 +0000 (16:58 +0100)
This saves about 316MB WPAing Firefox

* ipa-prop.c (build_agg_jump_func_from_list,
ipa_read_jump_function): Reserve agg.items precisely.
* ipa-prop.h (ipa_node_params::~ipa_node_params): Release descriptors
(ipa_edge_args::~ipa_edge_args): Release agg.items.

gcc/ipa-prop.c
gcc/ipa-prop.h

index 7a5fa59ecec0c1a076881fa3156775eb7c07e5d4..904a8f7d18b8654ded562ecfdd3226c52cc169b2 100644 (file)
@@ -1682,7 +1682,7 @@ build_agg_jump_func_from_list (struct ipa_known_agg_contents_list *list,
                               int value_count, HOST_WIDE_INT arg_offset,
                               struct ipa_jump_func *jfunc)
 {
-  vec_alloc (jfunc->agg.items, value_count);
+  vec_safe_reserve (jfunc->agg.items, value_count, true);
   for (; list; list = list->next)
     {
       struct ipa_agg_jf_item item;
@@ -4745,7 +4745,10 @@ ipa_read_jump_function (class lto_input_block *ib,
 
   count = streamer_read_uhwi (ib);
   if (prevails)
-    vec_alloc (jump_func->agg.items, count);
+    {
+      jump_func->agg.items = NULL;
+      vec_safe_reserve (jump_func->agg.items, count, true);
+    }
   if (count)
     {
       struct bitpack_d bp = streamer_read_bitpack (ib);
index 77e92b04bbaa9a95c32b3fa12a37c9fc3edaf6b8..56e80559cf4b7bc56b217bc56fdf59d1214df7f0 100644 (file)
@@ -620,6 +620,7 @@ inline
 ipa_node_params::~ipa_node_params ()
 {
   free (lattices);
+  vec_free (descriptors);
   known_csts.release ();
   known_contexts.release ();
 }
@@ -895,6 +896,10 @@ class GTY((for_user)) ipa_edge_args
   /* Destructor.  */
   ~ipa_edge_args ()
     {
+      unsigned int i;
+      ipa_jump_func *jf;
+      FOR_EACH_VEC_SAFE_ELT (jump_functions, i, jf)
+       vec_free (jf->agg.items);
       vec_free (jump_functions);
       vec_free (polymorphic_call_contexts);
     }