From ea9f867b7b5985b98e9f5c6ff9a2239f3a9e8496 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Sat, 21 Jan 2017 00:23:47 -0700 Subject: re PR rtl-optimization/79125 (ICE in rtl_verify_bb_insns, at cfgrtl.c:2661 (error: flow control insn inside a basic block)) 2017-01-21 Bernd Schmidt rtl-optimization/79125 * cprop.c (local_cprop_pass): Handle cases where we make an unconditional trap. PR rtl-optimization/79125 * gcc.dg/torture/pr79125.c: New test. From-SVN: r244741 --- gcc/cprop.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'gcc/cprop.c') diff --git a/gcc/cprop.c b/gcc/cprop.c index b6c2bc4..ae2f19d 100644 --- a/gcc/cprop.c +++ b/gcc/cprop.c @@ -1248,6 +1248,8 @@ local_cprop_pass (void) bool changed = false; unsigned i; + auto_vec uncond_traps; + cselib_init (0); FOR_EACH_BB_FN (bb, cfun) { @@ -1255,6 +1257,9 @@ local_cprop_pass (void) { if (INSN_P (insn)) { + bool was_uncond_trap + = (GET_CODE (PATTERN (insn)) == TRAP_IF + && XEXP (PATTERN (insn), 0) == const1_rtx); rtx note = find_reg_equal_equiv_note (insn); do { @@ -1273,6 +1278,13 @@ local_cprop_pass (void) break; } } + if (!was_uncond_trap + && GET_CODE (PATTERN (insn)) == TRAP_IF + && XEXP (PATTERN (insn), 0) == const1_rtx) + { + uncond_traps.safe_push (insn); + break; + } if (insn->deleted ()) break; } @@ -1287,6 +1299,14 @@ local_cprop_pass (void) cselib_finish (); + 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); + } + return changed; } -- cgit v1.1