re PR rtl-optimization/52139 (ICE: in remove_insn, at emit-rtl.c:3960 with -O -fPIC -fno-tree-dominator-opts -fno-tree-fre)

PR rtl-optimization/52139
	* cfgrtl.c (cfg_layout_merge_blocks): If BB_END
	is a BARRIER after emit_insn_after_noloc, move BB_END
	to the last non-BARRIER insn before it.

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

From-SVN: r184005
This commit is contained in:
Jakub Jelinek 2012-02-08 13:29:43 +01:00 committed by Jakub Jelinek
parent 7b50c4a3fa
commit bd73623c90
4 changed files with 66 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2012-02-08 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/52139
* cfgrtl.c (cfg_layout_merge_blocks): If BB_END
is a BARRIER after emit_insn_after_noloc, move BB_END
to the last non-BARRIER insn before it.
2012-02-07 Richard Sandiford <rdsandiford@googlemail.com>
PR middle-end/24306

View file

@ -2871,6 +2871,11 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
rtx first = BB_END (a), last;
last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a), a);
/* The above might add a BARRIER as BB_END, but as barriers
aren't valid parts of a bb, remove_insn doesn't update
BB_END if it is a barrier. So adjust BB_END here. */
while (BB_END (a) != first && BARRIER_P (BB_END (a)))
BB_END (a) = PREV_INSN (BB_END (a));
delete_insn_chain (NEXT_INSN (first), last, false);
b->il.rtl->header = NULL;
}

View file

@ -1,3 +1,8 @@
2012-02-08 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/52139
* gcc.dg/pr52139.c: New test.
2012-02-07 Jason Merrill <jason@redhat.com>
PR c++/51675

View file

@ -0,0 +1,49 @@
/* PR rtl-optimization/52139 */
/* { dg-do compile } */
/* { dg-options "-O -fno-tree-dominator-opts -fno-tree-fre" } */
/* { dg-additional-options "-fpic" { target fpic } } */
void *p;
void
foo (int a)
{
switch (a)
{
case 0:
a0:
case 1:
a1:
p = &&a1;
case 2:
a2:
p = &&a2;
case 3:
a3:
p = &&a3;
case 4:
a4:
p = &&a4;
case 5:
a5:
p = &&a5;
case 6:
a6:
p = &&a6;
case 7:
a7:
p = &&a7;
case 8:
a8:
p = &&a8;
case 9:
a9:
p = &&a9;
case 10:
a10:
p = &&a10;
default:
p = &&a0;
}
goto *p;
}