re PR rtl-optimization/47157 (ICE: in calc_dfs_tree, at dominance.c:395 with -O)

PR rtl-optimization/47157
	* combine.c (try_combine): If undobuf.other_insn becomes
	(set (pc) (pc)) jump, call update_cfg_for_uncondjump on it
	and set *new_direct_jump_p too.

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

From-SVN: r168439
This commit is contained in:
Jakub Jelinek 2011-01-03 21:59:20 +01:00 committed by Jakub Jelinek
parent d652f226fc
commit 9766135bb1
4 changed files with 43 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2011-01-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/47157
* combine.c (try_combine): If undobuf.other_insn becomes
(set (pc) (pc)) jump, call update_cfg_for_uncondjump on it
and set *new_direct_jump_p too.
2011-01-03 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/47021

View File

@ -1,7 +1,7 @@
/* Optimize by combining instructions for GNU compiler.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011 Free Software Foundation, Inc.
This file is part of GCC.
@ -4378,6 +4378,15 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
update_cfg_for_uncondjump (i3);
}
if (undobuf.other_insn != NULL_RTX
&& GET_CODE (PATTERN (undobuf.other_insn)) == SET
&& SET_SRC (PATTERN (undobuf.other_insn)) == pc_rtx
&& SET_DEST (PATTERN (undobuf.other_insn)) == pc_rtx)
{
*new_direct_jump_p = 1;
update_cfg_for_uncondjump (undobuf.other_insn);
}
combine_successes++;
undo_commit ();

View File

@ -1,3 +1,8 @@
2011-01-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/47157
* gcc.c-torture/compile/pr47157.c: New test.
2011-01-03 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* gcc.dg/torture/vector-shift2.c (schar): Define.

View File

@ -0,0 +1,20 @@
/* PR rtl-optimization/47157 */
struct S { unsigned a; unsigned b; } c = { 1, 0 };
unsigned long int e;
void bar (int);
int baz (void);
static int
foo (int x, short y)
{
return ((x ^ y) & ((x ^ (x ^ y) & ~__INT_MAX__) - y ^ y)) < 0 ? x : x - y;
}
void
test (void)
{
bar (foo (baz () != (c.a | c.b), -1L));
for (e = 0; e; e = 1)
;
}