diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-11 06:48:15 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-11 06:48:15 +0000 |
commit | 3b0200750a54053581391016386673fac2c0fbb2 (patch) | |
tree | a0baa9749d10a81b4d5315dd7e0d44516800e84a /gcc/df-problems.c | |
parent | 04ea177323f891ebbbb477f280b02b09bfbe85df (diff) | |
download | gcc-3b0200750a54053581391016386673fac2c0fbb2.tar.gz |
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
Diffstat (limited to 'gcc/df-problems.c')
-rw-r--r-- | gcc/df-problems.c | 29 |
1 files changed, 26 insertions, 3 deletions
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 |