aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@superh.com>2004-01-16 16:11:56 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2004-01-16 16:11:56 +0000
commit115df136c41e30c3594c17cb23d0e8cdb01165c1 (patch)
tree21250d036dca5291c7b075140393ad03aae7d971 /gcc
parentf30dbd203927caccd00df7ad0ede3995e7f14991 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/postreload.c49
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;