aboutsummaryrefslogtreecommitdiff
path: root/gcc/cprop.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.com>2017-01-14 09:52:18 -0700
committerJeff Law <law@gcc.gnu.org>2017-01-14 09:52:18 -0700
commit90aead2189d5af665c4d7616ea39b8aa7c2d98ce (patch)
treeeaeedf40a4f149f49411c00916e82e192d0f2dcd /gcc/cprop.c
parentafaecc23b57e1d6827f071a4d560ca57770b2e25 (diff)
downloadgcc-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.c25
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 ();
}