diff options
author | J"orn Rennecke <joern.rennecke@superh.com> | 2004-01-16 16:11:56 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 2004-01-16 16:11:56 +0000 |
commit | 115df136c41e30c3594c17cb23d0e8cdb01165c1 (patch) | |
tree | 21250d036dca5291c7b075140393ad03aae7d971 /gcc | |
parent | f30dbd203927caccd00df7ad0ede3995e7f14991 (diff) | |
download | gcc-115df136c41e30c3594c17cb23d0e8cdb01165c1.zip gcc-115df136c41e30c3594c17cb23d0e8cdb01165c1.tar.gz gcc-115df136c41e30c3594c17cb23d0e8cdb01165c1.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/postreload.c | 49 |
2 files changed, 53 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d57fcb0..f09c9f4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/postreload.c b/gcc/postreload.c index 835a721..8d288d8 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -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; |