re PR bootstrap/83396 (Bootstrap failures with Statement Frontiers)
authorAlexandre Oliva <aoliva@redhat.com>
Wed, 13 Dec 2017 18:46:43 +0000 (18:46 +0000)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 13 Dec 2017 18:46:43 +0000 (19:46 +0100)
PR bootstrap/83396
PR debug/83391
* tree-cfgcleanup.c (remove_forwarder_block): Keep after
labels debug stmts that can only appear after labels.

* gcc.dg/torture/pr83396.c: New test.
* g++.dg/torture/pr83391.C: New test.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r255609

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr83391.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr83396.c [new file with mode: 0644]
gcc/tree-cfgcleanup.c

index d32bd1b5c4377e4c215737a1cfa798879425978f..a72b4bcfef8d044e62bcd54dcb66cc446e667b52 100644 (file)
@@ -1,3 +1,11 @@
+2017-12-13  Alexandre Oliva <aoliva@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR bootstrap/83396
+       PR debug/83391
+       * tree-cfgcleanup.c (remove_forwarder_block): Keep after
+       labels debug stmts that can only appear after labels.
+
 2017-12-13  Alexander Monakov  <amonakov@ispras.ru>
 
        PR rtl-optimization/82398
index c5f1d44d2e938e63496e49f37a17d339ee290e97..4af0d0c4d69868e6f667425ca1d58a9f2257c9b8 100644 (file)
@@ -1,3 +1,11 @@
+2017-12-13  Alexandre Oliva <aoliva@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR bootstrap/83396
+       PR debug/83391
+       * gcc.dg/torture/pr83396.c: New test.
+       * g++.dg/torture/pr83391.C: New test.
+
 2017-12-13  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR rtl-optimization/83393
diff --git a/gcc/testsuite/g++.dg/torture/pr83391.C b/gcc/testsuite/g++.dg/torture/pr83391.C
new file mode 100644 (file)
index 0000000..902d7fb
--- /dev/null
@@ -0,0 +1,36 @@
+// PR debug/83391
+// { dg-do compile }
+// { dg-options "-g" }
+// { dg-additional-options "-mbranch-cost=1" { target { i?86-*-* x86_64-*-* mips*-*-* s390*-*-* avr*-*-* } } }
+
+unsigned char a;
+enum E { F, G, H } b;
+int c, d;
+
+void
+foo ()
+{
+  int e;
+  bool f;
+  E g = b;
+  while (1)
+    {
+      unsigned char h = a ? d : 0;
+      switch (g)
+       {
+       case 0:
+         f = h <= 'Z' || h >= 'a' && h <= 'z';
+         break;
+       case 1:
+         {
+           unsigned char i = h;
+           e = 0;
+         }
+         if (e || h)
+           g = H;
+         /* FALLTHRU */
+       default:
+         c = 0;
+       }
+    }
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr83396.c b/gcc/testsuite/gcc.dg/torture/pr83396.c
new file mode 100644 (file)
index 0000000..24c1d5d
--- /dev/null
@@ -0,0 +1,38 @@
+/* PR bootstrap/83396 */
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+int fn1 (void);
+void fn2 (void *, const char *);
+void fn3 (void);
+
+void
+fn4 (long long x)
+{
+  fn3 ();
+}
+
+void
+fn5 (long long x)
+{
+  if (x)
+    fn3();
+}
+
+void
+fn6 (long long x)
+{
+  switch (fn1 ())
+    {
+    case 0:
+      fn5 (x);
+    case 2:
+      fn2 (0, "");
+      break;
+    case 1:
+    case 3:
+      fn4(x);
+    case 5:
+      fn2 (0, "");
+    }
+}
index 0bee21756f2b4ba93fa1d3caaceae547d73b8379..a0e5797ec0ecb8b413b8aad19ffc4149e87676a4 100644 (file)
@@ -536,9 +536,14 @@ remove_forwarder_block (basic_block bb)
      defined labels and labels with an EH landing pad number to the
      new block, so that the redirection of the abnormal edges works,
      jump targets end up in a sane place and debug information for
-     labels is retained.  */
+     labels is retained.
+
+     While at that, move any debug stmts that appear before or in between
+     labels, but not those that can only appear after labels.  */
   gsi_to = gsi_start_bb (dest);
-  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
+  gsi = gsi_start_bb (bb);
+  gimple_stmt_iterator gsie = gsi_after_labels (bb);
+  while (gsi_stmt (gsi) != gsi_stmt (gsie))
     {
       tree decl;
       label = gsi_stmt (gsi);
@@ -557,6 +562,21 @@ remove_forwarder_block (basic_block bb)
        gsi_next (&gsi);
     }
 
+  /* Move debug statements if the destination has a single predecessor.  */
+  if (can_move_debug_stmts && !gsi_end_p (gsi))
+    {
+      gcc_assert (gsi_stmt (gsi) == gsi_stmt (gsie));
+      gimple_stmt_iterator gsie_to = gsi_after_labels (dest);
+      do
+       {
+         gimple *debug = gsi_stmt (gsi);
+         gcc_assert (is_gimple_debug (debug));
+         gsi_remove (&gsi, false);
+         gsi_insert_before (&gsie_to, debug, GSI_SAME_STMT);
+       }
+      while (!gsi_end_p (gsi));
+    }
+
   bitmap_set_bit (cfgcleanup_altered_bbs, dest->index);
 
   /* Update the dominators.  */