This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR58326
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 9 Sep 2013 15:13:42 +0200 (CEST)
- Subject: [PATCH] Fix PR58326
- Authentication-results: sourceware.org; auth=none
This fixes PR58326, fix_bb_placements via unloop does not properly
mark all blocks with uses that are now eventually subject to
loop-closed SSA handling.
Fixed with the following, bootstrapped and tested on
x86_64-unknown-linux-gnu, applied.
Richard.
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.
Index: gcc/cfgloopmanip.c
===================================================================
*** gcc/cfgloopmanip.c (revision 202382)
--- gcc/cfgloopmanip.c (working copy)
*************** fix_bb_placements (basic_block from,
*** 223,237 ****
if (!fix_loop_placement (from->loop_father, irred_invalidated))
continue;
target_loop = loop_outer (from->loop_father);
}
else
{
/* Ordinary basic block. */
if (!fix_bb_placement (from))
continue;
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)
--- 223,244 ----
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);
}
FOR_EACH_EDGE (e, ei, from->succs)
Index: gcc/testsuite/gcc.dg/torture/pr58326-1.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr58326-1.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr58326-1.c (working copy)
***************
*** 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;
+ }
+ }
+ }
Index: gcc/testsuite/gcc.dg/torture/pr58326-2.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr58326-2.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr58326-2.c (working copy)
***************
*** 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;
+ }
+ }
+ }