Fix memory leak in ipa-pure-const
authorMartin Liska <mliska@suse.cz>
Thu, 19 May 2016 15:06:17 +0000 (17:06 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 19 May 2016 15:06:17 +0000 (15:06 +0000)
* ipa-pure-const.c (set_function_state): Remove an existing
funct_state.
(remove_node_data): Do not free it as it's released
in set_function_state.

From-SVN: r236469

gcc/ChangeLog
gcc/ipa-pure-const.c

index ab513e6cac4b704d63b9a32179a91df02d06ca2e..effe9c31a7f5724a59c893ecc26590b4c7739af1 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-19  Martin Liska  <mliska@suse.cz>
+
+       * ipa-pure-const.c (set_function_state): Remove an existing
+       funct_state.
+       (remove_node_data): Do not free it as it's released
+       in set_function_state.
+
 2016-05-19  Martin Liska  <mliska@suse.cz>
 
        * tree-vect-slp.c (vect_attempt_slp_rearrange_stmts): Release
index ba76275a696792ecd89b0346fe66755a2c455cc1..a9570e4aa6c56585da55714e426db52046f6dedd 100644 (file)
@@ -258,6 +258,13 @@ set_function_state (struct cgraph_node *node, funct_state s)
   if (!funct_state_vec.exists ()
       || funct_state_vec.length () <= (unsigned int)node->uid)
      funct_state_vec.safe_grow_cleared (node->uid + 1);
+
+  /* If funct_state_vec already contains a funct_state, we have to release
+     it before it's going to be ovewritten.  */
+  if (funct_state_vec[node->uid] != NULL
+      && funct_state_vec[node->uid] != &varying_state)
+    free (funct_state_vec[node->uid]);
+
   funct_state_vec[node->uid] = s;
 }
 
@@ -956,12 +963,7 @@ static void
 remove_node_data (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
 {
   if (has_function_state (node))
-    {
-      funct_state l = get_function_state (node);
-      if (l != &varying_state)
-        free (l);
-      set_function_state (node, NULL);
-    }
+    set_function_state (node, NULL);
 }
 
 \f