Skip to content

Commit

Permalink
[NVPTX] Add builtin for 'exit' handling (#79777)
Browse files Browse the repository at this point in the history
Summary:
The PTX ISA has always supported the 'exit' instruction to terminate
individual threads. This patch adds a builtin to handle it. See the PTX
documentation for further details.

https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#control-flow-instructions-exit
  • Loading branch information
jhuber6 committed Jan 29, 2024
1 parent 5f12cc9 commit ea80140
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/include/clang/Basic/BuiltinsNVPTX.def
Expand Up @@ -157,6 +157,7 @@ BUILTIN(__nvvm_read_ptx_sreg_pm3, "i", "n")
// MISC

BUILTIN(__nvvm_prmt, "UiUiUiUi", "")
BUILTIN(__nvvm_exit, "v", "r")
TARGET_BUILTIN(__nvvm_nanosleep, "vi", "n", AND(SM_70, PTX63))

// Min Max
Expand Down
7 changes: 7 additions & 0 deletions clang/test/CodeGen/builtins-nvptx.c
Expand Up @@ -173,6 +173,13 @@ __device__ void activemask() {

}

__device__ void exit() {

// CHECK: call void @llvm.nvvm.exit()

__nvvm_exit();

}

// NVVM intrinsics

Expand Down
4 changes: 4 additions & 0 deletions llvm/include/llvm/IR/IntrinsicsNVVM.td
Expand Up @@ -4813,4 +4813,8 @@ def int_nvvm_setmaxnreg_dec_sync_aligned_u32
[IntrConvergent, IntrNoMem, IntrHasSideEffects, ImmArg<ArgIndex<0>>],
"llvm.nvvm.setmaxnreg.dec.sync.aligned.u32">;

// Exit
def int_nvvm_exit : ClangBuiltin<"__nvvm_exit">,
Intrinsic<[], [], [IntrConvergent, IntrInaccessibleMemOnly, IntrNoReturn]>;

} // let TargetPrefix = "nvvm"
3 changes: 3 additions & 0 deletions llvm/lib/Target/NVPTX/NVPTXIntrinsics.td
Expand Up @@ -6844,4 +6844,7 @@ multiclass SET_MAXNREG<string Action, Intrinsic Intr> {

defm INT_SET_MAXNREG_INC : SET_MAXNREG<"inc", int_nvvm_setmaxnreg_inc_sync_aligned_u32>;
defm INT_SET_MAXNREG_DEC : SET_MAXNREG<"dec", int_nvvm_setmaxnreg_dec_sync_aligned_u32>;

} // isConvergent

def INT_EXIT : NVPTXInst<(outs), (ins), "exit;", [(int_nvvm_exit)]>;
8 changes: 8 additions & 0 deletions llvm/test/CodeGen/NVPTX/intrinsics.ll
Expand Up @@ -133,6 +133,13 @@ define i64 @test_clock64() {
ret i64 %ret
}

; CHECK-LABEL: test_exit
define void @test_exit() {
; CHECK: exit;
call void @llvm.nvvm.exit()
ret void
}

declare float @llvm.fabs.f32(float)
declare double @llvm.fabs.f64(double)
declare float @llvm.nvvm.sqrt.f(float)
Expand All @@ -146,3 +153,4 @@ declare i64 @llvm.ctpop.i64(i64)
declare i32 @llvm.nvvm.read.ptx.sreg.tid.x()
declare i32 @llvm.nvvm.read.ptx.sreg.clock()
declare i64 @llvm.nvvm.read.ptx.sreg.clock64()
declare void @llvm.nvvm.exit()

0 comments on commit ea80140

Please sign in to comment.