re PR debug/84875 (ICE in maybe_record_trace_start, at dwarf2cfi.c:2348 on s390x)
authorJakub Jelinek <jakub@redhat.com>
Tue, 20 Mar 2018 21:07:13 +0000 (22:07 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 20 Mar 2018 21:07:13 +0000 (22:07 +0100)
PR debug/84875
* dce.c (delete_unmarked_insns): Don't remove frame related noop moves
holding REG_CFA_RESTORE notes, instead turn them into a USE.

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

From-SVN: r258692

gcc/ChangeLog
gcc/dce.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr84875.c [new file with mode: 0644]

index 1684757ba370234bfc42e83c5a94e811546c2aa3..f604631205c9330a973a91fc47e091610e0b4e5d 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/84875
+       * dce.c (delete_unmarked_insns): Don't remove frame related noop moves
+       holding REG_CFA_RESTORE notes, instead turn them into a USE.
+
 2018-03-20  Peter Bergner  <bergner@vnet.ibm.com>
 
        PR target/83789
index e00d029db651dc719f9989855c513ec2ac5c8130..e4d442c62b59c2dc74b0dbd99ac474607e714316 100644 (file)
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -569,9 +569,19 @@ delete_unmarked_insns (void)
     FOR_BB_INSNS_REVERSE_SAFE (bb, insn, next)
       if (NONDEBUG_INSN_P (insn))
        {
+         rtx turn_into_use = NULL_RTX;
+
          /* Always delete no-op moves.  */
          if (noop_move_p (insn))
-           ;
+           {
+             if (RTX_FRAME_RELATED_P (insn))
+               turn_into_use
+                 = find_reg_note (insn, REG_CFA_RESTORE, NULL);
+             if (turn_into_use && REG_P (XEXP (turn_into_use, 0)))
+               turn_into_use = XEXP (turn_into_use, 0);
+             else
+               turn_into_use = NULL_RTX;
+           }
 
          /* Otherwise rely only on the DCE algorithm.  */
          else if (marked_insn_p (insn))
@@ -611,8 +621,19 @@ delete_unmarked_insns (void)
          if (CALL_P (insn))
            must_clean = true;
 
-         /* Now delete the insn.  */
-         delete_insn_and_edges (insn);
+         if (turn_into_use)
+           {
+             /* Don't remove frame related noop moves if they cary
+                REG_CFA_RESTORE note, while we don't need to emit any code,
+                we need it to emit the CFI restore note.  */
+             PATTERN (insn)
+               = gen_rtx_USE (GET_MODE (turn_into_use), turn_into_use);
+             INSN_CODE (insn) = -1;
+             df_insn_rescan (insn);
+           }
+         else
+           /* Now delete the insn.  */
+           delete_insn_and_edges (insn);
        }
 
   /* Deleted a pure or const call.  */
index edef059e7ef2e434817e616d8bc88cf11c102189..79cc52cb3e71f1af94a87a535cb8a7f070e93cc6 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/84875
+       * gcc.dg/pr84875.c: New test.
+
 2018-03-20  Marek Polacek  <polacek@redhat.com>
 
        PR c++/84978, ICE with NRVO.
diff --git a/gcc/testsuite/gcc.dg/pr84875.c b/gcc/testsuite/gcc.dg/pr84875.c
new file mode 100644 (file)
index 0000000..257176d
--- /dev/null
@@ -0,0 +1,28 @@
+/* PR debug/84875 */
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-additional-options "-fpie" { target pie } } */
+/* { dg-additional-options "-march=z196" { target s390*-*-* } } */
+
+static long *a[100];
+static int b[100];
+long *c;
+int d;
+void foo (long *);
+
+void
+bar ()
+{
+  long *g = c;
+  g--;
+  d = *g;
+  if (d)
+    if (b[d] < 8)
+      {
+       *(void **)g = a[d];
+       a[d] = g;
+       b[d]++;
+       return;
+      }
+  foo (g);
+}