]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/7630 (gcc 3.2 breaks on Mozilla 1.0's JS sources with -march...
authorJan Hubicka <jh@suse.cz>
Thu, 17 Oct 2002 16:52:27 +0000 (18:52 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 17 Oct 2002 16:52:27 +0000 (16:52 +0000)
PR opt/7630
* reload.c (reload_inner_reg_of_subreg): New argument output;
(push_reload): Update call.

From-SVN: r58250

gcc/ChangeLog
gcc/reload.c

index 052f6aba668401ede5a50870dc75c2b2fb1f52f8..4bfd60d9ad93fdca289555aed3e8650997ff0a9f 100644 (file)
@@ -1,3 +1,9 @@
+Thu Oct 17 17:14:07 CEST 2002  Jan Hubicka  <jh@suse.cz>
+
+       PR opt/7630
+       * reload.c (reload_inner_reg_of_subreg): New argument output;
+       (push_reload): Update call.
+
 Wed Apr 24 23:45:37 2002  J"orn Rennecke <joern.rennecke@superh.com>
 
        * calls.c (expand_call): Take current_function_pretend_args_size
index 80678d0d7b9ab7abd43a0ad60dbe0a6820fe1e21..166e1106620599a28689c46a3b90b5a58de89034 100644 (file)
@@ -242,7 +242,7 @@ static int push_secondary_reload PARAMS ((int, rtx, int, int, enum reg_class,
 #endif
 static enum reg_class find_valid_class PARAMS ((enum machine_mode, int,
                                                unsigned int));
-static int reload_inner_reg_of_subreg PARAMS ((rtx, enum machine_mode));
+static int reload_inner_reg_of_subreg PARAMS ((rtx, enum machine_mode, int));
 static void push_replacement   PARAMS ((rtx *, int, enum machine_mode));
 static void combine_reloads    PARAMS ((void));
 static int find_reusable_reload        PARAMS ((rtx *, rtx, enum reg_class,
@@ -794,9 +794,10 @@ find_reusable_reload (p_in, out, class, type, opnum, dont_share)
    SUBREG_REG expression.  */
 
 static int
-reload_inner_reg_of_subreg (x, mode)
+reload_inner_reg_of_subreg (x, mode, output)
      rtx x;
      enum machine_mode mode;
+     int output;
 {
   rtx inner;
 
@@ -824,6 +825,7 @@ reload_inner_reg_of_subreg (x, mode)
      word and the number of regs for INNER is not the same as the
      number of words in INNER, then INNER will need reloading.  */
   return (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
+         && output
          && GET_MODE_SIZE (GET_MODE (inner)) > UNITS_PER_WORD
          && ((GET_MODE_SIZE (GET_MODE (inner)) / UNITS_PER_WORD)
              != HARD_REGNO_NREGS (REGNO (inner), GET_MODE (inner))));
@@ -1047,7 +1049,7 @@ push_reload (in, out, inloc, outloc, class,
   /* Similar issue for (SUBREG constant ...) if it was not handled by the
      code above.  This can happen if SUBREG_BYTE != 0.  */
 
-  if (in != 0 && reload_inner_reg_of_subreg (in, inmode))
+  if (in != 0 && reload_inner_reg_of_subreg (in, inmode, 0))
     {
       enum reg_class in_class = class;
 
@@ -1144,7 +1146,7 @@ push_reload (in, out, inloc, outloc, class,
      However, we must reload the inner reg *as well as* the subreg in
      that case.  In this case, the inner reg is an in-out reload.  */
 
-  if (out != 0 && reload_inner_reg_of_subreg (out, outmode))
+  if (out != 0 && reload_inner_reg_of_subreg (out, outmode, 1))
     {
       /* This relies on the fact that emit_reload_insns outputs the
         instructions for output reloads of type RELOAD_OTHER in reverse
@@ -1722,7 +1724,8 @@ combine_reloads ()
                && ! (GET_CODE (rld[i].in) == REG
                      && reg_overlap_mentioned_for_reload_p (rld[i].in,
                                                             rld[output_reload].out))))
-       && ! reload_inner_reg_of_subreg (rld[i].in, rld[i].inmode)
+       && ! reload_inner_reg_of_subreg (rld[i].in, rld[i].inmode,
+                                        rld[i].when_needed != RELOAD_FOR_INPUT)
        && (reg_class_size[(int) rld[i].class]
            || SMALL_REGISTER_CLASSES)
        /* We will allow making things slightly worse by combining an