From c83ee180191ab19daabee8edefa3e8cf4d00b67f Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Wed, 17 Sep 2014 21:05:49 +0200
Subject: [PATCH] re PR debug/63284 (-fcompare-debug issue due to redirection
 to __builtin_unreachable ())

	PR debug/63284
	* tree-cfgcleanup.c (fixup_noreturn_call): Don't split block
	if there are only debug stmts after the noreturn call, instead
	remove the debug stmts.

	* gcc.dg/pr63284.c: New test.

From-SVN: r215331
---
 gcc/ChangeLog                  |  7 ++++++
 gcc/testsuite/ChangeLog        |  3 +++
 gcc/testsuite/gcc.dg/pr63284.c | 42 ++++++++++++++++++++++++++++++++++
 gcc/tree-cfgcleanup.c          | 15 +++++++++++-
 4 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr63284.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index baed7a31ca9a..8445235e99c5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-09-17  Jakub Jelinek  <jakub@redhat.com>
+
+	PR debug/63284
+	* tree-cfgcleanup.c (fixup_noreturn_call): Don't split block
+	if there are only debug stmts after the noreturn call, instead
+	remove the debug stmts.
+
 2014-09-17  Jan Hubicka  <hubicka@ucw.cz>
 
 	* ipa-devirt.c (type_pair, default_hashset_traits): New types.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 36e6faaef37c..0362744727bd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2014-09-17  Jakub Jelinek  <jakub@redhat.com>
 
+	PR debug/63284
+	* gcc.dg/pr63284.c: New test.
+
 	* ada/acats/run_all.sh: Redirect mkdir stderr to /dev/null.
 
 2014-09-17  Paolo Carlini  <paolo.carlini@oracle.com>
diff --git a/gcc/testsuite/gcc.dg/pr63284.c b/gcc/testsuite/gcc.dg/pr63284.c
new file mode 100644
index 000000000000..dc7fc28b87e7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr63284.c
@@ -0,0 +1,42 @@
+/* PR debug/63284 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fcompare-debug" } */
+
+int a[10], *b, *d, c, f;
+int fn2 (void);
+void fn3 (void);
+void fn4 (int);
+
+static int
+fn1 (int x)
+{
+  int e = a[0];
+  if (e)
+    return 1;
+  if (b)
+    switch (x)
+      {
+      case 1:
+        if (d)
+          e = fn2 ();
+        else
+          fn3 ();
+        break;
+      case 0:
+        if (d)
+          {
+            fn3 ();
+            if (c)
+              fn4 (1);
+          }
+        else
+          fn4 (0);
+      }
+  return e;
+}
+
+void
+fn6 (void)
+{
+  f = fn1 (0);
+}
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index a66ec6e75375..451630f1563c 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -565,7 +565,20 @@ fixup_noreturn_call (gimple stmt)
 
   /* First split basic block if stmt is not last.  */
   if (stmt != gsi_stmt (gsi_last_bb (bb)))
-    split_block (bb, stmt);
+    {
+      if (stmt == gsi_stmt (gsi_last_nondebug_bb (bb)))
+	{
+	  /* Don't split if there are only debug stmts
+	     after stmt, that can result in -fcompare-debug
+	     failures.  Remove the debug stmts instead,
+	     they should be all unreachable anyway.  */
+	  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
+	  for (gsi_next (&gsi); !gsi_end_p (gsi); )
+	    gsi_remove (&gsi, true);
+	}
+      else
+	split_block (bb, stmt);
+    }
 
   changed |= remove_fallthru_edge (bb->succs);
 
-- 
GitLab