aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-12-14 00:33:57 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-12-14 00:33:57 +0100
commitb532a7859f749a302748214a75d565a8f7b90358 (patch)
tree33c7c59992c9696d1428e3caafe762ef59ddb454 /gcc
parent6bb4268527df596e72a964f94873162b595fb483 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cfgcleanup.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr88470.c16
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;
+}