From: Jakub Jelinek Date: Fri, 30 Aug 2019 11:21:45 +0000 (+0200) Subject: backport: re PR rtl-optimization/88470 (ICE in maybe_record_trace_start, at dwarf2cfi... X-Git-Tag: releases/gcc-7.5.0~281 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ff105fdae2dabbdb17dbb4a19119fb89ced9a10;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/88470 (ICE in maybe_record_trace_start, at dwarf2cfi.c:2354) Backported from mainline 2018-12-13 Jakub Jelinek PR rtl-optimization/88470 * cfgcleanup.c (outgoing_edges_match): If the function is shrink-wrapped and bb1 ends with a JUMP_INSN with a single fake edge to EXIT, return false. * gcc.target/i386/pr88470.c: New test. From-SVN: r275080 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ef7ec9bba374..230038a4eb19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,11 @@ Backported from mainline 2018-12-13 Jakub Jelinek + PR rtl-optimization/88470 + * cfgcleanup.c (outgoing_edges_match): If the function is + shrink-wrapped and bb1 ends with a JUMP_INSN with a single fake + edge to EXIT, return false. + PR rtl-optimization/88416 * valtrack.c (cleanup_auto_inc_dec): Handle pre/post-inc/dec/modify even if !AUTO_INC_DEC. diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index f68a964e31e9..9f1b8432ea6d 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -1620,10 +1620,13 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2) if (crtl->shrink_wrapped && single_succ_p (bb1) && single_succ (bb1) == EXIT_BLOCK_PTR_FOR_FN (cfun) - && !JUMP_P (BB_END (bb1)) + && (!JUMP_P (BB_END (bb1)) + /* Punt if the only successor is a fake edge to exit, the jump + must be some weird one. */ + || (single_succ_edge (bb1)->flags & EDGE_FAKE) != 0) && !(CALL_P (BB_END (bb1)) && SIBLING_CALL_P (BB_END (bb1)))) return false; - + /* If BB1 has only one successor, we may be looking at either an unconditional jump, or a fake edge to exit. */ if (single_succ_p (bb1) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5e9a10d5d50c..2dd25cb7c6ff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2018-12-13 Jakub Jelinek + PR rtl-optimization/88470 + * gcc.target/i386/pr88470.c: New test. + PR rtl-optimization/88416 * gcc.target/i386/pr88416.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr88470.c b/gcc/testsuite/gcc.target/i386/pr88470.c new file mode 100644 index 000000000000..8d4400da87d1 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr88470.c @@ -0,0 +1,16 @@ +/* PR rtl-optimization/88470 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -maccumulate-outgoing-args -ftrapv -fno-ivopts -fno-reorder-blocks-and-partition" } */ + +void +foo (long x, long *y) +{ + long *a = y - 64, i; + for (i = 0; i < x; i++) + { + long v = y[i]; + *a++ = v; + } + register void **c __asm__ ("di"); + goto **c; +}