re PR tree-optimization/46107 (-ftree-loop-distribute-patterns caused verify_loop_structure problem)

PR tree-optimization/46107
	* cfgloopmanip.c (loop_version): Set irred_flag back into entry->flags
	if cfg_hook_duplicate_loop_to_header_edge failed.

	* gcc.c-torture/compile/pr46107.c: New test.

From-SVN: r166234
This commit is contained in:
Jakub Jelinek 2010-11-03 10:49:16 +01:00 committed by Jakub Jelinek
parent 48215350c2
commit 71056fef3b
4 changed files with 31 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2010-11-03 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/46107
* cfgloopmanip.c (loop_version): Set irred_flag back into entry->flags
if cfg_hook_duplicate_loop_to_header_edge failed.
2010-11-03 Ian Lance Taylor <iant@google.com> 2010-11-03 Ian Lance Taylor <iant@google.com>
PR lto/46273 PR lto/46273

View File

@ -1,6 +1,6 @@
/* Loop manipulation code for GNU compiler. /* Loop manipulation code for GNU compiler.
Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
Foundation, Inc. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
@ -1538,7 +1538,10 @@ loop_version (struct loop *loop,
/* Duplicate loop. */ /* Duplicate loop. */
if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1, if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1,
NULL, NULL, NULL, 0)) NULL, NULL, NULL, 0))
{
entry->flags |= irred_flag;
return NULL; return NULL;
}
/* After duplication entry edge now points to new loop head block. /* After duplication entry edge now points to new loop head block.
Note down new head as second_head. */ Note down new head as second_head. */

View File

@ -1,5 +1,8 @@
2010-11-03 Jakub Jelinek <jakub@redhat.com> 2010-11-03 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/46107
* gcc.c-torture/compile/pr46107.c: New test.
PR debug/46252 PR debug/46252
* gcc.dg/pr46252.c: New test. * gcc.dg/pr46252.c: New test.

View File

@ -0,0 +1,16 @@
/* PR tree-optimization/46107 */
int foo (void) __attribute__ ((noreturn));
void
bar (int x, int *y, int z)
{
static void *j[] = { &&l1, &&l2 };
l1:
if (*y)
goto *j[z];
foo ();
l2:
*y ^= (x & 1) ? -1 : 0;
goto *j[x];
}