diff mbox series

Do not leak memory in ipa-prop

Message ID 20201123155947.GG37785@kam.mff.cuni.cz
State New
Headers show
Series Do not leak memory in ipa-prop | expand

Commit Message

Jan Hubicka Nov. 23, 2020, 3:59 p.m. UTC
Hi,
this patch adds missing gcc_free on agg.items and descriptors and makes
allocations precise.  This saves about 316MB WPAing Firefox

Honza

Bootstrapped/regtested x86_64-linux, comitted.

	* 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.
diff mbox series

Patch

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 7a5fa59ecec..904a8f7d18b 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -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);
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 77e92b04bba..56e80559cf4 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -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);
     }