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
This commit is contained in:
Zdenek Dvorak 2011-03-05 15:28:14 +01:00 committed by Jakub Jelinek
parent 6fe471c8ca
commit 634ee309bb
4 changed files with 44 additions and 4 deletions

View File

@ -1,3 +1,9 @@
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>
PR target/47719

View File

@ -1,5 +1,5 @@
/* 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.
This file is part of GCC.
@ -174,7 +174,7 @@ fix_bb_placements (basic_block from,
{
sbitmap in_queue;
basic_block *queue, *qtop, *qbeg, *qend;
struct loop *base_loop;
struct loop *base_loop, *target_loop;
edge e;
/* We pass through blocks back-reachable from FROM, testing whether some
@ -214,12 +214,14 @@ fix_bb_placements (basic_block from,
/* Subloop header, maybe move the loop upward. */
if (!fix_loop_placement (from->loop_father))
continue;
target_loop = loop_outer (from->loop_father);
}
else
{
/* Ordinary basic block. */
if (!fix_bb_placement (from))
continue;
target_loop = from->loop_father;
}
FOR_EACH_EDGE (e, ei, from->succs)
@ -248,9 +250,12 @@ fix_bb_placements (basic_block from,
&& (nca == base_loop
|| nca != pred->loop_father))
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;
}

View File

@ -1,5 +1,8 @@
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.
PR tree-optimization/47967

View File

@ -0,0 +1,26 @@
/* 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;
}