diff options
author | Richard Guenther <rguenther@suse.de> | 2009-12-02 15:22:01 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-12-02 15:22:01 +0000 |
commit | 2f697bc476c63bcf039cd8465b8eb9113406a712 (patch) | |
tree | d5beda2871917fde5991be864f8a3c26fdc379ea /gcc | |
parent | ca6f6174206d45754dc857c627f7170c1ed55fca (diff) | |
download | gcc-2f697bc476c63bcf039cd8465b8eb9113406a712.zip gcc-2f697bc476c63bcf039cd8465b8eb9113406a712.tar.gz gcc-2f697bc476c63bcf039cd8465b8eb9113406a712.tar.bz2 |
re PR middle-end/42229 (cancel_loop_tree: bad read causes ice)
2009-12-02 Richard Guenther <rguenther@suse.de>
PR middle-end/42229
* cfgloopmanip.c (remove_path): Avoid cancelling loops
twice.
From-SVN: r154914
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cfgloopmanip.c | 11 |
2 files changed, 8 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f20ff9..896781b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-12-02 Richard Guenther <rguenther@suse.de> + + PR middle-end/42229 + * cfgloopmanip.c (remove_path): Avoid cancelling loops + twice. + 2009-12-02 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> PR middle-end/42224 diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 459a1fd..69ed980 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -278,10 +278,9 @@ remove_path (edge e) edge ae; basic_block *rem_bbs, *bord_bbs, from, bb; VEC (basic_block, heap) *dom_bbs; - int i, nrem, n_bord_bbs, nreml; + int i, nrem, n_bord_bbs; sbitmap seen; bool irred_invalidated = false; - struct loop **deleted_loop; if (!can_remove_branch_p (e)) return false; @@ -342,15 +341,9 @@ remove_path (edge e) dom_bbs = NULL; /* Cancel loops contained in the path. */ - deleted_loop = XNEWVEC (struct loop *, nrem); - nreml = 0; for (i = 0; i < nrem; i++) if (rem_bbs[i]->loop_father->header == rem_bbs[i]) - deleted_loop[nreml++] = rem_bbs[i]->loop_father; - - for (i = 0; i < nreml; i++) - cancel_loop_tree (deleted_loop[i]); - free (deleted_loop); + cancel_loop_tree (rem_bbs[i]->loop_father); remove_bbs (rem_bbs, nrem); free (rem_bbs); |