From 3b0200750a54053581391016386673fac2c0fbb2 Mon Sep 17 00:00:00 2001 From: jakub Date: Tue, 11 May 2010 06:48:15 +0000 Subject: [PATCH 1/1] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159254 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 12 +++++++++++ gcc/df-problems.c | 29 +++++++++++++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr44023.c | 46 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr44023.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd9b3749390..07aad7be5c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2010-05-11 Jakub Jelinek + + 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 PR debug/44028 diff --git a/gcc/df-problems.c b/gcc/df-problems.c index 84506c588ae..25bbba61bb1 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 81b584b0133..6035e5aeeb4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-05-11 Jakub Jelinek + + PR debug/44023 + * gcc.dg/pr44023.c: New test. + 2010-05-10 Eric Botcazou * 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 00000000000..ee99bf601bb --- /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; + } +} -- 2.11.0