Commit 634ee309 by Zdenek Dvorak Committed by Jakub Jelinek

re PR rtl-optimization/47899 (ICE in get_loop_body, at cfgloop.c:831)

	PR rtl-optimization/47899
	* cfgloopmanip.c (fix_bb_placements): Fix first argument
	to flow_loop_nested_p when moving the loop upward.

	* gcc.dg/pr47899.c: New test.

From-SVN: r170699
parent 6fe471c8
2011-03-05 Zdenek Dvorak <ook@ucw.cz>
PR rtl-optimization/47899
* cfgloopmanip.c (fix_bb_placements): Fix first argument
to flow_loop_nested_p when moving the loop upward.
2011-03-05 Richard Earnshaw <rearnsha@arm.com> 2011-03-05 Richard Earnshaw <rearnsha@arm.com>
PR target/47719 PR target/47719
......
/* Loop manipulation code for GNU compiler. /* Loop manipulation code for GNU compiler.
Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -174,7 +174,7 @@ fix_bb_placements (basic_block from, ...@@ -174,7 +174,7 @@ fix_bb_placements (basic_block from,
{ {
sbitmap in_queue; sbitmap in_queue;
basic_block *queue, *qtop, *qbeg, *qend; basic_block *queue, *qtop, *qbeg, *qend;
struct loop *base_loop; struct loop *base_loop, *target_loop;
edge e; edge e;
/* We pass through blocks back-reachable from FROM, testing whether some /* We pass through blocks back-reachable from FROM, testing whether some
...@@ -214,12 +214,14 @@ fix_bb_placements (basic_block from, ...@@ -214,12 +214,14 @@ fix_bb_placements (basic_block from,
/* Subloop header, maybe move the loop upward. */ /* Subloop header, maybe move the loop upward. */
if (!fix_loop_placement (from->loop_father)) if (!fix_loop_placement (from->loop_father))
continue; continue;
target_loop = loop_outer (from->loop_father);
} }
else else
{ {
/* Ordinary basic block. */ /* Ordinary basic block. */
if (!fix_bb_placement (from)) if (!fix_bb_placement (from))
continue; continue;
target_loop = from->loop_father;
} }
FOR_EACH_EDGE (e, ei, from->succs) FOR_EACH_EDGE (e, ei, from->succs)
...@@ -248,9 +250,12 @@ fix_bb_placements (basic_block from, ...@@ -248,9 +250,12 @@ fix_bb_placements (basic_block from,
&& (nca == base_loop && (nca == base_loop
|| nca != pred->loop_father)) || nca != pred->loop_father))
pred = pred->loop_father->header; pred = pred->loop_father->header;
else if (!flow_loop_nested_p (from->loop_father, pred->loop_father)) else if (!flow_loop_nested_p (target_loop, pred->loop_father))
{ {
/* No point in processing it. */ /* If PRED is already higher in the loop hierarchy than the
TARGET_LOOP to that we moved FROM, the change of the position
of FROM does not affect the position of PRED, so there is no
point in processing it. */
continue; continue;
} }
......
2011-03-05 Jakub Jelinek <jakub@redhat.com> 2011-03-05 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/47899
* gcc.dg/pr47899.c: New test.
* gcc.dg/torture/pr47968.c: Ignore warnings. * gcc.dg/torture/pr47968.c: Ignore warnings.
PR tree-optimization/47967 PR tree-optimization/47967
......
/* PR rtl-optimization/47899 */
/* { dg-do compile } */
/* { dg-options "-O -funroll-loops" } */
extern unsigned int a, b, c;
extern int d;
static int
foo (void)
{
lab:
if (b)
for (d = 0; d >= 0; d--)
if (a || c)
for (; c; c++)
;
else
goto lab;
}
int
main ()
{
foo ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment