From 467a3558efb2d9ac55f643ad41d82c70477ea1de Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 9 Sep 2013 13:18:38 +0000 Subject: [PATCH] re PR tree-optimization/58326 (ICE in check_loop_closed_ssa_use, at tree-ssa-loop-manip.c:551) 2013-09-09 Richard Biener 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 --- gcc/ChangeLog | 6 ++++++ gcc/cfgloopmanip.c | 9 ++++++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/torture/pr58326-1.c | 23 +++++++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr58326-2.c | 20 ++++++++++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr58326-1.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr58326-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0eb112f92d3..228fd1bad57 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-09-09 Richard Biener + + 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 * expmed.c (lshift_value): Take an unsigned HOST_WIDE_INT instead diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index f35e5aedc79..cce5d467f57 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 9726eb6655f..3bb49d9bb77 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-09-09 Richard Biener + + PR middle-end/58326 + * gcc.dg/torture/pr58326-1.c: New testcase. + * gcc.dg/torture/pr58326-2.c: Likewise. + 2013-09-09 Kyrylo Tkachov 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 00000000000..3b46eed9cac --- /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 00000000000..ddddbbe5785 --- /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; + } + } +} -- 2.30.2