* postreload.c (reload_cse_simplify_operands): Don't remove
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Jan 2004 16:11:56 +0000 (16:11 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Jan 2004 16:11:56 +0000 (16:11 +0000)
implicit extension from LOAD_EXTEND_OP.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@75975 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/postreload.c

index d57fcb0..f09c9f4 100644 (file)
@@ -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
index 835a721..8d288d8 100644 (file)
@@ -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;