diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-12-14 00:33:57 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-12-14 00:33:57 +0100 |
commit | b532a7859f749a302748214a75d565a8f7b90358 (patch) | |
tree | 33c7c59992c9696d1428e3caafe762ef59ddb454 /gcc | |
parent | 6bb4268527df596e72a964f94873162b595fb483 (diff) | |
download | gcc-b532a7859f749a302748214a75d565a8f7b90358.zip gcc-b532a7859f749a302748214a75d565a8f7b90358.tar.gz gcc-b532a7859f749a302748214a75d565a8f7b90358.tar.bz2 |
re PR rtl-optimization/88470 (ICE in maybe_record_trace_start, at dwarf2cfi.c:2354)
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: r267112
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr88470.c | 16 |
4 files changed, 33 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 98c6fc0..3f1eeb7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-12-13 Jakub Jelinek <jakub@redhat.com> + + 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. + 2018-12-13 Martin Sebor <msebor@redhat.com> * doc/extend.texi: Consistently use @code for const and volatile diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index bc4a788..1b5e931 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -1592,10 +1592,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 2fe17d2..b0dae2b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-12-13 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/88470 + * gcc.target/i386/pr88470.c: New test. + 2018-12-13 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/88414 diff --git a/gcc/testsuite/gcc.target/i386/pr88470.c b/gcc/testsuite/gcc.target/i386/pr88470.c new file mode 100644 index 0000000..8d4400d --- /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; +} |