mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-18 13:01:06 +08:00
gcse.c (local_cprop_find_used_regs): New.
* gcse.c (local_cprop_find_used_regs): New. (local_cprop_pass): Use it. From-SVN: r62555
This commit is contained in:
parent
3ef879d2ae
commit
710ee3ed76
@ -1,3 +1,9 @@
|
||||
2003-02-07 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR 9226
|
||||
* gcse.c (local_cprop_find_used_regs): New.
|
||||
(local_cprop_pass): Use it.
|
||||
|
||||
2003-02-07 Fred Fish <fnf@intrinsity.com>
|
||||
|
||||
* mips-tfile.c (parse_def): Parenthesize assignments to fix
|
||||
|
52
gcc/gcse.c
52
gcc/gcse.c
@ -706,6 +706,7 @@ static void free_insn_expr_list_list PARAMS ((rtx *));
|
||||
static void clear_modify_mem_tables PARAMS ((void));
|
||||
static void free_modify_mem_tables PARAMS ((void));
|
||||
static rtx gcse_emit_move_after PARAMS ((rtx, rtx, rtx));
|
||||
static void local_cprop_find_used_regs PARAMS ((rtx *, void *));
|
||||
static bool do_local_cprop PARAMS ((rtx, rtx, int, rtx*));
|
||||
static bool adjust_libcall_notes PARAMS ((rtx, rtx, rtx, rtx*));
|
||||
static void local_cprop_pass PARAMS ((int));
|
||||
@ -4258,6 +4259,53 @@ cprop_insn (insn, alter_jumps)
|
||||
return changed;
|
||||
}
|
||||
|
||||
/* Like find_used_regs, but avoid recording uses that appear in
|
||||
input-output contexts such as zero_extract or pre_dec. This
|
||||
restricts the cases we consider to those for which local cprop
|
||||
can legitimately make replacements. */
|
||||
|
||||
static void
|
||||
local_cprop_find_used_regs (xptr, data)
|
||||
rtx *xptr;
|
||||
void *data;
|
||||
{
|
||||
rtx x = *xptr;
|
||||
|
||||
if (x == 0)
|
||||
return;
|
||||
|
||||
switch (GET_CODE (x))
|
||||
{
|
||||
case ZERO_EXTRACT:
|
||||
case SIGN_EXTRACT:
|
||||
case STRICT_LOW_PART:
|
||||
return;
|
||||
|
||||
case PRE_DEC:
|
||||
case PRE_INC:
|
||||
case POST_DEC:
|
||||
case POST_INC:
|
||||
case PRE_MODIFY:
|
||||
case POST_MODIFY:
|
||||
/* Can only legitimately appear this early in the context of
|
||||
stack pushes for function arguments, but handle all of the
|
||||
codes nonetheless. */
|
||||
return;
|
||||
|
||||
case SUBREG:
|
||||
/* Setting a subreg of a register larger than word_mode leaves
|
||||
the non-written words unchanged. */
|
||||
if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) > BITS_PER_WORD)
|
||||
return;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
find_used_regs (xptr, data);
|
||||
}
|
||||
|
||||
/* LIBCALL_SP is a zero-terminated array of insns at the end of a libcall;
|
||||
their REG_EQUAL notes need updating. */
|
||||
|
||||
@ -4413,9 +4461,9 @@ local_cprop_pass (alter_jumps)
|
||||
do
|
||||
{
|
||||
reg_use_count = 0;
|
||||
note_uses (&PATTERN (insn), find_used_regs, NULL);
|
||||
note_uses (&PATTERN (insn), local_cprop_find_used_regs, NULL);
|
||||
if (note)
|
||||
find_used_regs (&XEXP (note, 0), NULL);
|
||||
local_cprop_find_used_regs (&XEXP (note, 0), NULL);
|
||||
|
||||
for (reg_used = ®_use_table[0]; reg_use_count > 0;
|
||||
reg_used++, reg_use_count--)
|
||||
|
Loading…
x
Reference in New Issue
Block a user