Skip to content

Commit ea80140

Browse files
authored
[NVPTX] Add builtin for 'exit' handling (#79777)
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
1 parent 5f12cc9 commit ea80140

File tree

5 files changed

+23
-0
lines changed

5 files changed

+23
-0
lines changed

clang/include/clang/Basic/BuiltinsNVPTX.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ BUILTIN(__nvvm_read_ptx_sreg_pm3, "i", "n")
157157
// MISC
158158

159159
BUILTIN(__nvvm_prmt, "UiUiUiUi", "")
160+
BUILTIN(__nvvm_exit, "v", "r")
160161
TARGET_BUILTIN(__nvvm_nanosleep, "vi", "n", AND(SM_70, PTX63))
161162

162163
// Min Max

clang/test/CodeGen/builtins-nvptx.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ __device__ void activemask() {
173173

174174
}
175175

176+
__device__ void exit() {
177+
178+
// CHECK: call void @llvm.nvvm.exit()
179+
180+
__nvvm_exit();
181+
182+
}
176183

177184
// NVVM intrinsics
178185

llvm/include/llvm/IR/IntrinsicsNVVM.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4813,4 +4813,8 @@ def int_nvvm_setmaxnreg_dec_sync_aligned_u32
48134813
[IntrConvergent, IntrNoMem, IntrHasSideEffects, ImmArg<ArgIndex<0>>],
48144814
"llvm.nvvm.setmaxnreg.dec.sync.aligned.u32">;
48154815

4816+
// Exit
4817+
def int_nvvm_exit : ClangBuiltin<"__nvvm_exit">,
4818+
Intrinsic<[], [], [IntrConvergent, IntrInaccessibleMemOnly, IntrNoReturn]>;
4819+
48164820
} // let TargetPrefix = "nvvm"

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6844,4 +6844,7 @@ multiclass SET_MAXNREG<string Action, Intrinsic Intr> {
68446844

68456845
defm INT_SET_MAXNREG_INC : SET_MAXNREG<"inc", int_nvvm_setmaxnreg_inc_sync_aligned_u32>;
68466846
defm INT_SET_MAXNREG_DEC : SET_MAXNREG<"dec", int_nvvm_setmaxnreg_dec_sync_aligned_u32>;
6847+
68476848
} // isConvergent
6849+
6850+
def INT_EXIT : NVPTXInst<(outs), (ins), "exit;", [(int_nvvm_exit)]>;

llvm/test/CodeGen/NVPTX/intrinsics.ll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,13 @@ define i64 @test_clock64() {
133133
ret i64 %ret
134134
}
135135

136+
; CHECK-LABEL: test_exit
137+
define void @test_exit() {
138+
; CHECK: exit;
139+
call void @llvm.nvvm.exit()
140+
ret void
141+
}
142+
136143
declare float @llvm.fabs.f32(float)
137144
declare double @llvm.fabs.f64(double)
138145
declare float @llvm.nvvm.sqrt.f(float)
@@ -146,3 +153,4 @@ declare i64 @llvm.ctpop.i64(i64)
146153
declare i32 @llvm.nvvm.read.ptx.sreg.tid.x()
147154
declare i32 @llvm.nvvm.read.ptx.sreg.clock()
148155
declare i64 @llvm.nvvm.read.ptx.sreg.clock64()
156+
declare void @llvm.nvvm.exit()

0 commit comments

Comments
 (0)