OSDN Git Service

* reload.c (find_reloads): When reloading a PLUS with constant
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Oct 2004 18:32:04 +0000 (18:32 +0000)
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Oct 2004 18:32:04 +0000 (18:32 +0000)
operand, make sure the constant is pushed to the constant pool
if required.
* config/s390/s390.c (s390_secondary_input_reload_class): Remove
reload bug workaround.
(s390_expand_plus_operand): Likewise.

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

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/reload.c

index 221ebc4..a685ef6 100644 (file)
@@ -1,3 +1,12 @@
+2004-10-14  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * reload.c (find_reloads): When reloading a PLUS with constant
+       operand, make sure the constant is pushed to the constant pool
+       if required.
+       * config/s390/s390.c (s390_secondary_input_reload_class): Remove
+       reload bug workaround.
+       (s390_expand_plus_operand): Likewise.
+
 2004-10-14  David Edelsohn  <edelsohn@gnu.org>
 
        * opts.c (common_handle_option): Do not enable
index c67ad19..89e1cb1 100644 (file)
@@ -2274,17 +2274,7 @@ s390_secondary_input_reload_class (enum reg_class class ATTRIBUTE_UNUSED,
                                   enum machine_mode mode, rtx in)
 {
   if (s390_plus_operand (in, mode))
-    {
-      /* ??? Reload sometimes pushes a PLUS reload with a too-large constant.
-        Until reload is fixed, we need to force_const_mem while emitting the
-        secondary reload insn -- thus we need to make sure here that we do
-        have a literal pool for the current function.  */
-      if (CONSTANT_P (XEXP (in, 1))
-         && !legitimate_reload_constant_p (XEXP (in, 1)))
-       current_function_uses_const_pool = true;
-
-      return ADDR_REGS;
-    }
+    return ADDR_REGS;
 
   return NO_REGS;
 }
@@ -2366,10 +2356,6 @@ s390_expand_plus_operand (register rtx target, register rtx src,
        }
       if (true_regnum (sum2) < 1 || true_regnum (sum2) > 15)
        {
-         /* ??? See comment in s390_secondary_input_reload_class.  */
-         if (CONSTANT_P (sum2) && !legitimate_reload_constant_p (sum2))
-           sum2 = force_const_mem (Pmode, sum2);
-
          emit_move_insn (scratch, sum2);
          sum2 = scratch;
        }
index f6a008d..66894dc 100644 (file)
@@ -3778,6 +3778,27 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
          goal_alternative_win[i] = 1;
       }
 
+  /* Likewise any invalid constants appearing as operand of a PLUS
+     that is to be reloaded.  */
+  for (i = 0; i < noperands; i++)
+    if (! goal_alternative_win[i]
+       && GET_CODE (recog_data.operand[i]) == PLUS
+       && CONST_POOL_OK_P (XEXP (recog_data.operand[i], 1))
+       && (PREFERRED_RELOAD_CLASS (XEXP (recog_data.operand[i], 1),
+                                   (enum reg_class) goal_alternative[i])
+            == NO_REGS)
+       && operand_mode[i] != VOIDmode)
+      {
+       rtx tem = force_const_mem (operand_mode[i],
+                                  XEXP (recog_data.operand[i], 1));
+       tem = gen_rtx_PLUS (operand_mode[i],
+                           XEXP (recog_data.operand[i], 0), tem);
+
+       substed_operand[i] = recog_data.operand[i]
+         = find_reloads_toplev (tem, i, address_type[i],
+                                ind_levels, 0, insn, NULL);
+      }
+
   /* Record the values of the earlyclobber operands for the caller.  */
   if (goal_earlyclobber)
     for (i = 0; i < noperands; i++)