diff options
| author | Tim Northover <tnorthover@apple.com> | 2018-12-17 15:05:32 +0000 | 
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2018-12-17 15:05:32 +0000 | 
| commit | ae3b66b7b06a1c649134079c7ea7f4eb36912157 (patch) | |
| tree | 914bf96965c9577f87e36e206955174e55f9f13a /llvm/lib/Target/ARM | |
| parent | 4c737110696521478ccd3e7dbb729ad9500fd6c5 (diff) | |
| download | bcm5719-llvm-ae3b66b7b06a1c649134079c7ea7f4eb36912157.tar.gz bcm5719-llvm-ae3b66b7b06a1c649134079c7ea7f4eb36912157.zip  | |
ARM: use acquire/release instruction variants when available.
These features (fairly) recently got split out into their own feature, so we
should make CodeGen use them when available. The main change here is that the
check used to be based on the triple, but now it's based on CPU features.
llvm-svn: 349355
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 14 | 
2 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 8289e956c6b..8d5cf0a2c1c 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -984,7 +984,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,      // On v8, we have particularly efficient implementations of atomic fences      // if they can be combined with nearby atomic loads and stores. -    if (!Subtarget->hasV8Ops() || getTargetMachine().getOptLevel() == 0) { +    if (!Subtarget->hasAcquireRelease() || +        getTargetMachine().getOptLevel() == 0) {        // Automatically insert fences (dmb ish) around ATOMIC_SWAP etc.        InsertFencesForAtomic = true;      } diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index 2617d755973..4130dbd8845 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -4451,13 +4451,13 @@ def : T2Pat<(atomic_store_32 t2addrmode_negimm8:$addr, GPR:$val),  def : T2Pat<(atomic_store_32 t2addrmode_so_reg:$addr, GPR:$val),              (t2STRs     GPR:$val, t2addrmode_so_reg:$addr)>; -let AddedComplexity = 8 in { -  def : T2Pat<(atomic_load_acquire_8 addr_offset_none:$addr),  (t2LDAB addr_offset_none:$addr)>; -  def : T2Pat<(atomic_load_acquire_16 addr_offset_none:$addr), (t2LDAH addr_offset_none:$addr)>; -  def : T2Pat<(atomic_load_acquire_32 addr_offset_none:$addr), (t2LDA  addr_offset_none:$addr)>; -  def : T2Pat<(atomic_store_release_8 addr_offset_none:$addr, GPR:$val),  (t2STLB GPR:$val, addr_offset_none:$addr)>; -  def : T2Pat<(atomic_store_release_16 addr_offset_none:$addr, GPR:$val), (t2STLH GPR:$val, addr_offset_none:$addr)>; -  def : T2Pat<(atomic_store_release_32 addr_offset_none:$addr, GPR:$val), (t2STL  GPR:$val, addr_offset_none:$addr)>; +let AddedComplexity = 8, Predicates = [IsThumb, HasAcquireRelease, HasV7Clrex] in { +  def : Pat<(atomic_load_acquire_8 addr_offset_none:$addr),  (t2LDAB addr_offset_none:$addr)>; +  def : Pat<(atomic_load_acquire_16 addr_offset_none:$addr), (t2LDAH addr_offset_none:$addr)>; +  def : Pat<(atomic_load_acquire_32 addr_offset_none:$addr), (t2LDA  addr_offset_none:$addr)>; +  def : Pat<(atomic_store_release_8 addr_offset_none:$addr, GPR:$val),  (t2STLB GPR:$val, addr_offset_none:$addr)>; +  def : Pat<(atomic_store_release_16 addr_offset_none:$addr, GPR:$val), (t2STLH GPR:$val, addr_offset_none:$addr)>; +  def : Pat<(atomic_store_release_32 addr_offset_none:$addr, GPR:$val), (t2STL  GPR:$val, addr_offset_none:$addr)>;  }  | 

