From ea9f867b7b5985b98e9f5c6ff9a2239f3a9e8496 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Sat, 21 Jan 2017 00:23:47 -0700 Subject: [PATCH] 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/ChangeLog | 6 +++++ gcc/cprop.c | 20 ++++++++++++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/torture/pr79125.c | 32 ++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr79125.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 254e73949d6..95c54e5b82e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-01-21 Bernd Schmidt + + rtl-optimization/79125 + * cprop.c (local_cprop_pass): Handle cases where we make an + unconditional trap. + 2017-01-20 Segher Boessenkool PR target/61729 diff --git a/gcc/cprop.c b/gcc/cprop.c index b6c2bc431fd..ae2f19d6f72 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 292731d487d..414eec54c52 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-01-21 Bernd Schmidt + + PR rtl-optimization/79125 + * gcc.dg/torture/pr79125.c: New test. + 2017-01-20 Jiong Wang * testsuite/gcc.target/aarch64/return_address_sign_1.c: Enable on LP64 diff --git a/gcc/testsuite/gcc.dg/torture/pr79125.c b/gcc/testsuite/gcc.dg/torture/pr79125.c new file mode 100644 index 00000000000..b5a39f560a5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr79125.c @@ -0,0 +1,32 @@ +int za; + +void +hl (void) +{ + short int o8 = 0; + short int m6 = 1; + short int *ni = &m6; + + for (;;) + { + int af; + short int *fd = (short int *)∋ + + if (ni != 0) + { + if (m6 != 0) + *ni = 0; + else + za = 0; + af = (o8 * o8) || o8; + if (af == 0) + m6 /= 0; /* { dg-warning "division" } */ + while (za != 0) + { + } + } + *fd = &o8; /* { dg-warning "without a cast" } */ + for (af = 0; af < 2; ++af) + af = za; + } +} -- 2.30.2