aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-05-11 08:48:15 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-05-11 08:48:15 +0200
commit3f592b380f98e60a084f62d9c54aa3c2094a22fa (patch)
treea0baa9749d10a81b4d5315dd7e0d44516800e84a /gcc
parent1f8d1f8270f0acc4728a0e4c5665cc0020817f48 (diff)
downloadgcc-3f592b380f98e60a084f62d9c54aa3c2094a22fa.zip
gcc-3f592b380f98e60a084f62d9c54aa3c2094a22fa.tar.gz
gcc-3f592b380f98e60a084f62d9c54aa3c2094a22fa.tar.bz2
re PR debug/44023 (-fcompare-debug failure (length) for alphaev67 target (bootstrap failure))
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/df-problems.c29
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr44023.c46
4 files changed, 89 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cd9b374..07aad7b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/df-problems.c b/gcc/df-problems.c
index 84506c5..25bbba6 100644
--- a/gcc/df-problems.c
+++ b/gcc/df-problems.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 81b584b..6035e5a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..ee99bf6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr44023.c
@@ -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;
+ }
+}