diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 2 | ||||
-rw-r--r-- | gcc/expr.c | 5 | ||||
-rw-r--r-- | gcc/function.c | 6 |
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 @@ -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 |