diff options
author | Bernd Schmidt <bernds@redhat.com> | 2017-01-14 09:52:18 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2017-01-14 09:52:18 -0700 |
commit | 90aead2189d5af665c4d7616ea39b8aa7c2d98ce (patch) | |
tree | eaeedf40a4f149f49411c00916e82e192d0f2dcd /gcc/cprop.c | |
parent | afaecc23b57e1d6827f071a4d560ca57770b2e25 (diff) | |
download | gcc-90aead2189d5af665c4d7616ea39b8aa7c2d98ce.zip gcc-90aead2189d5af665c4d7616ea39b8aa7c2d98ce.tar.gz gcc-90aead2189d5af665c4d7616ea39b8aa7c2d98ce.tar.bz2 |
re PR rtl-optimization/78626 (ICE in rtl_verify_bb_insns, at cfgrtl.c:2656 (error: flow control insn inside a basic block))
PR rtl-optimization/78626
PR rtl-optimization/78727
* cprop.c (one_cprop_pass): Collect unconditional traps in the middle
of a block, and split such blocks after everything else is finished.
PR rtl-optimization/78626
PR rtl-optimization/78727
* gcc.dg/torture/pr78626.c: New test.
* gcc.dg/torture/pr78727.c: New test.
From-SVN: r244467
Diffstat (limited to 'gcc/cprop.c')
-rw-r--r-- | gcc/cprop.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/gcc/cprop.c b/gcc/cprop.c index b210e94..b6c2bc4 100644 --- a/gcc/cprop.c +++ b/gcc/cprop.c @@ -1794,7 +1794,7 @@ one_cprop_pass (void) if (set_hash_table.n_elems > 0) { basic_block bb; - rtx_insn *insn; + auto_vec<rtx_insn *> uncond_traps; alloc_cprop_mem (last_basic_block_for_fn (cfun), set_hash_table.n_elems); @@ -1810,6 +1810,9 @@ one_cprop_pass (void) EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb) { + bool seen_uncond_trap = false; + rtx_insn *insn; + /* Reset tables used to keep track of what's still valid [since the start of the block]. */ reset_opr_set_tables (); @@ -1817,6 +1820,10 @@ one_cprop_pass (void) FOR_BB_INSNS (bb, insn) if (INSN_P (insn)) { + bool was_uncond_trap + = (GET_CODE (PATTERN (insn)) == TRAP_IF + && XEXP (PATTERN (insn), 0) == const1_rtx); + changed |= cprop_insn (insn); /* Keep track of everything modified by this insn. */ @@ -1825,11 +1832,27 @@ one_cprop_pass (void) insn into a NOTE, or deleted the insn. */ if (! NOTE_P (insn) && ! insn->deleted ()) mark_oprs_set (insn); + + if (!was_uncond_trap && !seen_uncond_trap + && GET_CODE (PATTERN (insn)) == TRAP_IF + && XEXP (PATTERN (insn), 0) == const1_rtx) + { + seen_uncond_trap = true; + uncond_traps.safe_push (insn); + } } } changed |= bypass_conditional_jumps (); + while (!uncond_traps.is_empty ()) + { + rtx_insn *insn = uncond_traps.pop (); + basic_block to_split = BLOCK_FOR_INSN (insn); + remove_edge (split_block (to_split, insn)); + emit_barrier_after_bb (to_split); + } + FREE_REG_SET (reg_set_bitmap); free_cprop_mem (); } |