diff options
author | Richard Biener <rguenther@suse.de> | 2013-09-09 13:18:38 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-09-09 13:18:38 +0000 |
commit | 467a3558efb2d9ac55f643ad41d82c70477ea1de (patch) | |
tree | f64252be9ef1b4500b3be2868803c331e4506af8 /gcc | |
parent | 849107c128378779f133c435d3f76d45b599361b (diff) | |
download | gcc-467a3558efb2d9ac55f643ad41d82c70477ea1de.zip gcc-467a3558efb2d9ac55f643ad41d82c70477ea1de.tar.gz gcc-467a3558efb2d9ac55f643ad41d82c70477ea1de.tar.bz2 |
re PR tree-optimization/58326 (ICE in check_loop_closed_ssa_use, at tree-ssa-loop-manip.c:551)
2013-09-09 Richard Biener <rguenther@suse.de>
PR middle-end/58326
* cfgloopmanip.c (fix_bb_placements): When fixing the placement
of a subloop record all its block as affecting loop-closed SSA form.
* gcc.dg/torture/pr58326-1.c: New testcase.
* gcc.dg/torture/pr58326-2.c: Likewise.
From-SVN: r202399
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cfgloopmanip.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr58326-1.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr58326-2.c | 20 |
5 files changed, 63 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0eb112f..228fd1ba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-09-09 Richard Biener <rguenther@suse.de> + + PR middle-end/58326 + * cfgloopmanip.c (fix_bb_placements): When fixing the placement + of a subloop record all its block as affecting loop-closed SSA form. + 2013-09-09 Richard Sandiford <rdsandiford@googlemail.com> * expmed.c (lshift_value): Take an unsigned HOST_WIDE_INT instead diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index f35e5ae..cce5d46 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -223,15 +223,22 @@ fix_bb_placements (basic_block from, if (!fix_loop_placement (from->loop_father, irred_invalidated)) continue; target_loop = loop_outer (from->loop_father); + if (loop_closed_ssa_invalidated) + { + basic_block *bbs = get_loop_body (from->loop_father); + for (unsigned i = 0; i < from->loop_father->num_nodes; ++i) + bitmap_set_bit (loop_closed_ssa_invalidated, bbs[i]->index); + free (bbs); + } } else { /* Ordinary basic block. */ if (!fix_bb_placement (from)) continue; + target_loop = from->loop_father; if (loop_closed_ssa_invalidated) bitmap_set_bit (loop_closed_ssa_invalidated, from->index); - target_loop = from->loop_father; } FOR_EACH_EDGE (e, ei, from->succs) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9726eb6..3bb49d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-09-09 Richard Biener <rguenther@suse.de> + + PR middle-end/58326 + * gcc.dg/torture/pr58326-1.c: New testcase. + * gcc.dg/torture/pr58326-2.c: Likewise. + 2013-09-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/57735 diff --git a/gcc/testsuite/gcc.dg/torture/pr58326-1.c b/gcc/testsuite/gcc.dg/torture/pr58326-1.c new file mode 100644 index 0000000..3b46eed --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58326-1.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +int a, *d; +long b; +short c; + +void foo () +{ + int e; +lbl: + for (c = 0; c < 2; c++) + { + if (1 >> b) + break; + e = *d; + for (; a; a++) + { + *d = e; + if (b) + goto lbl; + } + } +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58326-2.c b/gcc/testsuite/gcc.dg/torture/pr58326-2.c new file mode 100644 index 0000000..ddddbbe --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58326-2.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ + +int a, b, c, d; + +void foo () +{ + int e; + +lbl: + for (c = 0; c < 2; c++) + { + e = d; + for (; a; a++) + { + d = e; + if (b) + goto lbl; + } + } +} |