re PR rtl-optimization/46777 (ICE: in rtl_verify_flow_info, at cfgrtl.c:2164 with -O -fgcse -fno-tree-dominator-opts -funroll-loops)
PR rtl-optimization/46777 * cfglayout.c (duplicate_insn_chain): Avoid duplicating also barrier after tablejump. * gcc.dg/pr46777.c: New test. From-SVN: r167513
This commit is contained in:
parent
ce7190e503
commit
150bd82096
4 changed files with 74 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2010-12-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/46777
|
||||
* cfglayout.c (duplicate_insn_chain): Avoid duplicating
|
||||
also barrier after tablejump.
|
||||
|
||||
2010-12-06 Joern Rennecke <amylaar@spamcop.net>
|
||||
Richard Henderson <rth@redhat.com>
|
||||
|
||||
|
|
|
@ -1177,7 +1177,20 @@ duplicate_insn_chain (rtx from, rtx to)
|
|||
moved far from original jump. */
|
||||
if (GET_CODE (PATTERN (insn)) == ADDR_VEC
|
||||
|| GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
|
||||
break;
|
||||
{
|
||||
/* Avoid copying following barrier as well if any
|
||||
(and debug insns in between). */
|
||||
rtx next;
|
||||
|
||||
for (next = NEXT_INSN (insn);
|
||||
next != NEXT_INSN (to);
|
||||
next = NEXT_INSN (next))
|
||||
if (!DEBUG_INSN_P (next))
|
||||
break;
|
||||
if (next != NEXT_INSN (to) && BARRIER_P (next))
|
||||
insn = next;
|
||||
break;
|
||||
}
|
||||
copy = emit_copy_of_insn_after (insn, get_last_insn ());
|
||||
maybe_copy_prologue_epilogue_insn (insn, copy);
|
||||
break;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-12-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/46777
|
||||
* gcc.dg/pr46777.c: New test.
|
||||
|
||||
2010-12-06 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
* ada/acats/run_acats (which): Assign output to temporary
|
||||
|
|
49
gcc/testsuite/gcc.dg/pr46777.c
Normal file
49
gcc/testsuite/gcc.dg/pr46777.c
Normal file
|
@ -0,0 +1,49 @@
|
|||
/* PR rtl-optimization/46777 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fgcse -O -fno-tree-dominator-opts -funroll-loops" } */
|
||||
|
||||
struct S { char s[256]; };
|
||||
|
||||
static inline int
|
||||
foo (int x, int y)
|
||||
{
|
||||
switch (x)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
return 3;
|
||||
case 3:
|
||||
case 4:
|
||||
return 2;
|
||||
case 5:
|
||||
switch (y)
|
||||
{
|
||||
case 4:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
bar (struct S *x, int *y, int *z, int **w)
|
||||
{
|
||||
switch (*y ? x->s[*y] : foo (y[1], y[0]))
|
||||
{
|
||||
case 3:
|
||||
if (y + 2 == z)
|
||||
for (;;)
|
||||
{
|
||||
y += 2;
|
||||
switch (*y ? x->s[*y] : foo (y[1], y[0]))
|
||||
{
|
||||
case 6:
|
||||
break;
|
||||
default:
|
||||
*w = y;
|
||||
}
|
||||
if (y == z)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue