--- /dev/null
+The problem here is that have two basic block forwarders which go to the
+same basic block but destination of two different eh regions. We cannot
+forward both of these basic blocks to that other basic block.
+
+The way I fixed the issue is to make sure that if we removing
+a forwarder block which is coming in from a EH edge, make sure
+that the destination basic block have only one single predecessor.
+Yes this is too strong but there is no simple way to check if a basic
+block is the destination of a different eh region.
+
+--- gcc/gcc/tree-cfgcleanup.c 19 Aug 2005 18:52:55 -0000 2.7
++++ gcc/gcc/tree-cfgcleanup.c 24 Sep 2005 23:30:54 -0000
+@@ -392,7 +392,18 @@ remove_forwarder_block (basic_block bb,
+ return false;
+ }
+ }
+-
++ /* Check to make sure that we can remove a forwarder block for eh edges. */
++ FOR_EACH_EDGE (e, ei, bb->preds)
++ {
++ /* This check is too strong, we should also be checking eh regions
++ but this is much harder. */
++ if (e->flags & EDGE_EH)
++ {
++ if (!single_pred_p (dest))
++ return false;
++ }
++ }
++
+ /* Redirect the edges. */
+ for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
+ {