Skip to content

Commit 6a59d60

Browse files
authored
AMDGPU: Mark sendmsg intrinsics as nocallback (#126782)
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 bfd3e25 commit 6a59d60

File tree

2 files changed

+88
-3
lines changed

2 files changed

+88
-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, IntrNoCallback]>;
250250

251251
// Vanilla workgroup sync-barrier
252252
def int_amdgcn_s_barrier : ClangBuiltin<"__builtin_amdgcn_s_barrier">,
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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+
; Make sure norecurse is inferred on the calling functions
6+
7+
define internal void @sendmsg_is_norecurse() {
8+
; FNATTRS: Function Attrs: mustprogress norecurse nounwind willreturn
9+
; FNATTRS-LABEL: define internal void @sendmsg_is_norecurse(
10+
; FNATTRS-SAME: ) #[[ATTR0:[0-9]+]] {
11+
; FNATTRS-NEXT: call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0)
12+
; FNATTRS-NEXT: ret void
13+
;
14+
; ATTRIBUTOR: Function Attrs: mustprogress norecurse nounwind willreturn
15+
; ATTRIBUTOR-LABEL: define internal void @sendmsg_is_norecurse(
16+
; ATTRIBUTOR-SAME: ) #[[ATTR0:[0-9]+]] {
17+
; ATTRIBUTOR-NEXT: call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0) #[[ATTR4:[0-9]+]]
18+
; ATTRIBUTOR-NEXT: ret void
19+
;
20+
call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0)
21+
ret void
22+
}
23+
24+
define internal void @sendmsghalt_is_norecurse() {
25+
; COMMON: Function Attrs: norecurse nounwind
26+
; COMMON-LABEL: define internal void @sendmsghalt_is_norecurse(
27+
; COMMON-SAME: ) #[[ATTR1:[0-9]+]] {
28+
; COMMON-NEXT: call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0)
29+
; COMMON-NEXT: ret void
30+
;
31+
call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0)
32+
ret void
33+
}
34+
35+
define internal i32 @sendmsg_rtn_is_norecurse() {
36+
; FNATTRS: Function Attrs: mustprogress norecurse nounwind willreturn
37+
; FNATTRS-LABEL: define internal i32 @sendmsg_rtn_is_norecurse(
38+
; FNATTRS-SAME: ) #[[ATTR0]] {
39+
; FNATTRS-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 1)
40+
; FNATTRS-NEXT: ret i32 [[RES]]
41+
;
42+
; ATTRIBUTOR: Function Attrs: mustprogress norecurse nounwind willreturn
43+
; ATTRIBUTOR-LABEL: define internal i32 @sendmsg_rtn_is_norecurse(
44+
; ATTRIBUTOR-SAME: ) #[[ATTR0]] {
45+
; ATTRIBUTOR-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 1) #[[ATTR4]]
46+
; ATTRIBUTOR-NEXT: ret i32 [[RES]]
47+
;
48+
%res = call i32 @llvm.amdgcn.s.sendmsg.rtn(i32 1)
49+
ret i32 %res
50+
}
51+
52+
define void @user() {
53+
; FNATTRS-LABEL: define void @user() {
54+
; FNATTRS-NEXT: call void @sendmsg_is_norecurse()
55+
; FNATTRS-NEXT: call void @sendmsghalt_is_norecurse()
56+
; FNATTRS-NEXT: call void @sendmsg_rtn_is_norecurse()
57+
; FNATTRS-NEXT: ret void
58+
;
59+
; ATTRIBUTOR: Function Attrs: norecurse nounwind
60+
; ATTRIBUTOR-LABEL: define void @user(
61+
; ATTRIBUTOR-SAME: ) #[[ATTR1]] {
62+
; ATTRIBUTOR-NEXT: call void @sendmsg_is_norecurse() #[[ATTR5:[0-9]+]]
63+
; ATTRIBUTOR-NEXT: call void @sendmsghalt_is_norecurse() #[[ATTR6:[0-9]+]]
64+
; ATTRIBUTOR-NEXT: call void @sendmsg_rtn_is_norecurse() #[[ATTR6]]
65+
; ATTRIBUTOR-NEXT: ret void
66+
;
67+
call void @sendmsg_is_norecurse()
68+
call void @sendmsghalt_is_norecurse()
69+
call void @sendmsg_rtn_is_norecurse()
70+
ret void
71+
}
72+
;.
73+
; FNATTRS: attributes #[[ATTR0]] = { mustprogress norecurse nounwind willreturn }
74+
; FNATTRS: attributes #[[ATTR1]] = { norecurse nounwind }
75+
; FNATTRS: attributes #[[ATTR2:[0-9]+]] = { nocallback nounwind willreturn }
76+
; FNATTRS: attributes #[[ATTR3:[0-9]+]] = { nocallback nounwind }
77+
;.
78+
; ATTRIBUTOR: attributes #[[ATTR0]] = { mustprogress norecurse nounwind willreturn }
79+
; ATTRIBUTOR: attributes #[[ATTR1]] = { norecurse nounwind }
80+
; ATTRIBUTOR: attributes #[[ATTR2:[0-9]+]] = { nocallback nounwind willreturn }
81+
; ATTRIBUTOR: attributes #[[ATTR3:[0-9]+]] = { nocallback nounwind }
82+
; ATTRIBUTOR: attributes #[[ATTR4]] = { willreturn }
83+
; ATTRIBUTOR: attributes #[[ATTR5]] = { nounwind willreturn }
84+
; ATTRIBUTOR: attributes #[[ATTR6]] = { nounwind }
85+
;.

0 commit comments

Comments
 (0)