Commit 115df136 by J"orn Rennecke Committed by Joern Rennecke

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
parent f30dbd20
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> 2004-01-16 Jan Hubicka <jh@suse.cz>
PR opt/11350 PR opt/11350
......
...@@ -388,6 +388,8 @@ reload_cse_simplify_operands (rtx insn, rtx testreg) ...@@ -388,6 +388,8 @@ reload_cse_simplify_operands (rtx insn, rtx testreg)
{ {
cselib_val *v; cselib_val *v;
struct elt_loc_list *l; struct elt_loc_list *l;
rtx op;
enum machine_mode mode;
CLEAR_HARD_REG_SET (equiv_regs[i]); CLEAR_HARD_REG_SET (equiv_regs[i]);
...@@ -399,7 +401,52 @@ reload_cse_simplify_operands (rtx insn, rtx testreg) ...@@ -399,7 +401,52 @@ reload_cse_simplify_operands (rtx insn, rtx testreg)
&& recog_data.operand_mode[i] == VOIDmode)) && recog_data.operand_mode[i] == VOIDmode))
continue; 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) if (! v)
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment