re PR rtl-optimization/68691 (ICE at -O3 with -g enabled on x86_64-linux-gnu in alter...
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 10 Dec 2015 18:00:47 +0000 (18:00 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 10 Dec 2015 18:00:47 +0000 (18:00 +0000)
2015-12-10  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/68691
* lra-spills.c (lra_final_code_change): Check pseudo occurrence
number in non-debug insns and remove debug insns if necessary.

2015-12-10  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/68691
* gcc.target/i386/pr68691.c: New.

From-SVN: r231538

gcc/ChangeLog
gcc/lra-spills.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr68691.c [new file with mode: 0644]

index 2eb367a9a153eb4b26f1d89a191f00fce342a44e..c8522ddc2a86c331e22f2d032c8e7698960b85f9 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/68691
+       * lra-spills.c (lra_final_code_change): Check pseudo occurrence
+       number in non-debug insns and remove debug insns if necessary.
+
 2015-12-10  Martin Sebor  <msebor@redhat.com>
 
        * invoke.texi (Warning Options): Update -Wall options.  Clarify
index e469a84ba5b00331ef2d181620c86cc9569a354e..6dacb799e4be5ca8c57045db829a60934f394922 100644 (file)
@@ -708,6 +708,30 @@ lra_final_code_change (void)
            }
        
          lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
+         struct lra_insn_reg *reg;
+
+         for (reg = id->regs; reg != NULL; reg = reg->next)
+           if (reg->regno >= FIRST_PSEUDO_REGISTER
+               && lra_reg_info [reg->regno].nrefs == 0)
+             break;
+         
+         if (reg != NULL)
+           {
+             /* Pseudos still can be in debug insns in some very rare
+                and complicated cases, e.g. the pseudo was removed by
+                inheritance and the debug insn is not EBBs where the
+                inheritance happened.  It is difficult and time
+                consuming to find what hard register corresponds the
+                pseudo -- so just remove the debug insn.  Another
+                solution could be assigning hard reg/memory but it
+                would be a misleading info.  It is better not to have
+                info than have it wrong.  */
+             lra_assert (DEBUG_INSN_P (insn));
+             lra_invalidate_insn_data (insn);
+             delete_insn (insn);
+             continue;
+           }
+         
          struct lra_static_insn_data *static_id = id->insn_static_data;
          bool insn_change_p = false;
          
index bc79f6fe7a6ff8bb29a6bd29e94f01580cc44ff1..fec376037d0d53fc7bd1c8aef623215f38e82ec3 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/68691
+       * gcc.target/i386/pr68691.c: New.
+
 2015-12-10  David Malcolm  <dmalcolm@redhat.com>
 
        * lib/multiline.exp (_multiline_expected_outputs): Update comment.
diff --git a/gcc/testsuite/gcc.target/i386/pr68691.c b/gcc/testsuite/gcc.target/i386/pr68691.c
new file mode 100644 (file)
index 0000000..f522291
--- /dev/null
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -g" } */
+
+char a, b, i, j;
+int c, d, e, f, g, h, n;
+
+char
+fn1 ()
+{
+  char k, l, m;
+  int p;
+  e = g > f;
+  for (b = 0; b < 2; b++)
+    {
+      for (p = 0; p < 3; p++)
+       {
+         for (; h < 1; h++)
+           {
+             for (; m;)
+               goto lbl;
+             e = g;
+           }
+         l = a < 0 || a < d;
+       }
+      d++;
+      for (;;)
+       {
+         k = g;
+         n = -k;
+         j = n;
+         c = j;
+         e = 2;
+         if (l)
+           break;
+         return 2;
+       }
+    }
+  for (;;)
+    ;
+ lbl:
+  return i;
+}