diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-04-12 09:27:25 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-04-12 09:27:25 +0200 |
commit | c758576accc3eef33c31766352453b0ad1953569 (patch) | |
tree | 09b36de5d1d2ef17d03c90b6b08477d3813c0852 /gcc | |
parent | df63d1b7f755a38d3f762899c91d48f893091088 (diff) | |
download | gcc-c758576accc3eef33c31766352453b0ad1953569.zip gcc-c758576accc3eef33c31766352453b0ad1953569.tar.gz gcc-c758576accc3eef33c31766352453b0ad1953569.tar.bz2 |
re PR rtl-optimization/90026 (ICE: verify_flow_info failed (error: missing barrier after block 2))
PR rtl-optimization/90026
* cfgcleanup.c (try_optimize_cfg): When removing empty bb with no
successors, look for BARRIERs inside of the whole BB_FOOTER chain
rather than just at the start of it. If e->src BB_FOOTER is not NULL
in cfglayout mode, use emit_barrier_after_bb.
* g++.dg/opt/pr90026.C: New test.
From-SVN: r270304
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr90026.C | 24 |
4 files changed, 47 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 970bdf8..a5dda2b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2019-04-12 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/90026 + * cfgcleanup.c (try_optimize_cfg): When removing empty bb with no + successors, look for BARRIERs inside of the whole BB_FOOTER chain + rather than just at the start of it. If e->src BB_FOOTER is not NULL + in cfglayout mode, use emit_barrier_after_bb. + 2018-04-11 Steve Ellcey <sellcey@marvell.com> PR rtl-optimization/87763 diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 86b2627..992912c 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -2712,23 +2712,23 @@ try_optimize_cfg (int mode) if (current_ir_type () == IR_RTL_CFGLAYOUT) { - if (BB_FOOTER (b) - && BARRIER_P (BB_FOOTER (b))) + rtx_insn *insn; + for (insn = BB_FOOTER (b); + insn; insn = NEXT_INSN (insn)) + if (BARRIER_P (insn)) + break; + if (insn) FOR_EACH_EDGE (e, ei, b->preds) - if ((e->flags & EDGE_FALLTHRU) - && BB_FOOTER (e->src) == NULL) + if ((e->flags & EDGE_FALLTHRU)) { - if (BB_FOOTER (b)) + if (BB_FOOTER (b) + && BB_FOOTER (e->src) == NULL) { BB_FOOTER (e->src) = BB_FOOTER (b); BB_FOOTER (b) = NULL; } else - { - start_sequence (); - BB_FOOTER (e->src) = emit_barrier (); - end_sequence (); - } + emit_barrier_after_bb (e->src); } } else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 840df42..d66bc36 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-12 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/90026 + * g++.dg/opt/pr90026.C: New test. + 2018-04-11 Steve Ellcey <sellcey@marvell.com> PR rtl-optimization/87763 diff --git a/gcc/testsuite/g++.dg/opt/pr90026.C b/gcc/testsuite/g++.dg/opt/pr90026.C new file mode 100644 index 0000000..3971ef0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr90026.C @@ -0,0 +1,24 @@ +// PR rtl-optimization/90026 +// { dg-do compile } +// { dg-options "-fnon-call-exceptions -ftracer -O2 -w" } + +typedef __SIZE_TYPE__ size_t; +struct S { int *b; ~S () { delete b; } }; +void bar (); +char c[sizeof (int)]; + +void * +operator new (size_t, void *) +{ + __builtin_unreachable (); +} + +void +foo () +{ + S a; + if (a.b) + a.b = new int (); + bar (); + new (c) int (); +} |