From 4eace304b85ebbc5d0dc97dfffc1cb39ec41195c Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 16 Nov 2011 20:44:27 -0800 Subject: 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 --- gcc/ChangeLog | 7 +++++++ gcc/config/alpha/alpha.c | 4 ++++ gcc/config/rs6000/rs6000.c | 12 +++++++----- 3 files changed, 18 insertions(+), 5 deletions(-) (limited to 'gcc') 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 + + * 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 * 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); -- cgit v1.1