Patchwork Fix IRA memory leak (PR middle-end/56461)

login
register
mail settings
Submitter Jakub Jelinek
Date March 1, 2013, 8:21 p.m.
Message ID <20130301202120.GJ12913@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/224449/
State New
Headers show

Comments

Jakub Jelinek - March 1, 2013, 8:21 p.m.
Hi!

When ira_destroy is called, often (always?) this is after
loop_optimize_finalize call and thus current_loops is NULL, which results in
only freeing ira_loop_nodes[0] and not ira_loop_nodes[1] and above (if any).

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2013-03-01  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/56461
	* ira-build.c (ira_loop_nodes_count): New variable.
	(create_loop_tree_nodes): Initialize it.
	(finish_loop_tree_nodes): Use it instead of looking at current_loops.


	Jakub
Jeff Law - March 1, 2013, 10:48 p.m.
On 03/01/2013 01:21 PM, Jakub Jelinek wrote:
> Hi!
>
> When ira_destroy is called, often (always?) this is after
> loop_optimize_finalize call and thus current_loops is NULL, which results in
> only freeing ira_loop_nodes[0] and not ira_loop_nodes[1] and above (if any).
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?
>
> 2013-03-01  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR middle-end/56461
> 	* ira-build.c (ira_loop_nodes_count): New variable.
> 	(create_loop_tree_nodes): Initialize it.
> 	(finish_loop_tree_nodes): Use it instead of looking at current_loops.
OK.

Jeff

Patch

--- gcc/ira-build.c.jj	2013-02-08 13:16:55.000000000 +0100
+++ gcc/ira-build.c	2013-03-01 17:30:30.279549566 +0100
@@ -57,6 +57,9 @@  ira_loop_tree_node_t ira_bb_nodes;
    array.  */
 ira_loop_tree_node_t ira_loop_nodes;
 
+/* And size of the ira_loop_nodes array.  */
+unsigned int ira_loop_nodes_count;
+
 /* Map regno -> allocnos with given regno (see comments for
    allocno member `next_regno_allocno').  */
 ira_allocno_t *ira_regno_allocno_map;
@@ -142,14 +145,16 @@  create_loop_tree_nodes (void)
     }
   if (current_loops == NULL)
     {
+      ira_loop_nodes_count = 1;
       ira_loop_nodes = ((struct ira_loop_tree_node *)
 			ira_allocate (sizeof (struct ira_loop_tree_node)));
       init_loop_tree_node (ira_loop_nodes, 0);
       return;
     }
+  ira_loop_nodes_count = number_of_loops ();
   ira_loop_nodes = ((struct ira_loop_tree_node *)
 		    ira_allocate (sizeof (struct ira_loop_tree_node)
-				  * number_of_loops ()));
+				  * ira_loop_nodes_count));
   FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop)
     {
       if (loop_outer (loop) != NULL)
@@ -217,13 +222,9 @@  static void
 finish_loop_tree_nodes (void)
 {
   unsigned int i;
-  loop_p loop;
 
-  if (current_loops == NULL)
-    finish_loop_tree_node (&ira_loop_nodes[0]);
-  else
-    FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop)
-      finish_loop_tree_node (&ira_loop_nodes[i]);
+  for (i = 0; i < ira_loop_nodes_count; i++)
+    finish_loop_tree_node (&ira_loop_nodes[i]);
   ira_free (ira_loop_nodes);
   for (i = 0; i < (unsigned int) last_basic_block_before_change; i++)
     {