aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2011-11-16 20:44:27 -0800
committerRichard Henderson <rth@gcc.gnu.org>2011-11-16 20:44:27 -0800
commit4eace304b85ebbc5d0dc97dfffc1cb39ec41195c (patch)
treebafca9114028fee3937d025053f4e61baa2858cb
parent00449933e6832a4a21de8b0f8dd2c8888c636222 (diff)
downloadgcc-4eace304b85ebbc5d0dc97dfffc1cb39ec41195c.zip
gcc-4eace304b85ebbc5d0dc97dfffc1cb39ec41195c.tar.gz
gcc-4eace304b85ebbc5d0dc97dfffc1cb39ec41195c.tar.bz2
Copy ALIAS_SET_MEMORY_BARRIER when creating a new MEM for atomic ops.
* config/alpha/alpha.c (alpha_split_compare_and_swap_12): Copy ALIAS_SET_MEMORY_BARRIER when creating a new memory. (alpha_split_atomic_exchange_12): Likewise. * config/rs6000/rs6000.c (rs6000_adjust_atomic_subword): Likewise. From-SVN: r181436
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/alpha/alpha.c4
-rw-r--r--gcc/config/rs6000/rs6000.c12
3 files changed, 18 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7b3bca0..1d73414 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-11-16 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (alpha_split_compare_and_swap_12): Copy
+ ALIAS_SET_MEMORY_BARRIER when creating a new memory.
+ (alpha_split_atomic_exchange_12): Likewise.
+ * config/rs6000/rs6000.c (rs6000_adjust_atomic_subword): Likewise.
+
2011-11-16 Joseph Myers <joseph@codesourcery.com>
* config/i386/i386elf.h (PREFERRED_DEBUGGING_TYPE): Remove.
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 78717f9..e970227 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -4444,6 +4444,8 @@ alpha_split_compare_and_swap_12 (rtx operands[])
mem = gen_rtx_MEM (DImode, align);
MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (orig_mem);
+ if (MEM_ALIAS_SET (orig_mem) == ALIAS_SET_MEMORY_BARRIER)
+ set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
alpha_pre_atomic_barrier (mod_s);
@@ -4583,6 +4585,8 @@ alpha_split_atomic_exchange_12 (rtx operands[])
mem = gen_rtx_MEM (DImode, align);
MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (orig_mem);
+ if (MEM_ALIAS_SET (orig_mem) == ALIAS_SET_MEMORY_BARRIER)
+ set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
alpha_pre_atomic_barrier (model);
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 539a70a..89c2ea0 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -17244,16 +17244,16 @@ rs6000_post_atomic_barrier (enum memmodel model)
which to shift and mask. */
static rtx
-rs6000_adjust_atomic_subword (rtx mem, rtx *pshift, rtx *pmask)
+rs6000_adjust_atomic_subword (rtx orig_mem, rtx *pshift, rtx *pmask)
{
- rtx addr, align, shift, mask;
+ rtx addr, align, shift, mask, mem;
HOST_WIDE_INT shift_mask;
- enum machine_mode mode = GET_MODE (mem);
+ enum machine_mode mode = GET_MODE (orig_mem);
/* For smaller modes, we have to implement this via SImode. */
shift_mask = (mode == QImode ? 0x18 : 0x10);
- addr = XEXP (mem, 0);
+ addr = XEXP (orig_mem, 0);
addr = force_reg (GET_MODE (addr), addr);
/* Aligned memory containing subword. Generate a new memory. We
@@ -17262,7 +17262,9 @@ rs6000_adjust_atomic_subword (rtx mem, rtx *pshift, rtx *pmask)
align = expand_simple_binop (Pmode, AND, addr, GEN_INT (-4),
NULL_RTX, 1, OPTAB_LIB_WIDEN);
mem = gen_rtx_MEM (SImode, align);
- MEM_VOLATILE_P (mem) = 1;
+ MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (orig_mem);
+ if (MEM_ALIAS_SET (orig_mem) == ALIAS_SET_MEMORY_BARRIER)
+ set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
/* Shift amount for subword relative to aligned word. */
shift = gen_reg_rtx (SImode);