re PR middle-end/56461 (GCC is leaking lots of memory)

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.

From-SVN: r196397
This commit is contained in:
Jakub Jelinek 2013-03-01 23:55:26 +01:00 committed by Jakub Jelinek
parent b6b9227d52
commit caff7edf99
2 changed files with 13 additions and 7 deletions

View File

@ -1,5 +1,10 @@
2013-03-01 Jakub Jelinek <jakub@redhat.com> 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.
PR middle-end/56461 PR middle-end/56461
* tree-vect-data-refs.c (vect_permute_store_chain): Avoid using copy * tree-vect-data-refs.c (vect_permute_store_chain): Avoid using copy
method on dr_chain and result_chain. method on dr_chain and result_chain.

View File

@ -57,6 +57,9 @@ ira_loop_tree_node_t ira_bb_nodes;
array. */ array. */
ira_loop_tree_node_t ira_loop_nodes; 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 /* Map regno -> allocnos with given regno (see comments for
allocno member `next_regno_allocno'). */ allocno member `next_regno_allocno'). */
ira_allocno_t *ira_regno_allocno_map; ira_allocno_t *ira_regno_allocno_map;
@ -142,14 +145,16 @@ create_loop_tree_nodes (void)
} }
if (current_loops == NULL) if (current_loops == NULL)
{ {
ira_loop_nodes_count = 1;
ira_loop_nodes = ((struct ira_loop_tree_node *) ira_loop_nodes = ((struct ira_loop_tree_node *)
ira_allocate (sizeof (struct ira_loop_tree_node))); ira_allocate (sizeof (struct ira_loop_tree_node)));
init_loop_tree_node (ira_loop_nodes, 0); init_loop_tree_node (ira_loop_nodes, 0);
return; return;
} }
ira_loop_nodes_count = number_of_loops ();
ira_loop_nodes = ((struct ira_loop_tree_node *) ira_loop_nodes = ((struct ira_loop_tree_node *)
ira_allocate (sizeof (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) FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop)
{ {
if (loop_outer (loop) != NULL) if (loop_outer (loop) != NULL)
@ -217,13 +222,9 @@ static void
finish_loop_tree_nodes (void) finish_loop_tree_nodes (void)
{ {
unsigned int i; unsigned int i;
loop_p loop;
if (current_loops == NULL) for (i = 0; i < ira_loop_nodes_count; i++)
finish_loop_tree_node (&ira_loop_nodes[0]); finish_loop_tree_node (&ira_loop_nodes[i]);
else
FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop)
finish_loop_tree_node (&ira_loop_nodes[i]);
ira_free (ira_loop_nodes); ira_free (ira_loop_nodes);
for (i = 0; i < (unsigned int) last_basic_block_before_change; i++) for (i = 0; i < (unsigned int) last_basic_block_before_change; i++)
{ {