diff options
author | Bernd Schmidt <bernds@redhat.com> | 2017-01-21 00:23:47 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2017-01-21 00:23:47 -0700 |
commit | ea9f867b7b5985b98e9f5c6ff9a2239f3a9e8496 (patch) | |
tree | 6c8e1db98a6dfd5fa2edebb68dae510fd895a9e5 /gcc/cprop.c | |
parent | 80b40b87845bf2293f2bfdd215bbf758db5ceff4 (diff) | |
download | gcc-ea9f867b7b5985b98e9f5c6ff9a2239f3a9e8496.zip gcc-ea9f867b7b5985b98e9f5c6ff9a2239f3a9e8496.tar.gz gcc-ea9f867b7b5985b98e9f5c6ff9a2239f3a9e8496.tar.bz2 |
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 <bschmidt@redhat.com>
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
Diffstat (limited to 'gcc/cprop.c')
-rw-r--r-- | gcc/cprop.c | 20 |
1 files changed, 20 insertions, 0 deletions
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<rtx_insn *> 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; } |