On Fri, Jun 15, 2018 at 10:21:26PM +0200, Eric Botcazou wrote: > > Eric, I wonder if sjlj doesn't need a similar fix to the PR86108 patch. > > If it does, I think with the following patch it would trigger a checking > > failure. Not familiar with sjlj EH enough to try it myself. > > Yes, it does, so please move the fix to create_forwarder_block instead, after > renaming it into e.g. create_eh_forwarder_block. You don't need to update > old_bb in {dw2,sjlj}_fix_up_crossing_landing_pad.
So like this (if it passes another bootstrap/regtest together with the cfgrtl.c change)? It fixes the testcase too. 2018-06-15 Jakub Jelinek <ja...@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. --- gcc/bb-reorder.c.jj 2018-05-31 21:49:04.000000000 +0200 +++ gcc/bb-reorder.c 2018-06-15 22:47:27.750266777 +0200 @@ -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_ 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_land 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; ) Jakub