re PR middle-end/56525 (Access to ggc_freed memory in flow_loops_find)

2013-03-05  Richard Biener  <rguenther@suse.de>

	PR middle-end/56525
	* loop-init.c (fix_loop_structure): Remove loops in two stages,
	not freeing them until the end.

From-SVN: r196462
This commit is contained in:
Richard Biener 2013-03-05 12:51:28 +00:00 committed by Richard Biener
parent f276b762ec
commit 5e7f1aefc8
2 changed files with 18 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2013-03-05 Richard Biener <rguenther@suse.de>
PR middle-end/56525
* loop-init.c (fix_loop_structure): Remove loops in two stages,
not freeing them until the end.
2013-03-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/s390.h: Define DWARF2_ASM_LINE_DEBUG_INFO.

View File

@ -186,7 +186,7 @@ fix_loop_structure (bitmap changed_bbs)
int record_exits = 0;
loop_iterator li;
struct loop *loop;
unsigned old_nloops;
unsigned old_nloops, i;
timevar_push (TV_LOOP_INIT);
@ -230,8 +230,9 @@ fix_loop_structure (bitmap changed_bbs)
flow_loop_tree_node_add (loop_outer (loop), ploop);
}
/* Remove the loop and free its data. */
delete_loop (loop);
/* Remove the loop. */
loop->header = NULL;
flow_loop_tree_node_remove (loop);
}
/* Remember the number of loops so we can return how many new loops
@ -253,6 +254,14 @@ fix_loop_structure (bitmap changed_bbs)
}
}
/* Finally free deleted loops. */
FOR_EACH_VEC_ELT (*get_loops (), i, loop)
if (loop && loop->header == NULL)
{
(*get_loops ())[i] = NULL;
flow_loop_free (loop);
}
loops_state_clear (LOOPS_NEED_FIXUP);
/* Apply flags to loops. */