re PR debug/44023 (-fcompare-debug failure (length) for alphaev67 target (bootstrap...
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 May 2010 06:48:15 +0000 (08:48 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 May 2010 06:48:15 +0000 (08:48 +0200)
PR debug/44023
* df-problems.c (struct dead_debug): Add to_rescan field.
(dead_debug_init): Clear to_rescan field.
(dead_debug_finish): Rescan all debug insns in to_rescan
bitmap and free the bitmap.
(dead_debug_insert_before): Instead of rescanning debug insns
immediately queue their rescanning until dead_debug_finish.
(df_note_bb_compute): After dead_debug_add do continue instead
of break.

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

From-SVN: r159254

gcc/ChangeLog
gcc/df-problems.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr44023.c [new file with mode: 0644]

index cd9b374..07aad7b 100644 (file)
@@ -1,3 +1,15 @@
+2010-05-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/44023
+       * df-problems.c (struct dead_debug): Add to_rescan field.
+       (dead_debug_init): Clear to_rescan field.
+       (dead_debug_finish): Rescan all debug insns in to_rescan
+       bitmap and free the bitmap.
+       (dead_debug_insert_before): Instead of rescanning debug insns
+       immediately queue their rescanning until dead_debug_finish.
+       (df_note_bb_compute): After dead_debug_add do continue instead
+       of break.
+
 2010-05-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/44028
index 84506c5..25bbba6 100644 (file)
@@ -1,6 +1,6 @@
 /* Standard problems for dataflow support routines.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008, 2009 Free Software Foundation, Inc.
+   2008, 2009, 2010 Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
@@ -3416,6 +3416,7 @@ struct dead_debug
 {
   struct dead_debug_use *head;
   bitmap used;
+  bitmap to_rescan;
 };
 
 /* Initialize DEBUG to an empty list, and clear USED, if given.  */
@@ -3424,6 +3425,7 @@ dead_debug_init (struct dead_debug *debug, bitmap used)
 {
   debug->head = NULL;
   debug->used = used;
+  debug->to_rescan = NULL;
   if (used)
     bitmap_clear (used);
 }
@@ -3447,10 +3449,26 @@ dead_debug_finish (struct dead_debug *debug, bitmap used)
        {
          INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
          df_insn_rescan_debug_internal (insn);
+         if (debug->to_rescan)
+           bitmap_clear_bit (debug->to_rescan, INSN_UID (insn));
        }
       debug->head = head->next;
       XDELETE (head);
     }
+
+  if (debug->to_rescan)
+    {
+      bitmap_iterator bi;
+      unsigned int uid;
+
+      EXECUTE_IF_SET_IN_BITMAP (debug->to_rescan, 0, uid, bi)
+       {
+         struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
+         if (insn_info)
+           df_insn_rescan (insn_info->insn);
+       }
+      BITMAP_FREE (debug->to_rescan);
+    }
 }
 
 /* Add USE to DEBUG.  It must be a dead reference to UREGNO in a debug
@@ -3530,7 +3548,9 @@ dead_debug_insert_before (struct dead_debug *debug, unsigned int uregno,
        *DF_REF_REAL_LOC (cur->use)
          = gen_lowpart_SUBREG (GET_MODE (*DF_REF_REAL_LOC (cur->use)), dval);
       /* ??? Should we simplify subreg of subreg?  */
-      df_insn_rescan (DF_REF_INSN (cur->use));
+      if (debug->to_rescan == NULL)
+       debug->to_rescan = BITMAP_ALLOC (NULL);
+      bitmap_set_bit (debug->to_rescan, INSN_UID (DF_REF_INSN (cur->use)));
       uses = cur->next;
       XDELETE (cur);
     }
@@ -3728,7 +3748,10 @@ df_note_bb_compute (unsigned int bb_index,
              if (debug_insn)
                {
                  if (debug_insn > 0)
-                   dead_debug_add (&debug, use, uregno);
+                   {
+                     dead_debug_add (&debug, use, uregno);
+                     continue;
+                   }
                  break;
                }
              else
index 81b584b..6035e5a 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/44023
+       * gcc.dg/pr44023.c: New test.
+
 2010-05-10  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/lto7.adb: New test.
diff --git a/gcc/testsuite/gcc.dg/pr44023.c b/gcc/testsuite/gcc.dg/pr44023.c
new file mode 100644 (file)
index 0000000..ee99bf6
--- /dev/null
@@ -0,0 +1,46 @@
+/* PR debug/44023 */
+/* { dg-do compile } */
+/* { dg-options "-fcompare-debug -O2" } */
+/* { dg-options "-fcompare-debug -O2 -mcpu=ev67" { target alpha*-*-* } } */
+
+void
+foo (unsigned f, long v, unsigned *w, unsigned a, unsigned b, unsigned e, unsigned c, unsigned d)
+{
+  unsigned h = v / 4, x[16];
+  while (f < h)
+    {
+      unsigned i;
+      f++;
+      a |= (a >> 30);
+      d = (d << 30) | ((unsigned) d >> 30);
+      c = (c << 30) | ((unsigned) c >> 30);
+      b = 30 | ((unsigned) b >> 30);
+      d += a = (a << 30) | ((unsigned) a >> 2);
+      c += ((d << 5) | (d >> 27)) + ((e & (a ^ b))) + 0x5a827999 + x[12];
+      a += (c & e);
+      c = 30 | ((unsigned) c);
+      i = x[5] ^ x[7] ^ x[8] ^ x[3];
+      x[5] = (i << 1) | ((unsigned) i >> 31);
+      i = x[6] ^ x[2] ^ x[14] ^ x[13];
+      x[6] = (i << 1) | (i >> 31);
+      b += (c | (c >> 5)) + (d ^ e) + 0x6ed9eba1 + (x[7] = (i << 1) | ((unsigned) i >> 31));
+      x[8] = i | 1;
+      e += (a | 5) + b + (i = x[9] ^ x[6], x[10] = (i << (unsigned) i));
+      e = 30 | ((unsigned) e >> 30);
+      i = x[12] ^ x[14] ^ x[12] ^ x[12], (x[12] = 1 | ((unsigned) i));
+      i = x[13] ^ x[5] ^ x[10], (x[13] = (i << (unsigned) 1));
+      i = x[2] ^ x[7] ^ x[12], (x[15] = i | ((unsigned) i >> 1));
+      i = x[2] ^ x[0] ^ x[13], (x[0] = (i << 1) | 31);
+      e = (e << 30) | 2;
+      i = x[14] ^ x[2] ^ x[15], (x[2] = i | 1);
+      x[3] = i | ((unsigned) i);
+      i = x[14] ^ x[12] ^ x[4], (x[4] = 1 | ((unsigned) i >> 1));
+      x[5] = i | 1;
+      e = (e << 30) | 30;
+      b += (5 | ((unsigned) e >> 5)) + 0x8f1bbcdc + (x[9] = (i | ((unsigned) i >> 1)));
+      i = x[2] ^ (x [10] = ((i << 1) | (i >> 1)));
+      x[13] = (i | ((unsigned) i >> 1));
+      (i = x[14] ^ x[0] ^ x[14], (x[14] = ((i << 1) | 31)));
+      a = *w += a;
+    }
+}