diff --git a/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td b/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td index cd17a9de541ad..f82013b63dc6a 100644 --- a/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td +++ b/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td @@ -3908,3 +3908,31 @@ def : Pat < (V2I32toI64 (INT_NVVM_PRMT (I64toI32H Int64Regs:$a), (i32 0), (i32 0x0123)), (INT_NVVM_PRMT (I64toI32L Int64Regs:$a), (i32 0), (i32 0x0123)))>; + + +//////////////////////////////////////////////////////////////////////////////// +// PTX Fence instructions +//////////////////////////////////////////////////////////////////////////////// + +def atomic_thread_fence_seq_cst_sys : + NVPTXInst<(outs), (ins), "fence.sc.sys;", []>, + Requires<[hasPTX<60>, hasSM<70>]>; +def atomic_thread_fence_acq_rel_sys : + NVPTXInst<(outs), (ins), "fence.acq_rel.sys;", []>, + Requires<[hasPTX<60>, hasSM<70>]>; + +def : Pat<(atomic_fence (i64 4), (i64 1)), (atomic_thread_fence_acq_rel_sys)>, // acquire(4) sys(1) + Requires<[hasPTX<60>, hasSM<70>]>; +def : Pat<(atomic_fence (i64 5), (i64 1)), (atomic_thread_fence_acq_rel_sys)>, // release(5) sys(1) + Requires<[hasPTX<60>, hasSM<70>]>; +def : Pat<(atomic_fence (i64 6), (i64 1)), (atomic_thread_fence_acq_rel_sys)>, // acq_rel(6) sys(1) + Requires<[hasPTX<60>, hasSM<70>]>; +def : Pat<(atomic_fence (i64 7), (i64 1)), (atomic_thread_fence_seq_cst_sys)>, // seq_cst(7) sys(1) + Requires<[hasPTX<60>, hasSM<70>]>; + + +// If PTX<60 or SM<70, we fall back to MEMBAR: +def : Pat<(atomic_fence (i64 4), (i64 1)), (INT_MEMBAR_SYS)>; // acquire(4) sys(1) +def : Pat<(atomic_fence (i64 5), (i64 1)), (INT_MEMBAR_SYS)>; // release(5) sys(1) +def : Pat<(atomic_fence (i64 6), (i64 1)), (INT_MEMBAR_SYS)>; // acq_rel(6) sys(1) +def : Pat<(atomic_fence (i64 7), (i64 1)), (INT_MEMBAR_SYS)>; // seq_cst(7) sys(1) diff --git a/llvm/test/CodeGen/NVPTX/fence.ll b/llvm/test/CodeGen/NVPTX/fence.ll new file mode 100644 index 0000000000000..d3aace95e9665 --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/fence.ll @@ -0,0 +1,36 @@ +; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s --check-prefix=SM60 +; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_20 | %ptxas-verify %} +; RUN: llc < %s -march=nvptx64 -mcpu=sm_70 -mattr=+ptx60 | FileCheck %s --check-prefix=SM70 +; RUN: %if ptxas-12.2 %{ llc < %s -march=nvptx64 -mcpu=sm_70 -mattr=+ptx60 | %ptxas-verify -arch=sm_70 %} + +; CHECK-LABEL: fence_sc_sys +define void @fence_sc_sys() local_unnamed_addr { + ; SM60: membar.sys + ; SM70: fence.sc.sys + fence seq_cst + ret void +} + +; CHECK-LABEL: fence_acq_rel_sys +define void @fence_acq_rel_sys() local_unnamed_addr { + ; SM60: membar.sys + ; SM70: fence.acq_rel.sys + fence acq_rel + ret void +} + +; CHECK-LABEL: fence_release_sys +define void @fence_release_sys() local_unnamed_addr { + ; SM60: membar.sys + ; SM70: fence.acq_rel.sys + fence release + ret void +} + +; CHECK-LABEL: fence_acquire_sys +define void @fence_acquire_sys() local_unnamed_addr { + ; SM60: membar.sys + ; SM70: fence.acq_rel.sys + fence acquire + ret void +} \ No newline at end of file