diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-03-02 17:02:37 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-03-02 17:02:37 +0100 |
commit | fe792dd82ff149208e9c7df2fab241aeda78afe3 (patch) | |
tree | 036c24db59cfd5f9166e68ab892452c1abf3df5d | |
parent | 35a4e4ed81d9aae4bbd29cf24e389269d08f1fc2 (diff) | |
download | gcc-fe792dd82ff149208e9c7df2fab241aeda78afe3.zip gcc-fe792dd82ff149208e9c7df2fab241aeda78afe3.tar.gz gcc-fe792dd82ff149208e9c7df2fab241aeda78afe3.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cprop.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr79780.c | 48 |
4 files changed, 73 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d5e438c..4663d43 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-03-02 Jakub Jelinek <jakub@redhat.com> + + 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 <rguenther@suse.de> * fold-const.c (const_binop): Use ulow () instead of elt (0). diff --git a/gcc/cprop.c b/gcc/cprop.c index 7d20c44..4814b5e 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 bb5d68f..3eca2ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-02 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/79780 + * gcc.c-torture/compile/pr79780.c: New test. + 2017-03-02 Richard Biener <rguenther@suse.de> 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 0000000..c50708d --- /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; +} |