88 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 52; RUN: opt -S -passes=function-attrs < %s | FileCheck --check-prefixes=COMMON,FNATTRS %s3; RUN: opt -S -passes=attributor-light < %s | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s4 5; Make sure norecurse is inferred on the calling functions6 7define internal void @sendmsg_is_norecurse() {8; FNATTRS: Function Attrs: mustprogress norecurse nounwind willreturn9; 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 void13;14; ATTRIBUTOR: Function Attrs: mustprogress norecurse nounwind willreturn15; 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 void19;20 call void @llvm.amdgcn.s.sendmsg(i32 1, i32 0)21 ret void22}23 24define internal void @sendmsghalt_is_norecurse() {25; COMMON: Function Attrs: norecurse nounwind26; 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 void30;31 call void @llvm.amdgcn.s.sendmsghalt(i32 1, i32 0)32 ret void33}34 35define internal i32 @sendmsg_rtn_is_norecurse() {36; FNATTRS: Function Attrs: mustprogress norecurse nounwind willreturn37; 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 willreturn43; 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 %res50}51 52define void @user() {53; FNATTRS: Function Attrs: norecurse nounwind54; FNATTRS-LABEL: define void @user(55; FNATTRS-SAME: ) #[[ATTR1]] {56; FNATTRS-NEXT: call void @sendmsg_is_norecurse()57; FNATTRS-NEXT: call void @sendmsghalt_is_norecurse()58; FNATTRS-NEXT: [[TMP1:%.*]] = call i32 @sendmsg_rtn_is_norecurse()59; FNATTRS-NEXT: ret void60;61; ATTRIBUTOR: Function Attrs: norecurse nounwind62; ATTRIBUTOR-LABEL: define void @user(63; ATTRIBUTOR-SAME: ) #[[ATTR1]] {64; ATTRIBUTOR-NEXT: call void @sendmsg_is_norecurse() #[[ATTR5:[0-9]+]]65; ATTRIBUTOR-NEXT: call void @sendmsghalt_is_norecurse() #[[ATTR6:[0-9]+]]66; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i32 @sendmsg_rtn_is_norecurse() #[[ATTR6]]67; ATTRIBUTOR-NEXT: ret void68;69 call void @sendmsg_is_norecurse()70 call void @sendmsghalt_is_norecurse()71 call i32 @sendmsg_rtn_is_norecurse()72 ret void73}74;.75; FNATTRS: attributes #[[ATTR0]] = { mustprogress norecurse nounwind willreturn }76; FNATTRS: attributes #[[ATTR1]] = { norecurse nounwind }77; FNATTRS: attributes #[[ATTR2:[0-9]+]] = { nocallback nounwind willreturn }78; FNATTRS: attributes #[[ATTR3:[0-9]+]] = { nocallback nounwind }79;.80; ATTRIBUTOR: attributes #[[ATTR0]] = { mustprogress norecurse nounwind willreturn }81; ATTRIBUTOR: attributes #[[ATTR1]] = { norecurse nounwind }82; ATTRIBUTOR: attributes #[[ATTR2:[0-9]+]] = { nocallback nounwind willreturn }83; ATTRIBUTOR: attributes #[[ATTR3:[0-9]+]] = { nocallback nounwind }84; ATTRIBUTOR: attributes #[[ATTR4]] = { willreturn }85; ATTRIBUTOR: attributes #[[ATTR5]] = { nounwind willreturn }86; ATTRIBUTOR: attributes #[[ATTR6]] = { nounwind }87;.88