From: Jakub Jelinek Date: Fri, 30 Aug 2019 11:49:11 +0000 (+0200) Subject: backport: re PR target/88861 (ICE in calc_dfs_tree, at dominance.c:458) X-Git-Tag: releases/gcc-7.5.0~257 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2317cf064a701e416c71ea02e68c35d19c0ca19a;p=thirdparty%2Fgcc.git backport: re PR target/88861 (ICE in calc_dfs_tree, at dominance.c:458) Backported from mainline 2019-01-16 David Malcolm PR target/88861 * combine.c (delete_noop_moves): Convert to "bool" return, returning true if any edges are eliminated. (combine_instructions): Also return true if delete_noop_moves returns true. * g++.dg/opt/pr89188.C: Include ../torture/pr88861.C. 2019-01-16 David Malcolm PR target/88861 * g++.dg/torture/pr88861.C: New test. From-SVN: r275106 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 993796fb04a2..99e38ac01621 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,14 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-01-16 David Malcolm + + PR target/88861 + * combine.c (delete_noop_moves): Convert to "bool" return, + returning true if any edges are eliminated. + (combine_instructions): Also return true if delete_noop_moves + returns true. + 2019-02-08 Jakub Jelinek PR rtl-optimization/89234 diff --git a/gcc/combine.c b/gcc/combine.c index 685b0db62e58..ee4f1e19c45b 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -962,14 +962,17 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3, } -/* Delete any insns that copy a register to itself. */ +/* Delete any insns that copy a register to itself. + Return true if the CFG was changed. */ -static void +static bool delete_noop_moves (void) { rtx_insn *insn, *next; basic_block bb; + bool edges_deleted = false; + FOR_EACH_BB_FN (bb, cfun) { for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next) @@ -980,10 +983,12 @@ delete_noop_moves (void) if (dump_file) fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn)); - delete_insn_and_edges (insn); + edges_deleted |= delete_insn_and_edges (insn); } } } + + return edges_deleted; } @@ -1122,8 +1127,8 @@ insn_a_feeds_b (rtx_insn *a, rtx_insn *b) /* Main entry point for combiner. F is the first insn of the function. NREGS is the first unused pseudo-reg number. - Return nonzero if the combiner has turned an indirect jump - instruction into a direct jump. */ + Return nonzero if the CFG was changed (e.g. if the combiner has + turned an indirect jump instruction into a direct jump). */ static int combine_instructions (rtx_insn *f, unsigned int nregs) { @@ -1501,7 +1506,7 @@ retry: default_rtl_profile (); clear_bb_flags (); new_direct_jump_p |= purge_all_dead_edges (); - delete_noop_moves (); + new_direct_jump_p |= delete_noop_moves (); /* Clean up. */ obstack_free (&insn_link_obstack, NULL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c416a1d4382c..ac912ab819b5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,16 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-02-09 Jakub Jelinek + + PR target/88861 + * g++.dg/opt/pr89188.C: Include ../torture/pr88861.C. + + 2019-01-16 David Malcolm + + PR target/88861 + * g++.dg/torture/pr88861.C: New test. + 2019-02-08 Jakub Jelinek PR rtl-optimization/89234 diff --git a/gcc/testsuite/g++.dg/opt/pr89188.C b/gcc/testsuite/g++.dg/opt/pr89188.C index cb0ea7968db3..80be23763c7f 100644 --- a/gcc/testsuite/g++.dg/opt/pr89188.C +++ b/gcc/testsuite/g++.dg/opt/pr89188.C @@ -2,12 +2,4 @@ // { 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); -} +#include "../torture/pr88861.C" diff --git a/gcc/testsuite/g++.dg/torture/pr88861.C b/gcc/testsuite/g++.dg/torture/pr88861.C new file mode 100644 index 000000000000..d2b6a4b7a470 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr88861.C @@ -0,0 +1,11 @@ +// { dg-options "-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); +}