From: Jakub Jelinek Date: Fri, 30 Aug 2019 11:42:17 +0000 (+0200) Subject: backport: re PR target/89188 (ICE in pre_and_rev_post_order_compute, at cfganal.c... X-Git-Tag: releases/gcc-7.5.0~261 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=034762a6652508da2c51a1232ad41f9ce158c9fd;p=thirdparty%2Fgcc.git backport: re PR target/89188 (ICE in pre_and_rev_post_order_compute, at cfganal.c:1055) Backported from mainline 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. * g++.dg/opt/pr89188.C: New test. From-SVN: r275101 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff921609067c..4f5bbd3b542e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,12 @@ Backported from mainline 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. + 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 aaa2fef692bc..afdd6d8b4008 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -574,7 +574,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 @@ -617,12 +622,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 @@ -635,7 +634,7 @@ 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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 063fbdbca951..27a09c534ef8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 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 000000000000..cb0ea7968db3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr89188.C @@ -0,0 +1,13 @@ +// PR target/89188 +// { dg-do compile { target c++11 } } +// { dg-options "-Og -flive-range-shrinkage -fnon-call-exceptions" } + +struct Ax { + int n, a[]; +}; + +int i = 12345678; +int main() { + static Ax s{456, i}; + ((s.a[0]) ? (void)0 : (void)0); +}