| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 5 | |
| ; RUN: opt -S -passes=function-attrs < %s | FileCheck --check-prefixes=COMMON,FNATTRS %s | |
| ; RUN: opt -S -passes=attributor-light < %s | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s | |
| ; Make sure norecurse is inferred on the calling functions | |
| define internal void @sendmsg_is_norecurse() { | |
| ; FNATTRS: Function Attrs: mustprogress nofree norecurse nounwind willreturn | |
| ; FNATTRS-LABEL: define internal void @sendmsg_is_norecurse( | |
| ; FNATTRS-SAME: ) #[[ATTR0:[0-9]+]] { | |
| ; FNATTRS-NEXT: call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0) | |
| ; FNATTRS-NEXT: ret void | |
| ; | |
| ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nounwind willreturn | |
| ; ATTRIBUTOR-LABEL: define internal void @sendmsg_is_norecurse( | |
| ; ATTRIBUTOR-SAME: ) #[[ATTR0:[0-9]+]] { | |
| ; ATTRIBUTOR-NEXT: call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0) #[[ATTR4:[0-9]+]] | |
| ; ATTRIBUTOR-NEXT: ret void | |
| ; | |
| call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0) | |
| ret void | |
| } | |
| define internal void @sendmsghalt_is_norecurse() { | |
| ; FNATTRS: Function Attrs: nofree norecurse nounwind | |
| ; FNATTRS-LABEL: define internal void @sendmsghalt_is_norecurse( | |
| ; FNATTRS-SAME: ) #[[ATTR1:[0-9]+]] { | |
| ; FNATTRS-NEXT: call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0) | |
| ; FNATTRS-NEXT: ret void | |
| ; | |
| ; ATTRIBUTOR: Function Attrs: nofree norecurse nounwind | |
| ; ATTRIBUTOR-LABEL: define internal void @sendmsghalt_is_norecurse( | |
| ; ATTRIBUTOR-SAME: ) #[[ATTR1:[0-9]+]] { | |
| ; ATTRIBUTOR-NEXT: call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0) #[[ATTR5:[0-9]+]] | |
| ; ATTRIBUTOR-NEXT: ret void | |
| ; | |
| call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0) | |
| ret void | |
| } | |
| define internal i32 @sendmsg_rtn_is_norecurse() { | |
| ; FNATTRS: Function Attrs: mustprogress nofree norecurse nounwind willreturn | |
| ; FNATTRS-LABEL: define internal i32 @sendmsg_rtn_is_norecurse( | |
| ; FNATTRS-SAME: ) #[[ATTR0]] { | |
| ; FNATTRS-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 1) | |
| ; FNATTRS-NEXT: ret i32 [[RES]] | |
| ; | |
| ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nounwind willreturn | |
| ; ATTRIBUTOR-LABEL: define internal i32 @sendmsg_rtn_is_norecurse( | |
| ; ATTRIBUTOR-SAME: ) #[[ATTR0]] { | |
| ; ATTRIBUTOR-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 1) #[[ATTR4]] | |
| ; ATTRIBUTOR-NEXT: ret i32 [[RES]] | |
| ; | |
| %res = call i32 @llvm.amdgcn.s.sendmsg.rtn(i32 1) | |
| ret i32 %res | |
| } | |
| define void @user() { | |
| ; FNATTRS: Function Attrs: nofree norecurse nounwind | |
| ; FNATTRS-LABEL: define void @user( | |
| ; FNATTRS-SAME: ) #[[ATTR1]] { | |
| ; FNATTRS-NEXT: call void @sendmsg_is_norecurse() | |
| ; FNATTRS-NEXT: call void @sendmsghalt_is_norecurse() | |
| ; FNATTRS-NEXT: [[TMP1:%.*]] = call i32 @sendmsg_rtn_is_norecurse() | |
| ; FNATTRS-NEXT: ret void | |
| ; | |
| ; ATTRIBUTOR: Function Attrs: nofree norecurse nounwind | |
| ; ATTRIBUTOR-LABEL: define void @user( | |
| ; ATTRIBUTOR-SAME: ) #[[ATTR1]] { | |
| ; ATTRIBUTOR-NEXT: call void @sendmsg_is_norecurse() #[[ATTR6:[0-9]+]] | |
| ; ATTRIBUTOR-NEXT: call void @sendmsghalt_is_norecurse() #[[ATTR7:[0-9]+]] | |
| ; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i32 @sendmsg_rtn_is_norecurse() #[[ATTR7]] | |
| ; ATTRIBUTOR-NEXT: ret void | |
| ; | |
| call void @sendmsg_is_norecurse() | |
| call void @sendmsghalt_is_norecurse() | |
| call i32 @sendmsg_rtn_is_norecurse() | |
| ret void | |
| } | |
| ;. | |
| ; FNATTRS: attributes #[[ATTR0]] = { mustprogress nofree norecurse nounwind willreturn } | |
| ; FNATTRS: attributes #[[ATTR1]] = { nofree norecurse nounwind } | |
| ; FNATTRS: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nounwind willreturn } | |
| ; FNATTRS: attributes #[[ATTR3:[0-9]+]] = { nocallback nofree nounwind } | |
| ;. | |
| ; ATTRIBUTOR: attributes #[[ATTR0]] = { mustprogress nofree norecurse nounwind willreturn } | |
| ; ATTRIBUTOR: attributes #[[ATTR1]] = { nofree norecurse nounwind } | |
| ; ATTRIBUTOR: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nounwind willreturn } | |
| ; ATTRIBUTOR: attributes #[[ATTR3:[0-9]+]] = { nocallback nofree nounwind } | |
| ; ATTRIBUTOR: attributes #[[ATTR4]] = { nofree willreturn } | |
| ; ATTRIBUTOR: attributes #[[ATTR5]] = { nofree } | |
| ; ATTRIBUTOR: attributes #[[ATTR6]] = { nofree nounwind willreturn } | |
| ; ATTRIBUTOR: attributes #[[ATTR7]] = { nofree nounwind } | |
| ;. | |
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | |
| ; COMMON: {{.*}} |