diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-02-08 13:29:43 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-02-08 13:29:43 +0100 |
commit | bd73623c908777daae42b70ee841e9c84fa7b9b4 (patch) | |
tree | 5ca56f43bdc225ff98634e12043472c4de2e1b7e /gcc | |
parent | 7b50c4a3fab8576892a1358bfa08a99e7d510201 (diff) | |
download | gcc-bd73623c908777daae42b70ee841e9c84fa7b9b4.zip gcc-bd73623c908777daae42b70ee841e9c84fa7b9b4.tar.gz gcc-bd73623c908777daae42b70ee841e9c84fa7b9b4.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cfgrtl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr52139.c | 49 |
4 files changed, 66 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ea5882..5398c68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index bcc410a..8283da0 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 482b489..366103e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.dg/pr52139.c b/gcc/testsuite/gcc.dg/pr52139.c new file mode 100644 index 0000000..bd654a2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr52139.c @@ -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; +} |