diff --git a/ChangeLog b/ChangeLog index c39b1826d92..34f63c17f53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-06-25 Richard Sandiford + + PR debug/53740 + * df.h, df-problems.c, dce.c: Revert last patch. + 2012-06-25 Iain Sandoe * MAINTAINERS (Write After Approval): Update my email address. diff --git a/gcc/dce.c b/gcc/dce.c index 7e522c19a82..8954d5c0c01 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -848,7 +848,7 @@ word_dce_process_block (basic_block bb, bool redo_out) == 2 * UNITS_PER_WORD) && !bitmap_bit_p (local_live, 2 * DF_REF_REGNO (*use_rec)) && !bitmap_bit_p (local_live, 2 * DF_REF_REGNO (*use_rec) + 1)) - dead_debug_add (&debug, *use_rec); + dead_debug_add (&debug, *use_rec, DF_REF_REGNO (*use_rec)); } else if (INSN_P (insn)) { @@ -938,7 +938,7 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au) for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++) if (!bitmap_bit_p (local_live, DF_REF_REGNO (*use_rec)) && !bitmap_bit_p (au, DF_REF_REGNO (*use_rec))) - dead_debug_add (&debug, *use_rec); + dead_debug_add (&debug, *use_rec, DF_REF_REGNO (*use_rec)); } else if (INSN_P (insn)) { diff --git a/gcc/df-problems.c b/gcc/df-problems.c index 2a698d4d5e2..a020e28ad27 100644 --- a/gcc/df-problems.c +++ b/gcc/df-problems.c @@ -3165,10 +3165,10 @@ dead_debug_finish (struct dead_debug *debug, bitmap used) } } -/* Add USE to DEBUG. It must be a dead reference to a register in a debug +/* Add USE to DEBUG. It must be a dead reference to UREGNO in a debug insn. Create a bitmap for DEBUG as needed. */ void -dead_debug_add (struct dead_debug *debug, df_ref use) +dead_debug_add (struct dead_debug *debug, df_ref use, unsigned int uregno) { struct dead_debug_use *newddu = XNEW (struct dead_debug_use); @@ -3179,7 +3179,7 @@ dead_debug_add (struct dead_debug *debug, df_ref use) if (!debug->used) debug->used = BITMAP_ALLOC (NULL); - bitmap_set_bit (debug->used, REGNO (*DF_REF_REAL_LOC (use))); + bitmap_set_bit (debug->used, uregno); } /* If UREGNO is referenced by any entry in DEBUG, emit a debug insn @@ -3201,7 +3201,6 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno, rtx breg; rtx dval; rtx bind; - rtx cur_reg; if (!debug->used || !bitmap_clear_bit (debug->used, uregno)) return 0; @@ -3210,8 +3209,7 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno, the widest referenced mode. */ while ((cur = *tailp)) { - cur_reg = *DF_REF_REAL_LOC (cur->use); - if (REGNO (cur_reg) == uregno) + if (DF_REF_REGNO (cur->use) == uregno) { *usesp = cur; usesp = &cur->next; @@ -3219,13 +3217,21 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno, cur->next = NULL; if (!reg || (GET_MODE_BITSIZE (GET_MODE (reg)) - < GET_MODE_BITSIZE (GET_MODE (cur_reg)))) - reg = cur_reg; + < GET_MODE_BITSIZE (GET_MODE (*DF_REF_REAL_LOC (cur->use))))) + reg = *DF_REF_REAL_LOC (cur->use); } else tailp = &(*tailp)->next; } + /* We may have dangling bits in debug->used for registers that were part + of a multi-register use, one component of which has been reset. */ + if (reg == NULL) + { + gcc_checking_assert (!uses); + return 0; + } + gcc_checking_assert (uses); breg = reg; @@ -3334,21 +3340,15 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno, /* Adjust all uses. */ while ((cur = uses)) { - /* If the reference spans multiple hard registers, we'll have - a use for each one. Only change each reference once. */ - cur_reg = *DF_REF_REAL_LOC (cur->use); - if (REG_P (cur_reg)) - { - if (GET_MODE (cur_reg) == GET_MODE (reg)) - *DF_REF_REAL_LOC (cur->use) = dval; - else - *DF_REF_REAL_LOC (cur->use) - = gen_lowpart_SUBREG (GET_MODE (cur_reg), dval); - /* ??? Should we simplify subreg of subreg? */ - if (debug->to_rescan == NULL) - debug->to_rescan = BITMAP_ALLOC (NULL); - bitmap_set_bit (debug->to_rescan, INSN_UID (DF_REF_INSN (cur->use))); - } + if (GET_MODE (*DF_REF_REAL_LOC (cur->use)) == GET_MODE (reg)) + *DF_REF_REAL_LOC (cur->use) = dval; + else + *DF_REF_REAL_LOC (cur->use) + = gen_lowpart_SUBREG (GET_MODE (*DF_REF_REAL_LOC (cur->use)), dval); + /* ??? Should we simplify subreg of subreg? */ + 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); } @@ -3547,7 +3547,7 @@ df_note_bb_compute (unsigned int bb_index, debug insns either. */ if (!bitmap_bit_p (artificial_uses, uregno) && !df_ignore_stack_reg (uregno)) - dead_debug_add (&debug, use); + dead_debug_add (&debug, use, uregno); continue; } break; diff --git a/gcc/df.h b/gcc/df.h index b6d168d8ee9..1b4882d1d16 100644 --- a/gcc/df.h +++ b/gcc/df.h @@ -1138,7 +1138,7 @@ enum debug_temp_where extern void dead_debug_init (struct dead_debug *, bitmap); extern void dead_debug_finish (struct dead_debug *, bitmap); -extern void dead_debug_add (struct dead_debug *, df_ref); +extern void dead_debug_add (struct dead_debug *, df_ref, unsigned int); extern int dead_debug_insert_temp (struct dead_debug *, unsigned int uregno, rtx insn, enum debug_temp_where);