forked from OSchip/llvm-project
ARM: don't expand atomicrmw inline on Cortex-M0
There's a barrier instruction so that should still be used, but most actual atomic operations are going to need a platform decision on the correct behaviour (either nop if single-threaded or OS-support otherwise). rdar://problem/15287210 llvm-svn: 193399
This commit is contained in:
parent
a564d329c2
commit
c7ea8048e7
|
@ -753,12 +753,10 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
|
|||
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand);
|
||||
// ARMv6 Thumb1 (except for CPUs that support dmb / dsb) and earlier use
|
||||
// the default expansion.
|
||||
// FIXME: This should be checking for v6k, not just v6.
|
||||
if (Subtarget->hasDataBarrier() ||
|
||||
(Subtarget->hasV6Ops() && !Subtarget->isThumb())) {
|
||||
// membarrier needs custom lowering; the rest are legal and handled
|
||||
// normally.
|
||||
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Custom);
|
||||
if (Subtarget->hasAnyDataBarrier() && !Subtarget->isThumb1Only()) {
|
||||
// ATOMIC_FENCE needs custom lowering; the other 32-bit ones are legal and
|
||||
// handled normally.
|
||||
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Custom);
|
||||
// Custom lowering for 64-bit ops
|
||||
setOperationAction(ISD::ATOMIC_LOAD_ADD, MVT::i64, Custom);
|
||||
setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i64, Custom);
|
||||
|
@ -778,10 +776,13 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
|
|||
setInsertFencesForAtomic(true);
|
||||
}
|
||||
setOperationAction(ISD::ATOMIC_LOAD, MVT::i64, Custom);
|
||||
//setOperationAction(ISD::ATOMIC_STORE, MVT::i64, Custom);
|
||||
} else {
|
||||
// If there's anything we can use as a barrier, go through custom lowering
|
||||
// for ATOMIC_FENCE.
|
||||
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other,
|
||||
Subtarget->hasAnyDataBarrier() ? Custom : Expand);
|
||||
|
||||
// Set them all for expansion, which will force libcalls.
|
||||
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Expand);
|
||||
setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i32, Expand);
|
||||
setOperationAction(ISD::ATOMIC_SWAP, MVT::i32, Expand);
|
||||
setOperationAction(ISD::ATOMIC_LOAD_ADD, MVT::i32, Expand);
|
||||
|
@ -2681,7 +2682,7 @@ static SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG,
|
|||
// Thumb1 and pre-v6 ARM mode use a libcall instead and should never get
|
||||
// here.
|
||||
assert(Subtarget->hasV6Ops() && !Subtarget->isThumb() &&
|
||||
"Unexpected ISD::MEMBARRIER encountered. Should be libcall!");
|
||||
"Unexpected ISD::ATOMIC_FENCE encountered. Should be libcall!");
|
||||
return DAG.getNode(ARMISD::MEMBARRIER_MCR, dl, MVT::Other, Op.getOperand(0),
|
||||
DAG.getConstant(0, MVT::i32));
|
||||
}
|
||||
|
|
|
@ -263,6 +263,9 @@ public:
|
|||
bool hasDivideInARMMode() const { return HasHardwareDivideInARM; }
|
||||
bool hasT2ExtractPack() const { return HasT2ExtractPack; }
|
||||
bool hasDataBarrier() const { return HasDataBarrier; }
|
||||
bool hasAnyDataBarrier() const {
|
||||
return HasDataBarrier || (hasV6Ops() && !isThumb());
|
||||
}
|
||||
bool useMulOps() const { return UseMulOps; }
|
||||
bool useFPVMLx() const { return !SlowFPVMLx; }
|
||||
bool hasVMLxForwarding() const { return HasVMLxForwarding; }
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
; RUN: llc < %s -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv6-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-T1
|
||||
; RUN: llc < %s -mtriple=thumbv6-apple-ios -verify-machineinstrs -mcpu=cortex-m0 | FileCheck %s --check-prefix=CHECK-T1
|
||||
|
||||
define void @func(i32 %argc, i8** %argv) nounwind {
|
||||
entry:
|
||||
|
|
Loading…
Reference in New Issue