diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c8d88460c60f6d570adcfab9027c0371e57aabed..706f3e26de94252f4f249253c08bf2b620b12de6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-09-16 Richard Henderson <rth@redhat.com> + + PR middle-end/41360 + * cfgbuild.c (find_bb_boundaries): Re-instate 2009-09-02 barrier fix. + 2009-09-16 Jakub Jelinek <jakub@redhat.com> * integrate.c (set_block_abstract_flags): Call diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c index b5ddadd2ac9402f6012f2566cf238966ae9dc805..5744108b5d4a097785e082de70418b0518836f36 100644 --- a/gcc/cfgbuild.c +++ b/gcc/cfgbuild.c @@ -477,9 +477,17 @@ find_bb_boundaries (basic_block bb) if (code == CODE_LABEL && LABEL_ALT_ENTRY_P (insn)) make_edge (ENTRY_BLOCK_PTR, bb, 0); } - - if (control_flow_insn_p (insn)) + else if (code == BARRIER) + { + /* __builtin_unreachable () may cause a barrier to be emitted in + the middle of a BB. We need to split it in the same manner as + if the barrier were preceded by a control_flow_insn_p insn. */ + if (!flow_transfer_insn) + flow_transfer_insn = prev_nonnote_insn_bb (insn); + } + else if (control_flow_insn_p (insn)) flow_transfer_insn = insn; + if (insn == end) break; insn = NEXT_INSN (insn);