diff --git a/llvm/include/llvm/CodeGen/MachineMemOperand.h b/llvm/include/llvm/CodeGen/MachineMemOperand.h --- a/llvm/include/llvm/CodeGen/MachineMemOperand.h +++ b/llvm/include/llvm/CodeGen/MachineMemOperand.h @@ -282,17 +282,7 @@ /// success and failure orderings for an atomic operation. (For operations /// other than cmpxchg, this is equivalent to getSuccessOrdering().) AtomicOrdering getMergedOrdering() const { - AtomicOrdering Ordering = getSuccessOrdering(); - AtomicOrdering FailureOrdering = getFailureOrdering(); - if (FailureOrdering == AtomicOrdering::SequentiallyConsistent) - return AtomicOrdering::SequentiallyConsistent; - if (FailureOrdering == AtomicOrdering::Acquire) { - if (Ordering == AtomicOrdering::Monotonic) - return AtomicOrdering::Acquire; - if (Ordering == AtomicOrdering::Release) - return AtomicOrdering::AcquireRelease; - } - return Ordering; + return getMergedAtomicOrdering(getSuccessOrdering(), getFailureOrdering()); } bool isLoad() const { return FlagVals & MOLoad; } diff --git a/llvm/include/llvm/Support/AtomicOrdering.h b/llvm/include/llvm/Support/AtomicOrdering.h --- a/llvm/include/llvm/Support/AtomicOrdering.h +++ b/llvm/include/llvm/Support/AtomicOrdering.h @@ -133,6 +133,16 @@ return isAtLeastOrStrongerThan(AO, AtomicOrdering::Release); } +/// Return a single atomic ordering that is at least as strong as both the \p A0 +/// and \p Other orderings for an atomic operation. +inline AtomicOrdering getMergedAtomicOrdering(AtomicOrdering AO, + AtomicOrdering Other) { + if (((AO == AtomicOrdering::Acquire) && (Other == AtomicOrdering::Release)) || + ((AO == AtomicOrdering::Release) && (Other == AtomicOrdering::Acquire))) + return AtomicOrdering::AcquireRelease; + return isStrongerThan(AO, Other) ? AO : Other; +} + inline AtomicOrderingCABI toCABI(AtomicOrdering AO) { static const AtomicOrderingCABI lookup[8] = { /* NotAtomic */ AtomicOrderingCABI::relaxed, diff --git a/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp b/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp --- a/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp +++ b/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp @@ -126,8 +126,7 @@ (OrderingAddrSpace & SIAtomicAddrSpace::ATOMIC) != SIAtomicAddrSpace::NONE && (InstrAddrSpace & SIAtomicAddrSpace::ATOMIC) != - SIAtomicAddrSpace::NONE && - !isStrongerThan(FailureOrdering, Ordering)); + SIAtomicAddrSpace::NONE); // There is also no cross address space ordering if the ordering // address space is the same as the instruction address space and @@ -651,14 +650,11 @@ } SSID = IsSyncScopeInclusion.getValue() ? SSID : MMO->getSyncScopeID(); - Ordering = isStrongerThan(Ordering, OpOrdering) - ? Ordering - : MMO->getSuccessOrdering(); + Ordering = getMergedAtomicOrdering(Ordering, OpOrdering); assert(MMO->getFailureOrdering() != AtomicOrdering::Release && MMO->getFailureOrdering() != AtomicOrdering::AcquireRelease); FailureOrdering = - isStrongerThan(FailureOrdering, MMO->getFailureOrdering()) ? - FailureOrdering : MMO->getFailureOrdering(); + getMergedAtomicOrdering(FailureOrdering, MMO->getFailureOrdering()); } }