re PR rtl-optimization/86108 (crash during unwinding with -O2)
authorJakub Jelinek <jakub@redhat.com>
Sat, 16 Jun 2018 06:50:31 +0000 (08:50 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 16 Jun 2018 06:50:31 +0000 (08:50 +0200)
PR rtl-optimization/86108
* bb-reorder.c (create_forwarder_block): Renamed to ...
(create_eh_forwarder_block): ... this.  Split OLD_BB after labels and
jump from new landing pad to the second part.
(sjlj_fix_up_crossing_landing_pad, dw2_fix_up_crossing_landing_pad):
Adjust callers.

From-SVN: r261678

gcc/ChangeLog
gcc/bb-reorder.c

index d3f322de367e1fdfd03d4d313a799e2b4e1f6219..7fa9a28b7a8e37da601c902ec82ecc387982bf1f 100644 (file)
@@ -1,3 +1,12 @@
+2018-06-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/86108
+       * bb-reorder.c (create_forwarder_block): Renamed to ...
+       (create_eh_forwarder_block): ... this.  Split OLD_BB after labels and
+       jump from new landing pad to the second part.
+       (sjlj_fix_up_crossing_landing_pad, dw2_fix_up_crossing_landing_pad):
+       Adjust callers.
+
 2018-06-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/85878
index d1019d01d0991831c5c407f6e0d84405d8f77802..57edde62c62f35d3721a96f834ae6b26cae0cbc3 100644 (file)
@@ -1413,8 +1413,12 @@ get_uncond_jump_length (void)
    other partition wrt OLD_BB.  */
 
 static basic_block
-create_forwarder_block (rtx_code_label *new_label, basic_block old_bb)
+create_eh_forwarder_block (rtx_code_label *new_label, basic_block old_bb)
 {
+  /* Split OLD_BB, so that EH pads have always only incoming EH edges,
+     bb_has_eh_pred bbs are treated specially by DF infrastructure.  */
+  old_bb = split_block_after_labels (old_bb)->dest;
+
   /* Put the new label and a jump in the new basic block.  */
   rtx_insn *label = emit_label (new_label);
   rtx_code_label *old_label = block_label (old_bb);
@@ -1456,7 +1460,7 @@ sjlj_fix_up_crossing_landing_pad (basic_block old_bb)
   LABEL_PRESERVE_P (new_label) = 1;
 
   /* Create the forwarder block.  */
-  basic_block new_bb = create_forwarder_block (new_label, old_bb);
+  basic_block new_bb = create_eh_forwarder_block (new_label, old_bb);
 
   /* Create the map from old to new lp index and initialize it.  */
   unsigned *index_map = (unsigned *) alloca (lp_len * sizeof (unsigned));
@@ -1508,7 +1512,7 @@ dw2_fix_up_crossing_landing_pad (eh_landing_pad old_lp, basic_block old_bb)
   LABEL_PRESERVE_P (new_lp->landing_pad) = 1;
 
   /* Create the forwarder block.  */
-  basic_block new_bb = create_forwarder_block (new_lp->landing_pad, old_bb);
+  basic_block new_bb = create_eh_forwarder_block (new_lp->landing_pad, old_bb);
 
   /* Fix up the edges.  */
   for (ei = ei_start (old_bb->preds); (e = ei_safe_edge (ei)) != NULL; )