aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-12-02 15:22:01 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-12-02 15:22:01 +0000
commit2f697bc476c63bcf039cd8465b8eb9113406a712 (patch)
treed5beda2871917fde5991be864f8a3c26fdc379ea /gcc
parentca6f6174206d45754dc857c627f7170c1ed55fca (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cfgloopmanip.c11
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);