aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2000-04-14 22:13:59 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2000-04-14 18:13:59 -0400
commit3ef1eef42a55eb91fca935b621cc1d757b00d0d4 (patch)
treef817488f7da4ca53cfd69c1691ab84d67ca035ce /gcc/expr.c
parent314883b80a758453f7f705a0f6c8382509407ae0 (diff)
downloadgcc-3ef1eef42a55eb91fca935b621cc1d757b00d0d4.zip
gcc-3ef1eef42a55eb91fca935b621cc1d757b00d0d4.tar.gz
gcc-3ef1eef42a55eb91fca935b621cc1d757b00d0d4.tar.bz2
expr.c (reload.h): Now included.
* 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. From-SVN: r33155
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 98a2628..aed8233 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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;