OSDN Git Service

* expr.c (reload.h): Now included.
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Apr 2000 22:13:59 +0000 (22:13 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Apr 2000 22:13:59 +0000 (22:13 +0000)
(emit_block_move): Set volatile_ok when checking for movstr.
(emit_move_1): Check for replacements in addresses in multi-word case.
* Makefile.in (expr.o): Now includes reload.h.

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

gcc/ChangeLog
gcc/Makefile.in
gcc/expr.c

index 8372339..6c8cfb4 100644 (file)
@@ -1,5 +1,10 @@
 Fri Apr 14 18:07:30 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * expr.c (reload.h): Now included.
+       (emit_block_move): Set volatile_ok when checking for movstr.
+       (emit_move_1): Check for replacements in addresses in multi-word case.
+       * Makefile.in (expr.o): Now includes reload.h.
+
        * flow.c (count_basic_blocks): Remove unused var PREV_CALL.
        Never have a LIBCALL end a basic block.
        (find_basic_blocks_1): Likewise.
index dbc558f..74e5485 100644 (file)
@@ -1533,7 +1533,7 @@ except.o : except.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
 expr.o : expr.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h function.h \
    $(REGS_H) insn-flags.h insn-codes.h $(EXPR_H) insn-config.h $(RECOG_H) \
    output.h typeclass.h hard-reg-set.h toplev.h hard-reg-set.h except.h \
-   $(GGC_H) intl.h
+   reload.h $(GGC_H) intl.h
 builtins.o : builtins.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \
    function.h $(REGS_H) insn-flags.h insn-codes.h $(EXPR_H) insn-config.h \
    $(RECOG_H) output.h typeclass.h hard-reg-set.h toplev.h hard-reg-set.h \
index 98a2628..aed8233 100644 (file)
@@ -37,6 +37,7 @@ Boston, MA 02111-1307, USA.  */
 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
 #include "expr.h"
 #include "recog.h"
+#include "reload.h"
 #include "output.h"
 #include "typeclass.h"
 #include "defaults.h"
@@ -1626,6 +1627,9 @@ emit_block_move (x, y, size, align)
       rtx opalign = GEN_INT (align / BITS_PER_UNIT);
       enum machine_mode mode;
 
+      /* Since this is a move insn, we don't care about volatility.  */
+      volatile_ok = 1;
+
       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
           mode = GET_MODE_WIDER_MODE (mode))
        {
@@ -1661,6 +1665,7 @@ emit_block_move (x, y, size, align)
              if (pat)
                {
                  emit_insn (pat);
+                 volatile_ok = 0;
                  return 0;
                }
              else
@@ -1668,6 +1673,8 @@ emit_block_move (x, y, size, align)
            }
        }
 
+      volatile_ok = 0;
+
       /* X, Y, or SIZE may have been passed through protect_from_queue.
 
         It is unsafe to save the value generated by protect_from_queue
@@ -2720,7 +2727,7 @@ emit_move_insn_1 (x, y)
   else if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
     {
       rtx last_insn = 0;
-      rtx seq;
+      rtx seq, inner;
       int need_clobber;
       
 #ifdef PUSH_ROUNDING
@@ -2734,6 +2741,29 @@ emit_move_insn_1 (x, y)
        }
 #endif
                             
+      /* If we are in reload, see if either operand is a MEM whose address
+        is scheduled for replacement.  */
+      if (reload_in_progress && GET_CODE (x) == MEM
+         && (inner = find_replacement (&XEXP (x, 0))) != XEXP (x, 0))
+       {
+         rtx new = gen_rtx_MEM (GET_MODE (x), inner);
+
+         RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
+         MEM_COPY_ATTRIBUTES (new, x);
+         MEM_ALIAS_SET (new) = MEM_ALIAS_SET (x);
+         x = new;
+       }
+      if (reload_in_progress && GET_CODE (y) == MEM
+         && (inner = find_replacement (&XEXP (y, 0))) != XEXP (y, 0))
+       {
+         rtx new = gen_rtx_MEM (GET_MODE (y), inner);
+
+         RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (y);
+         MEM_COPY_ATTRIBUTES (new, y);
+         MEM_ALIAS_SET (new) = MEM_ALIAS_SET (y);
+         y = new;
+       }
+
       start_sequence ();
 
       need_clobber = 0;