reload1.c (choose_reload_regs): If output-reloading for a simple move insn...
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Wed, 24 Mar 1999 13:44:58 +0000 (13:44 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Wed, 24 Mar 1999 13:44:58 +0000 (13:44 +0000)
reload1.c (choose_reload_regs): If output-reloading for a
simple move insn, try to inherit an equivalence for the input.

From-SVN: r25946

gcc/ChangeLog
gcc/reload1.c

index fba63e32df85e41fcb06fe72806a8c845b29e8bb..1dd7d6347534e3d35e9e8984df509b0cf25a0bcd 100644 (file)
@@ -1,3 +1,8 @@
+Wed Mar 24 21:42:15 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       reload1.c (choose_reload_regs): If output-reloading for a
+       simple move insn, try to inherit an equivalence for the input.
+
 1999-02-24  Mike Stump  <mrs@wrs.com>
 
        * arm/aout.h (DBX_OUTPUT_MAIN_SOURCE_FILENAME): Fix quoting.
index 621594af60744cbc825c7595c25afa89b894fe8a..c3d4e132c692b0f835b71086eecabf8aed21b3e4 100644 (file)
@@ -5808,6 +5808,7 @@ choose_reload_regs (chain)
       for (j = 0; j < n_reloads; j++)
        {
          register int r = reload_order[j];
+         rtx search_equiv = NULL_RTX;
 
          /* Ignore reloads that got marked inoperative.  */
          if (reload_out[r] == 0 && reload_in[r] == 0
@@ -6037,9 +6038,23 @@ choose_reload_regs (chain)
                  || GET_CODE (reload_in[r]) == MEM)
              && (reload_nregs[r] == max_group_size
                  || ! reg_classes_intersect_p (reload_reg_class[r], group_class)))
+           search_equiv = reload_in[r];
+         /* If this is an output reload from a simple move insn, look
+            if an equivalence for the input is available.  */
+         else if (inheritance && reload_in[r] == 0 && reload_out[r] != 0)
+           {
+             rtx set = single_set (insn);
+
+             if (set
+                 && rtx_equal_p (reload_out[r], SET_DEST (set))
+                 && CONSTANT_P (SET_SRC (set)))
+               search_equiv = SET_SRC (set);
+           }
+
+         if (search_equiv)
            {
              register rtx equiv
-               = find_equiv_reg (reload_in[r], insn, reload_reg_class[r],
+               = find_equiv_reg (search_equiv, insn, reload_reg_class[r],
                                  -1, NULL_PTR, 0, reload_mode[r]);
              int regno;
 
@@ -6302,6 +6317,7 @@ choose_reload_regs (chain)
             pass just to remove such reloads, make another pass, since the
             removal of one reload might allow us to inherit another one.  */
          else if ((! reload_out[r] || reload_out_reg[r])
+                  && reload_in[r]
                   && remove_address_replacements (reload_in[r]) && pass)
            pass = 2;
        }