aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/emit-rtl.c2
-rw-r--r--gcc/expr.c5
-rw-r--r--gcc/function.c6
4 files changed, 17 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 86685c0..3d38c29 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-02-12 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * emit-rtl.c (set_mem_attributes_minus_bitpos): Don't kill
+ previous MEM_VOLATILE in REF.
+ * function.c (fixup_var_refs): Save volatile_ok and set to 1.
+ * expr.c (emit_block_move_via_movstr): Save and restore volatile_ok.
+
2004-02-12 Gunther Nikl <gni@gecko.de>
* config.gcc: Restore support for m68k-openbsd.
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 722d697..76f292c 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1479,7 +1479,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
front-end routine) and use it. */
alias = get_alias_set (t);
- MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type);
+ MEM_VOLATILE_P (ref) |= TYPE_VOLATILE (type);
MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type);
RTX_UNCHANGING_P (ref)
|= ((lang_hooks.honor_readonly
diff --git a/gcc/expr.c b/gcc/expr.c
index 7d6dd16..a6d222e 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -1417,6 +1417,7 @@ static bool
emit_block_move_via_movstr (rtx x, rtx y, rtx size, unsigned int align)
{
rtx opalign = GEN_INT (align / BITS_PER_UNIT);
+ int save_volatile_ok = volatile_ok;
enum machine_mode mode;
/* Since this is a move insn, we don't care about volatility. */
@@ -1466,7 +1467,7 @@ emit_block_move_via_movstr (rtx x, rtx y, rtx size, unsigned int align)
if (pat)
{
emit_insn (pat);
- volatile_ok = 0;
+ volatile_ok = save_volatile_ok;
return true;
}
else
@@ -1474,7 +1475,7 @@ emit_block_move_via_movstr (rtx x, rtx y, rtx size, unsigned int align)
}
}
- volatile_ok = 0;
+ volatile_ok = save_volatile_ok;
return false;
}
diff --git a/gcc/function.c b/gcc/function.c
index e2024f2..ca26cf8 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -1503,6 +1503,7 @@ fixup_var_refs (rtx var, enum machine_mode promoted_mode, int unsignedp,
rtx first_insn = get_insns ();
struct sequence_stack *stack = seq_stack;
tree rtl_exps = rtl_expr_chain;
+ int save_volatile_ok = volatile_ok;
/* If there's a hash table, it must record all uses of VAR. */
if (ht)
@@ -1514,6 +1515,9 @@ fixup_var_refs (rtx var, enum machine_mode promoted_mode, int unsignedp,
return;
}
+ /* Volatile is valid in MEMs because all we're doing in changing the
+ address inside. */
+ volatile_ok = 1;
fixup_var_refs_insns (first_insn, var, promoted_mode, unsignedp,
stack == 0, may_share);
@@ -1541,6 +1545,8 @@ fixup_var_refs (rtx var, enum machine_mode promoted_mode, int unsignedp,
end_sequence ();
}
}
+
+ volatile_ok = save_volatile_ok;
}
/* REPLACEMENTS is a pointer to a list of the struct fixup_replacement and X is