df.h (df_mw_hardreg): Remove "loc" field.

gcc/
	* df.h (df_mw_hardreg): Remove "loc" field.
	* df-scan.c (df_ref_record): Don't set it.  Remove redundant
	local variable.
	* df-problems.c (df_whole_mw_reg_unused_p): New function,
	split out from df_set_unused_notes_for_mw.  Return false for
	partial references.  Assert that mw_reg is a REG when returning true.
	(df_set_unused_notes_for_mw): Use it.  Use mw_reg instead of *loc.
	(df_whole_mw_reg_dead_p): New function, split out from
	df_set_dead_notes_for_mw.  Return false for partial references.
	Assert that mw_reg is a REG when returning true.
	(df_set_dead_notes_for_mw): Use it.  Use mw_reg instead of *loc.
	Remove redundant bitmap check.

From-SVN: r126970
This commit is contained in:
Richard Sandiford 2007-07-27 07:15:45 +00:00 committed by Richard Sandiford
parent 23815ffed0
commit 6f5c15202d
4 changed files with 77 additions and 32 deletions

View File

@ -1,3 +1,18 @@
2007-07-27 Richard Sandiford <rsandifo@nildram.co.uk>
* df.h (df_mw_hardreg): Remove "loc" field.
* df-scan.c (df_ref_record): Don't set it. Remove redundant
local variable.
* df-problems.c (df_whole_mw_reg_unused_p): New function,
split out from df_set_unused_notes_for_mw. Return false for
partial references. Assert that mw_reg is a REG when returning true.
(df_set_unused_notes_for_mw): Use it. Use mw_reg instead of *loc.
(df_whole_mw_reg_dead_p): New function, split out from
df_set_dead_notes_for_mw. Return false for partial references.
Assert that mw_reg is a REG when returning true.
(df_set_dead_notes_for_mw): Use it. Use mw_reg instead of *loc.
Remove redundant bitmap check.
2007-07-26 H.J. Lu <hongjiu.lu@intel.com>
* config/ia64/t-ia64 ($(T)crtbegin.o): Removed.

View File

@ -3716,6 +3716,32 @@ df_set_note (enum reg_note note_type, rtx insn, rtx old, rtx reg)
return old;
}
/* A subroutine of df_set_unused_notes_for_mw, with a selection of its
arguments. Return true if the register value described by MWS's
mw_reg is known to be completely unused, and if mw_reg can therefore
be used in a REG_UNUSED note. */
static bool
df_whole_mw_reg_unused_p (struct df_mw_hardreg *mws,
bitmap live, bitmap artificial_uses)
{
unsigned int r;
/* If MWS describes a partial reference, create REG_UNUSED notes for
individual hard registers. */
if (mws->flags & DF_REF_PARTIAL)
return false;
/* Likewise if some part of the register is used. */
for (r = mws->start_regno; r <= mws->end_regno; r++)
if (bitmap_bit_p (live, r)
|| bitmap_bit_p (artificial_uses, r))
return false;
gcc_assert (REG_P (mws->mw_reg));
return true;
}
/* 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
artificial uses. DO_NOT_GEN is updated so that REG_DEAD notes are
@ -3728,7 +3754,6 @@ df_set_unused_notes_for_mw (rtx insn, rtx old, struct df_mw_hardreg *mws,
bitmap live, bitmap do_not_gen,
bitmap artificial_uses)
{
bool all_dead = true;
unsigned int r;
#ifdef REG_DEAD_DEBUGGING
@ -3736,18 +3761,11 @@ df_set_unused_notes_for_mw (rtx insn, rtx old, struct df_mw_hardreg *mws,
fprintf (dump_file, "mw_set_unused looking at mws[%d..%d]\n",
mws->start_regno, mws->end_regno);
#endif
for (r=mws->start_regno; r <= mws->end_regno; r++)
if ((bitmap_bit_p (live, r))
|| bitmap_bit_p (artificial_uses, r))
{
all_dead = false;
break;
}
if (all_dead)
if (df_whole_mw_reg_unused_p (mws, live, artificial_uses))
{
unsigned int regno = mws->start_regno;
old = df_set_note (REG_UNUSED, insn, old, *(mws->loc));
old = df_set_note (REG_UNUSED, insn, old, mws->mw_reg);
#ifdef REG_DEAD_DEBUGGING
df_print_note ("adding 1: ", insn, REG_NOTES (insn));
@ -3772,6 +3790,34 @@ df_set_unused_notes_for_mw (rtx insn, rtx old, struct df_mw_hardreg *mws,
}
/* A subroutine of df_set_dead_notes_for_mw, with a selection of its
arguments. Return true if the register value described by MWS's
mw_reg is known to be completely dead, and if mw_reg can therefore
be used in a REG_DEAD note. */
static bool
df_whole_mw_reg_dead_p (struct df_mw_hardreg *mws,
bitmap live, bitmap artificial_uses,
bitmap do_not_gen)
{
unsigned int r;
/* If MWS describes a partial reference, create REG_DEAD notes for
individual hard registers. */
if (mws->flags & DF_REF_PARTIAL)
return false;
/* Likewise if some part of the register is not dead. */
for (r = mws->start_regno; r <= mws->end_regno; r++)
if (bitmap_bit_p (live, r)
|| bitmap_bit_p (artificial_uses, r)
|| bitmap_bit_p (do_not_gen, r))
return false;
gcc_assert (REG_P (mws->mw_reg));
return true;
}
/* Set the REG_DEAD notes for the multiword hardreg use in INSN based
on the bits in LIVE. DO_NOT_GEN is used to keep REG_DEAD notes
from being set if the instruction both reads and writes the
@ -3782,7 +3828,6 @@ df_set_dead_notes_for_mw (rtx insn, rtx old, struct df_mw_hardreg *mws,
bitmap live, bitmap do_not_gen,
bitmap artificial_uses)
{
bool all_dead = true;
unsigned int r;
#ifdef REG_DEAD_DEBUGGING
@ -3798,25 +3843,13 @@ df_set_dead_notes_for_mw (rtx insn, rtx old, struct df_mw_hardreg *mws,
}
#endif
for (r = mws->start_regno; r <= mws->end_regno; r++)
if ((bitmap_bit_p (live, r))
|| bitmap_bit_p (artificial_uses, r)
|| bitmap_bit_p (do_not_gen, r))
{
all_dead = false;
break;
}
if (all_dead)
if (df_whole_mw_reg_dead_p (mws, live, artificial_uses, do_not_gen))
{
if (!bitmap_bit_p (do_not_gen, mws->start_regno))
{
/* Add a dead note for the entire multi word register. */
old = df_set_note (REG_DEAD, insn, old, *(mws->loc));
/* Add a dead note for the entire multi word register. */
old = df_set_note (REG_DEAD, insn, old, mws->mw_reg);
#ifdef REG_DEAD_DEBUGGING
df_print_note ("adding 1: ", insn, REG_NOTES (insn));
df_print_note ("adding 1: ", insn, REG_NOTES (insn));
#endif
}
}
else
{

View File

@ -2625,7 +2625,6 @@ df_ref_record (struct df_collection_rec *collection_rec,
enum df_ref_type ref_type,
enum df_ref_flags ref_flags)
{
rtx oldreg = reg;
unsigned int regno;
gcc_assert (REG_P (reg) || GET_CODE (reg) == SUBREG);
@ -2656,7 +2655,7 @@ df_ref_record (struct df_collection_rec *collection_rec,
{
/* Sets to a subreg of a multiword register are partial.
Sets to a non-subreg of a multiword register are not. */
if (GET_CODE (oldreg) == SUBREG)
if (GET_CODE (reg) == SUBREG)
ref_flags |= DF_REF_PARTIAL;
ref_flags |= DF_REF_MW_HARDREG;
@ -2664,7 +2663,6 @@ df_ref_record (struct df_collection_rec *collection_rec,
hardreg->type = ref_type;
hardreg->flags = ref_flags;
hardreg->mw_reg = reg;
hardreg->loc = loc;
hardreg->start_regno = regno;
hardreg->end_regno = endregno - 1;
hardreg->mw_order = df->ref_order++;

View File

@ -311,7 +311,6 @@ struct dataflow
struct df_mw_hardreg
{
rtx mw_reg; /* The multiword hardreg. */
rtx *loc; /* The location of the reg. */
enum df_ref_type type; /* Used to see if the ref is read or write. */
enum df_ref_flags flags; /* Various flags. */
unsigned int start_regno; /* First word of the multi word subreg. */