Blame SOURCES/gcc48-pr63284.patch

d8d6ff
2014-09-17  Jakub Jelinek  <jakub@redhat.com>
d8d6ff
d8d6ff
	PR debug/63284
d8d6ff
	* tree-cfgcleanup.c (fixup_noreturn_call): Don't split block
d8d6ff
	if there are only debug stmts after the noreturn call, instead
d8d6ff
	remove the debug stmts.
d8d6ff
d8d6ff
	* gcc.dg/pr63284.c: New test.
d8d6ff
d8d6ff
--- gcc/tree-cfgcleanup.c	(revision 215332)
d8d6ff
+++ gcc/tree-cfgcleanup.c	(revision 215333)
d8d6ff
@@ -498,7 +498,20 @@ fixup_noreturn_call (gimple stmt)
d8d6ff
 
d8d6ff
   /* First split basic block if stmt is not last.  */
d8d6ff
   if (stmt != gsi_stmt (gsi_last_bb (bb)))
d8d6ff
-    split_block (bb, stmt);
d8d6ff
+    {
d8d6ff
+      if (stmt == gsi_stmt (gsi_last_nondebug_bb (bb)))
d8d6ff
+	{
d8d6ff
+	  /* Don't split if there are only debug stmts
d8d6ff
+	     after stmt, that can result in -fcompare-debug
d8d6ff
+	     failures.  Remove the debug stmts instead,
d8d6ff
+	     they should be all unreachable anyway.  */
d8d6ff
+	  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
d8d6ff
+	  for (gsi_next (&gsi); !gsi_end_p (gsi); )
d8d6ff
+	    gsi_remove (&gsi, true);
d8d6ff
+	}
d8d6ff
+      else
d8d6ff
+	split_block (bb, stmt);
d8d6ff
+    }
d8d6ff
 
d8d6ff
   changed |= remove_fallthru_edge (bb->succs);
d8d6ff
 
d8d6ff
--- gcc/testsuite/gcc.dg/pr63284.c	(revision 0)
d8d6ff
+++ gcc/testsuite/gcc.dg/pr63284.c	(revision 215333)
d8d6ff
@@ -0,0 +1,42 @@
d8d6ff
+/* PR debug/63284 */
d8d6ff
+/* { dg-do compile } */
d8d6ff
+/* { dg-options "-O2 -fcompare-debug" } */
d8d6ff
+
d8d6ff
+int a[10], *b, *d, c, f;
d8d6ff
+int fn2 (void);
d8d6ff
+void fn3 (void);
d8d6ff
+void fn4 (int);
d8d6ff
+
d8d6ff
+static int
d8d6ff
+fn1 (int x)
d8d6ff
+{
d8d6ff
+  int e = a[0];
d8d6ff
+  if (e)
d8d6ff
+    return 1;
d8d6ff
+  if (b)
d8d6ff
+    switch (x)
d8d6ff
+      {
d8d6ff
+      case 1:
d8d6ff
+        if (d)
d8d6ff
+          e = fn2 ();
d8d6ff
+        else
d8d6ff
+          fn3 ();
d8d6ff
+        break;
d8d6ff
+      case 0:
d8d6ff
+        if (d)
d8d6ff
+          {
d8d6ff
+            fn3 ();
d8d6ff
+            if (c)
d8d6ff
+              fn4 (1);
d8d6ff
+          }
d8d6ff
+        else
d8d6ff
+          fn4 (0);
d8d6ff
+      }
d8d6ff
+  return e;
d8d6ff
+}
d8d6ff
+
d8d6ff
+void
d8d6ff
+fn6 (void)
d8d6ff
+{
d8d6ff
+  f = fn1 (0);
d8d6ff
+}