Skip to content

Commit ae1bbdb

Browse files
committed
AMDGPU: Mark sendmsg intrinsics as nocallback
These can be nocallback, but no nosync. These return in the current thread immediately, but may send a signal to the host, which could trigger the async execution of code in the module. Fixes #124802
1 parent 9d7177a commit ae1bbdb

File tree

2 files changed

+89
-3
lines changed

2 files changed

+89
-3
lines changed

llvm/include/llvm/IR/IntrinsicsAMDGPU.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,16 +237,16 @@ def int_amdgcn_reloc_constant : DefaultAttrsIntrinsic<
237237
// the second one is copied to m0
238238
def int_amdgcn_s_sendmsg : ClangBuiltin<"__builtin_amdgcn_s_sendmsg">,
239239
Intrinsic <[], [llvm_i32_ty, llvm_i32_ty],
240-
[ImmArg<ArgIndex<0>>, IntrNoMem, IntrHasSideEffects, IntrWillReturn]>;
240+
[ImmArg<ArgIndex<0>>, IntrNoMem, IntrHasSideEffects, IntrWillReturn, IntrNoCallback]>;
241241
def int_amdgcn_s_sendmsghalt : ClangBuiltin<"__builtin_amdgcn_s_sendmsghalt">,
242242
Intrinsic <[], [llvm_i32_ty, llvm_i32_ty],
243-
[ImmArg<ArgIndex<0>>, IntrNoMem, IntrHasSideEffects]>;
243+
[ImmArg<ArgIndex<0>>, IntrNoMem, IntrHasSideEffects, IntrNoCallback]>;
244244

245245

246246
// gfx11 intrinsic
247247
// The first parameter is s_sendmsg immediate (i16). Return type is i32 or i64.
248248
def int_amdgcn_s_sendmsg_rtn : Intrinsic <[llvm_anyint_ty], [llvm_i32_ty],
249-
[ImmArg<ArgIndex<0>>, IntrNoMem, IntrHasSideEffects, IntrWillReturn]>;
249+
[ImmArg<ArgIndex<0>>, IntrNoMem, IntrHasSideEffects, IntrWillReturn, IntrNoRecurse]>;
250250

251251
// Vanilla workgroup sync-barrier
252252
def int_amdgcn_s_barrier : ClangBuiltin<"__builtin_amdgcn_s_barrier">,
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 5
2+
; RUN: opt -S -passes=function-attrs < %s | FileCheck --check-prefixes=COMMON,FNATTRS %s
3+
; RUN: opt -S -passes=attributor-light < %s | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s
4+
5+
define internal void @sendmsg_is_norecurse() {
6+
; FNATTRS: Function Attrs: mustprogress norecurse nounwind willreturn
7+
; FNATTRS-LABEL: define internal void @sendmsg_is_norecurse(
8+
; FNATTRS-SAME: ) #[[ATTR0:[0-9]+]] {
9+
; FNATTRS-NEXT: call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0)
10+
; FNATTRS-NEXT: ret void
11+
;
12+
; ATTRIBUTOR: Function Attrs: mustprogress norecurse nounwind willreturn
13+
; ATTRIBUTOR-LABEL: define internal void @sendmsg_is_norecurse(
14+
; ATTRIBUTOR-SAME: ) #[[ATTR0:[0-9]+]] {
15+
; ATTRIBUTOR-NEXT: call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0) #[[ATTR7:[0-9]+]]
16+
; ATTRIBUTOR-NEXT: ret void
17+
;
18+
call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0)
19+
ret void
20+
}
21+
22+
define internal void @sendmsghalt_is_norecurse() {
23+
; COMMON: Function Attrs: norecurse nounwind
24+
; COMMON-LABEL: define internal void @sendmsghalt_is_norecurse(
25+
; COMMON-SAME: ) #[[ATTR1:[0-9]+]] {
26+
; COMMON-NEXT: call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0)
27+
; COMMON-NEXT: ret void
28+
;
29+
call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0)
30+
ret void
31+
}
32+
33+
define internal i32 @sendmsg_rtn_is_norecurse() {
34+
; FNATTRS: Function Attrs: mustprogress norecurse nounwind willreturn
35+
; FNATTRS-LABEL: define internal i32 @sendmsg_rtn_is_norecurse(
36+
; FNATTRS-SAME: ) #[[ATTR0]] {
37+
; FNATTRS-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 1)
38+
; FNATTRS-NEXT: ret i32 [[RES]]
39+
;
40+
; ATTRIBUTOR: Function Attrs: mustprogress nounwind willreturn
41+
; ATTRIBUTOR-LABEL: define internal i32 @sendmsg_rtn_is_norecurse(
42+
; ATTRIBUTOR-SAME: ) #[[ATTR2:[0-9]+]] {
43+
; ATTRIBUTOR-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 1) #[[ATTR7]]
44+
; ATTRIBUTOR-NEXT: ret i32 [[RES]]
45+
;
46+
%res = call i32 @llvm.amdgcn.s.sendmsg.rtn(i32 1)
47+
ret i32 %res
48+
}
49+
50+
define void @user() {
51+
; FNATTRS-LABEL: define void @user() {
52+
; FNATTRS-NEXT: call void @sendmsg_is_norecurse()
53+
; FNATTRS-NEXT: call void @sendmsghalt_is_norecurse()
54+
; FNATTRS-NEXT: call void @sendmsg_rtn_is_norecurse()
55+
; FNATTRS-NEXT: ret void
56+
;
57+
; ATTRIBUTOR: Function Attrs: nounwind
58+
; ATTRIBUTOR-LABEL: define void @user(
59+
; ATTRIBUTOR-SAME: ) #[[ATTR3:[0-9]+]] {
60+
; ATTRIBUTOR-NEXT: call void @sendmsg_is_norecurse() #[[ATTR8:[0-9]+]]
61+
; ATTRIBUTOR-NEXT: call void @sendmsghalt_is_norecurse() #[[ATTR3]]
62+
; ATTRIBUTOR-NEXT: call void @sendmsg_rtn_is_norecurse() #[[ATTR3]]
63+
; ATTRIBUTOR-NEXT: ret void
64+
;
65+
call void @sendmsg_is_norecurse()
66+
call void @sendmsghalt_is_norecurse()
67+
call void @sendmsg_rtn_is_norecurse()
68+
ret void
69+
}
70+
;.
71+
; FNATTRS: attributes #[[ATTR0]] = { mustprogress norecurse nounwind willreturn }
72+
; FNATTRS: attributes #[[ATTR1]] = { norecurse nounwind }
73+
; FNATTRS: attributes #[[ATTR2:[0-9]+]] = { nocallback nounwind willreturn }
74+
; FNATTRS: attributes #[[ATTR3:[0-9]+]] = { norecurse nounwind willreturn }
75+
; FNATTRS: attributes #[[ATTR4:[0-9]+]] = { nocallback nounwind }
76+
;.
77+
; ATTRIBUTOR: attributes #[[ATTR0]] = { mustprogress norecurse nounwind willreturn }
78+
; ATTRIBUTOR: attributes #[[ATTR1]] = { norecurse nounwind }
79+
; ATTRIBUTOR: attributes #[[ATTR2]] = { mustprogress nounwind willreturn }
80+
; ATTRIBUTOR: attributes #[[ATTR3]] = { nounwind }
81+
; ATTRIBUTOR: attributes #[[ATTR4:[0-9]+]] = { nocallback nounwind willreturn }
82+
; ATTRIBUTOR: attributes #[[ATTR5:[0-9]+]] = { norecurse nounwind willreturn }
83+
; ATTRIBUTOR: attributes #[[ATTR6:[0-9]+]] = { nocallback nounwind }
84+
; ATTRIBUTOR: attributes #[[ATTR7]] = { willreturn }
85+
; ATTRIBUTOR: attributes #[[ATTR8]] = { nounwind willreturn }
86+
;.

0 commit comments

Comments
 (0)