diff options
author | Tim Northover <tnorthover@apple.com> | 2013-07-03 09:20:36 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2013-07-03 09:20:36 +0000 |
commit | a10c01a6c62792be825c562314a646437b21bfec (patch) | |
tree | 63c3600a8c347945f32732f94407ed65a2734404 /lib/Target/ARM/ARMISelLowering.cpp | |
parent | b997b56383a99f739d7e2aa14e6945fea477e597 (diff) | |
download | external_llvm-a10c01a6c62792be825c562314a646437b21bfec.tar.gz external_llvm-a10c01a6c62792be825c562314a646437b21bfec.tar.bz2 external_llvm-a10c01a6c62792be825c562314a646437b21bfec.zip |
ARM: relax the atomic release barrier to "dmb ishst" on Swift
Swift cores implement store barriers that are stronger than the ARM
specification but weaker than general barriers. They are, in fact, just about
enough to provide the ordering needed for atomic operations with release
semantics.
This patch makes use of that quirk.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185527 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMISelLowering.cpp')
-rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index ff8571ba03..cc09754ef7 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -2557,8 +2557,18 @@ static SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG, DAG.getConstant(0, MVT::i32)); } + ConstantSDNode *OrdN = cast<ConstantSDNode>(Op.getOperand(1)); + AtomicOrdering Ord = static_cast<AtomicOrdering>(OrdN->getZExtValue()); + unsigned Domain = ARM_MB::ISH; + if (Subtarget->isSwift() && Ord == Release) { + // Swift happens to implement ISHST barriers in a way that's compatible with + // Release semantics but weaker than ISH so we'd be fools not to use + // it. Beware: other processors probably don't! + Domain = ARM_MB::ISHST; + } + return DAG.getNode(ARMISD::MEMBARRIER, dl, MVT::Other, Op.getOperand(0), - DAG.getConstant(ARM_MB::ISH, MVT::i32)); + DAG.getConstant(Domain, MVT::i32)); } static SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG, |