From 7ee0681e055aac83bdf7ef9c9556743c8461bc5e Mon Sep 17 00:00:00 2001
From: Jan Hubicka <jh@suse.cz>
Date: Mon, 23 Nov 2020 16:58:23 +0100
Subject: [PATCH] Release ipa-prop's agg.items and make alocation more careful

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 | 7 +++++--
 gcc/ipa-prop.h | 5 +++++
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 7a5fa59ecec0..904a8f7d18b8 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 77e92b04bbaa..56e80559cf4b 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);
     }
-- 
GitLab