From c64775619ecbb1efef27631100082d1e22230a3e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 5 Feb 2019 17:21:36 +0100 Subject: [PATCH] re PR target/89188 (ICE in pre_and_rev_post_order_compute, at cfganal.c:1055) PR target/89188 * dce.c (delete_unmarked_insns): Don't remove no-op moves if they can throw, non-call exceptions are enabled and we can't delete dead exceptions or alter cfg. Set must_clean if delete_insn_and_edges returns true, don't set it blindly for calls. Assert that delete_unreachable_blocks is called only if can_alter_cfg. * g++.dg/opt/pr89188.C: New test. From-SVN: r268544 --- gcc/ChangeLog | 7 +++++++ gcc/dce.c | 20 +++++++++++--------- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/opt/pr89188.C | 5 +++++ 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr89188.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c3340db..700e3fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2019-02-05 Jakub Jelinek + PR target/89188 + * dce.c (delete_unmarked_insns): Don't remove no-op moves if they + can throw, non-call exceptions are enabled and we can't delete + dead exceptions or alter cfg. Set must_clean if + delete_insn_and_edges returns true, don't set it blindly for calls. + Assert that delete_unreachable_blocks is called only if can_alter_cfg. + PR rtl-optimization/89195 * combine.c (make_extraction): For MEMs, don't extract bytes outside of the original MEM. diff --git a/gcc/dce.c b/gcc/dce.c index 7fd9c37..cb18e815 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -584,7 +584,12 @@ delete_unmarked_insns (void) rtx turn_into_use = NULL_RTX; /* Always delete no-op moves. */ - if (noop_move_p (insn)) + if (noop_move_p (insn) + /* Unless the no-op move can throw and we are not allowed + to alter cfg. */ + && (!cfun->can_throw_non_call_exceptions + || (cfun->can_delete_dead_exceptions && can_alter_cfg) + || insn_nothrow_p (insn))) { if (RTX_FRAME_RELATED_P (insn)) turn_into_use @@ -627,12 +632,6 @@ delete_unmarked_insns (void) for the destination regs in order to avoid dangling notes. */ remove_reg_equal_equiv_notes_for_defs (insn); - /* If a pure or const call is deleted, this may make the cfg - have unreachable blocks. We rememeber this and call - delete_unreachable_blocks at the end. */ - if (CALL_P (insn)) - must_clean = true; - if (turn_into_use) { /* Don't remove frame related noop moves if they cary @@ -645,12 +644,15 @@ delete_unmarked_insns (void) } else /* Now delete the insn. */ - delete_insn_and_edges (insn); + must_clean |= delete_insn_and_edges (insn); } /* Deleted a pure or const call. */ if (must_clean) - delete_unreachable_blocks (); + { + gcc_assert (can_alter_cfg); + delete_unreachable_blocks (); + } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b232907..3388fbe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-02-05 Jakub Jelinek + PR target/89188 + * g++.dg/opt/pr89188.C: New test. + PR rtl-optimization/89195 * gcc.c-torture/execute/pr89195.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr89188.C b/gcc/testsuite/g++.dg/opt/pr89188.C new file mode 100644 index 0000000..80be237 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr89188.C @@ -0,0 +1,5 @@ +// PR target/89188 +// { dg-do compile { target c++11 } } +// { dg-options "-Og -flive-range-shrinkage -fnon-call-exceptions" } + +#include "../torture/pr88861.C" -- 2.7.4