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);