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 <ja...@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. --- 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++) { Jakub