diff --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td index 80bc0e5986e51..1cc5b74a3cb67 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td @@ -1236,6 +1236,23 @@ def NVVM_FenceProxyAcquireOp : NVVM_Op<"fence.proxy.acquire">, let hasVerifier = 1; } +def NVVM_MembarOp : NVVM_Op<"memory.barrier">, + Arguments<(ins MemScopeKindAttr:$scope)> { + let summary = "Memory barrier operation"; + let description = [{ + `membar` operation guarantees that prior memory accesses requested by this + thread are performed at the specified `scope`, before later memory + operations requested by this thread following the membar instruction. + + [For more information, see PTX ISA](https://docs.nvidia.com/cuda/parallel-thread-execution/#parallel-synchronization-and-communication-instructions-membar) + }]; + + let assemblyFormat = "$scope attr-dict"; + let llvmBuilder = [{ + createIntrinsicCall(builder, getMembarIntrinsicID($scope), {}); + }]; +} + def NVVM_FenceProxyReleaseOp : NVVM_Op<"fence.proxy.release">, Arguments<(ins MemScopeKindAttr:$scope, DefaultValuedAttr + // CHECK: call void @llvm.nvvm.fence.sc.cluster() + nvvm.memory.barrier #nvvm.mem_scope + // CHECK: call void @llvm.nvvm.membar.gl() + nvvm.memory.barrier #nvvm.mem_scope + // CHECK: call void @llvm.nvvm.membar.sys() + nvvm.memory.barrier #nvvm.mem_scope + llvm.return +}