From fe792dd82ff149208e9c7df2fab241aeda78afe3 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 2 Mar 2017 17:02:37 +0100 Subject: [PATCH] re PR rtl-optimization/79780 (ICE in rtl_verify_bb_insns, at cfgrtl.c:2661 (error: flow control insn inside a basic block)) PR rtl-optimization/79780 * cprop.c (one_cprop_pass): When second and further conditional trap in a single basic block is turned into an unconditional trap, turn it into a deleted note to avoid RTL verification failures. * gcc.c-torture/compile/pr79780.c: New test. From-SVN: r245843 --- gcc/ChangeLog | 7 +++ gcc/cprop.c | 16 +++++-- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.c-torture/compile/pr79780.c | 48 +++++++++++++++++++ 4 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr79780.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d5e438c883f..4663d438a91 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-03-02 Jakub Jelinek + + PR rtl-optimization/79780 + * cprop.c (one_cprop_pass): When second and further conditional trap + in a single basic block is turned into an unconditional trap, turn it + into a deleted note to avoid RTL verification failures. + 2017-03-02 Richard Biener * fold-const.c (const_binop): Use ulow () instead of elt (0). diff --git a/gcc/cprop.c b/gcc/cprop.c index 7d20c4434b6..4814b5e97c0 100644 --- a/gcc/cprop.c +++ b/gcc/cprop.c @@ -1852,12 +1852,22 @@ one_cprop_pass (void) if (! NOTE_P (insn) && ! insn->deleted ()) mark_oprs_set (insn); - if (!was_uncond_trap && !seen_uncond_trap + if (!was_uncond_trap && GET_CODE (PATTERN (insn)) == TRAP_IF && XEXP (PATTERN (insn), 0) == const1_rtx) { - seen_uncond_trap = true; - uncond_traps.safe_push (insn); + /* If we have already seen an unconditional trap + earlier, the rest of the bb is going to be removed + as unreachable. Just turn it into a note, so that + RTL verification doesn't complain about it before + it is finally removed. */ + if (seen_uncond_trap) + set_insn_deleted (insn); + else + { + seen_uncond_trap = true; + uncond_traps.safe_push (insn); + } } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bb5d68f0477..3eca2ab2194 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-02 Jakub Jelinek + + PR rtl-optimization/79780 + * gcc.c-torture/compile/pr79780.c: New test. + 2017-03-02 Richard Biener PR tree-optimization/79345 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr79780.c b/gcc/testsuite/gcc.c-torture/compile/pr79780.c new file mode 100644 index 00000000000..c50708d9ada --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr79780.c @@ -0,0 +1,48 @@ +/* PR rtl-optimization/79780 */ + +int t3, iy, f4, oi, gn; + +void +foo (long long int mh) +{ + int pi = 0; + + if (iy != 0) + for (;;) + f4 = 0; + + if (t3 != 0) + { + while (mh != 0LL) + { + while (mh < 1LL) + ++mh; + ++mh; + } + for (;;) + ; + for (oi = 0; oi < 1; ++oi) + { + n3:; + } + gn = iy = 1; + } + + f4 = 0; + + if (pi - (mh != 0LL) == 0) + if (mh != 1LL) + { + oi = t3 = 0; + if (mh == 0LL) + ++pi; + } + + if (iy != 0 && pi != 0) + { + t3 = 0; + goto n3; + } + + t3 /= 0; +} -- 2.30.2