aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-init.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-03-05 12:51:28 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-03-05 12:51:28 +0000
commit5e7f1aefc8b754e66193c18731555bdb0862c4ae (patch)
treedbb423ab934369b2eb339e3f89d2115b931ff519 /gcc/loop-init.c
parentf276b762ec8ead4f3133a676d68d67bfd22d3c1a (diff)
downloadgcc-5e7f1aefc8b754e66193c18731555bdb0862c4ae.zip
gcc-5e7f1aefc8b754e66193c18731555bdb0862c4ae.tar.gz
gcc-5e7f1aefc8b754e66193c18731555bdb0862c4ae.tar.bz2
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
Diffstat (limited to 'gcc/loop-init.c')
-rw-r--r--gcc/loop-init.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/loop-init.c b/gcc/loop-init.c
index b1954ca..f754938 100644
--- a/gcc/loop-init.c
+++ b/gcc/loop-init.c
@@ -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. */