mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-14 05:20:25 +08:00
postreload.c (reload_cse_simplify_operands): Don't remove implicit extension from LOAD_EXTEND_OP.
* postreload.c (reload_cse_simplify_operands): Don't remove implicit extension from LOAD_EXTEND_OP. From-SVN: r75975
This commit is contained in:
parent
f30dbd2039
commit
115df136c4
@ -1,3 +1,8 @@
|
||||
2004-01-16 J"orn Rennecke <joern.rennecke@superh.com>
|
||||
|
||||
* postreload.c (reload_cse_simplify_operands): Don't remove
|
||||
implicit extension from LOAD_EXTEND_OP.
|
||||
|
||||
2004-01-16 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
PR opt/11350
|
||||
|
@ -388,6 +388,8 @@ reload_cse_simplify_operands (rtx insn, rtx testreg)
|
||||
{
|
||||
cselib_val *v;
|
||||
struct elt_loc_list *l;
|
||||
rtx op;
|
||||
enum machine_mode mode;
|
||||
|
||||
CLEAR_HARD_REG_SET (equiv_regs[i]);
|
||||
|
||||
@ -399,7 +401,52 @@ reload_cse_simplify_operands (rtx insn, rtx testreg)
|
||||
&& recog_data.operand_mode[i] == VOIDmode))
|
||||
continue;
|
||||
|
||||
v = cselib_lookup (recog_data.operand[i], recog_data.operand_mode[i], 0);
|
||||
op = recog_data.operand[i];
|
||||
mode = GET_MODE (op);
|
||||
#ifdef LOAD_EXTEND_OP
|
||||
if (GET_CODE (op) == MEM
|
||||
&& GET_MODE_BITSIZE (mode) < BITS_PER_WORD
|
||||
&& LOAD_EXTEND_OP (mode) != NIL)
|
||||
{
|
||||
rtx set = single_set (insn);
|
||||
|
||||
/* We might have multiple sets, some of which do implict
|
||||
extension. Punt on this for now. */
|
||||
if (! set)
|
||||
continue;
|
||||
/* If the destination is a also MEM or a STRICT_LOW_PART, no
|
||||
extension applies.
|
||||
Also, if there is an explicit extension, we don't have to
|
||||
worry about an implicit one. */
|
||||
else if (GET_CODE (SET_DEST (set)) == MEM
|
||||
|| GET_CODE (SET_DEST (set)) == STRICT_LOW_PART
|
||||
|| GET_CODE (SET_SRC (set)) == ZERO_EXTEND
|
||||
|| GET_CODE (SET_SRC (set)) == SIGN_EXTEND)
|
||||
; /* Continue ordinary processing. */
|
||||
/* If this is a straight load, make the extension explicit. */
|
||||
else if (GET_CODE (SET_DEST (set)) == REG
|
||||
&& recog_data.n_operands == 2
|
||||
&& SET_SRC (set) == op
|
||||
&& SET_DEST (set) == recog_data.operand[1-i])
|
||||
{
|
||||
validate_change (insn, recog_data.operand_loc[i],
|
||||
gen_rtx_fmt_e (LOAD_EXTEND_OP (mode),
|
||||
word_mode, op),
|
||||
1);
|
||||
validate_change (insn, recog_data.operand_loc[1-i],
|
||||
gen_rtx_REG (word_mode, REGNO (SET_DEST (set))),
|
||||
1);
|
||||
if (! apply_change_group ())
|
||||
return 0;
|
||||
return reload_cse_simplify_operands (insn, testreg);
|
||||
}
|
||||
else
|
||||
/* ??? There might be arithmetic operations with memory that are
|
||||
safe to optimize, but is it worth the trouble? */
|
||||
continue;
|
||||
}
|
||||
#endif /* LOAD_EXTEND_OP */
|
||||
v = cselib_lookup (op, recog_data.operand_mode[i], 0);
|
||||
if (! v)
|
||||
continue;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user