re PR debug/46171 (ICE: in gen_rtx_SUBREG, at emit-rtl.c:774 with -fno-tree-dce -g)

PR debug/46171
	* df-problems.c (struct dead_debug_use, struct dead_debug): Move
	earlier.
	(df_set_unused_notes_for_mw, df_create_unused_note): Add DEBUG
	argument, call dead_debug_reset when adding REG_UNUSED note.
	(dead_debug_reset): New function.
	(df_note_bb_compute): Adjust df_set_unused_notes_for_mw and
	df_create_unused_note callers.

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

From-SVN: r166504
This commit is contained in:
Jakub Jelinek 2010-11-09 20:04:44 +01:00 committed by Jakub Jelinek
parent cc577f3f11
commit 67c6812fe3
4 changed files with 88 additions and 21 deletions

View File

@ -1,3 +1,14 @@
2010-11-09 Jakub Jelinek <jakub@redhat.com>
PR debug/46171
* df-problems.c (struct dead_debug_use, struct dead_debug): Move
earlier.
(df_set_unused_notes_for_mw, df_create_unused_note): Add DEBUG
argument, call dead_debug_reset when adding REG_UNUSED note.
(dead_debug_reset): New function.
(df_note_bb_compute): Adjust df_set_unused_notes_for_mw and
df_create_unused_note callers.
2010-11-09 Anatoly Sokolov <aesok@post.ru> 2010-11-09 Anatoly Sokolov <aesok@post.ru>
* config/fr30/fr30.c: Include "df.h". * config/fr30/fr30.c: Include "df.h".

View File

@ -2837,6 +2837,26 @@ df_whole_mw_reg_unused_p (struct df_mw_hardreg *mws,
return true; return true;
} }
/* Node of a linked list of uses of dead REGs in debug insns. */
struct dead_debug_use
{
df_ref use;
struct dead_debug_use *next;
};
/* Linked list of the above, with a bitmap of the REGs in the
list. */
struct dead_debug
{
struct dead_debug_use *head;
bitmap used;
bitmap to_rescan;
};
static void dead_debug_reset (struct dead_debug *, unsigned int);
/* Set the REG_UNUSED notes for the multiword hardreg defs in INSN /* Set the REG_UNUSED notes for the multiword hardreg defs in INSN
based on the bits in LIVE. Do not generate notes for registers in based on the bits in LIVE. Do not generate notes for registers in
artificial uses. DO_NOT_GEN is updated so that REG_DEAD notes are artificial uses. DO_NOT_GEN is updated so that REG_DEAD notes are
@ -2847,7 +2867,8 @@ df_whole_mw_reg_unused_p (struct df_mw_hardreg *mws,
static void static void
df_set_unused_notes_for_mw (rtx insn, struct df_mw_hardreg *mws, df_set_unused_notes_for_mw (rtx insn, struct df_mw_hardreg *mws,
bitmap live, bitmap do_not_gen, bitmap live, bitmap do_not_gen,
bitmap artificial_uses) bitmap artificial_uses,
struct dead_debug *debug)
{ {
unsigned int r; unsigned int r;
@ -2861,6 +2882,7 @@ df_set_unused_notes_for_mw (rtx insn, struct df_mw_hardreg *mws,
{ {
unsigned int regno = mws->start_regno; unsigned int regno = mws->start_regno;
df_set_note (REG_UNUSED, insn, mws->mw_reg); df_set_note (REG_UNUSED, insn, mws->mw_reg);
dead_debug_reset (debug, regno);
#ifdef REG_DEAD_DEBUGGING #ifdef REG_DEAD_DEBUGGING
df_print_note ("adding 1: ", insn, REG_NOTES (insn)); df_print_note ("adding 1: ", insn, REG_NOTES (insn));
@ -2875,6 +2897,7 @@ df_set_unused_notes_for_mw (rtx insn, struct df_mw_hardreg *mws,
&& !bitmap_bit_p (artificial_uses, r)) && !bitmap_bit_p (artificial_uses, r))
{ {
df_set_note (REG_UNUSED, insn, regno_reg_rtx[r]); df_set_note (REG_UNUSED, insn, regno_reg_rtx[r]);
dead_debug_reset (debug, r);
#ifdef REG_DEAD_DEBUGGING #ifdef REG_DEAD_DEBUGGING
df_print_note ("adding 2: ", insn, REG_NOTES (insn)); df_print_note ("adding 2: ", insn, REG_NOTES (insn));
#endif #endif
@ -2980,7 +3003,8 @@ df_set_dead_notes_for_mw (rtx insn, struct df_mw_hardreg *mws,
static void static void
df_create_unused_note (rtx insn, df_ref def, df_create_unused_note (rtx insn, df_ref def,
bitmap live, bitmap artificial_uses) bitmap live, bitmap artificial_uses,
struct dead_debug *debug)
{ {
unsigned int dregno = DF_REF_REGNO (def); unsigned int dregno = DF_REF_REGNO (def);
@ -3000,6 +3024,7 @@ df_create_unused_note (rtx insn, df_ref def,
rtx reg = (DF_REF_LOC (def)) rtx reg = (DF_REF_LOC (def))
? *DF_REF_REAL_LOC (def): DF_REF_REG (def); ? *DF_REF_REAL_LOC (def): DF_REF_REG (def);
df_set_note (REG_UNUSED, insn, reg); df_set_note (REG_UNUSED, insn, reg);
dead_debug_reset (debug, dregno);
#ifdef REG_DEAD_DEBUGGING #ifdef REG_DEAD_DEBUGGING
df_print_note ("adding 3: ", insn, REG_NOTES (insn)); df_print_note ("adding 3: ", insn, REG_NOTES (insn));
#endif #endif
@ -3008,21 +3033,6 @@ df_create_unused_note (rtx insn, df_ref def,
return; return;
} }
/* Node of a linked list of uses of dead REGs in debug insns. */
struct dead_debug_use
{
df_ref use;
struct dead_debug_use *next;
};
/* Linked list of the above, with a bitmap of the REGs in the
list. */
struct dead_debug
{
struct dead_debug_use *head;
bitmap used;
bitmap to_rescan;
};
/* Initialize DEBUG to an empty list, and clear USED, if given. */ /* Initialize DEBUG to an empty list, and clear USED, if given. */
static inline void static inline void
@ -3076,6 +3086,34 @@ dead_debug_finish (struct dead_debug *debug, bitmap used)
} }
} }
/* Reset DEBUG_INSNs with pending uses of DREGNO. */
static void
dead_debug_reset (struct dead_debug *debug, unsigned int dregno)
{
struct dead_debug_use **tailp = &debug->head;
struct dead_debug_use *cur;
rtx insn;
if (!debug->used || !bitmap_clear_bit (debug->used, dregno))
return;
while ((cur = *tailp))
{
if (DF_REF_REGNO (cur->use) == dregno)
{
*tailp = cur->next;
insn = DF_REF_INSN (cur->use);
INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
if (debug->to_rescan == NULL)
debug->to_rescan = BITMAP_ALLOC (NULL);
bitmap_set_bit (debug->to_rescan, INSN_UID (insn));
XDELETE (cur);
}
else
tailp = &(*tailp)->next;
}
}
/* Add USE to DEBUG. It must be a dead reference to UREGNO 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. */ insn. Create a bitmap for DEBUG as needed. */
static inline void static inline void
@ -3258,7 +3296,7 @@ df_note_bb_compute (unsigned int bb_index,
&& !df_ignore_stack_reg (mws->start_regno)) && !df_ignore_stack_reg (mws->start_regno))
df_set_unused_notes_for_mw (insn, df_set_unused_notes_for_mw (insn,
mws, live, do_not_gen, mws, live, do_not_gen,
artificial_uses); artificial_uses, &debug);
mws_rec++; mws_rec++;
} }
@ -3271,7 +3309,7 @@ df_note_bb_compute (unsigned int bb_index,
if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER)) if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))
{ {
df_create_unused_note (insn, df_create_unused_note (insn,
def, live, artificial_uses); def, live, artificial_uses, &debug);
bitmap_set_bit (do_not_gen, dregno); bitmap_set_bit (do_not_gen, dregno);
} }
@ -3289,7 +3327,7 @@ df_note_bb_compute (unsigned int bb_index,
if (DF_MWS_REG_DEF_P (mws)) if (DF_MWS_REG_DEF_P (mws))
df_set_unused_notes_for_mw (insn, df_set_unused_notes_for_mw (insn,
mws, live, do_not_gen, mws, live, do_not_gen,
artificial_uses); artificial_uses, &debug);
mws_rec++; mws_rec++;
} }
@ -3298,7 +3336,7 @@ df_note_bb_compute (unsigned int bb_index,
df_ref def = *def_rec; df_ref def = *def_rec;
unsigned int dregno = DF_REF_REGNO (def); unsigned int dregno = DF_REF_REGNO (def);
df_create_unused_note (insn, df_create_unused_note (insn,
def, live, artificial_uses); def, live, artificial_uses, &debug);
if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER)) if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))
bitmap_set_bit (do_not_gen, dregno); bitmap_set_bit (do_not_gen, dregno);

View File

@ -1,3 +1,8 @@
2010-11-09 Jakub Jelinek <jakub@redhat.com>
PR debug/46171
* gcc.dg/pr46171.c: New test.
2010-11-09 Richard Guenther <rguenther@suse.de> 2010-11-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46355 PR tree-optimization/46355

View File

@ -0,0 +1,13 @@
/* PR debug/46171 */
/* { dg-do compile } */
/* { dg-options "-O -fno-tree-dce -g" } */
double bard ();
float barf (float);
void
foo (float f)
{
f = barf (f);
double d = bard ();
}