1; RUN: opt < %s -basic-aa -function-attrs -rpo-function-attrs -S | FileCheck %s 2; RUN: opt < %s -aa-pipeline=basic-aa -passes='cgscc(function-attrs),rpo-function-attrs' -S | FileCheck %s 3 4; CHECK: Function Attrs 5; CHECK-SAME: norecurse nounwind readnone 6; CHECK-NEXT: define i32 @leaf() 7define i32 @leaf() { 8 ret i32 1 9} 10 11; CHECK: Function Attrs 12; CHECK-SAME: readnone 13; CHECK-NOT: norecurse 14; CHECK-NEXT: define i32 @self_rec() 15define i32 @self_rec() { 16 %a = call i32 @self_rec() 17 ret i32 4 18} 19 20; CHECK: Function Attrs 21; CHECK-SAME: readnone 22; CHECK-NOT: norecurse 23; CHECK-NEXT: define i32 @indirect_rec() 24define i32 @indirect_rec() { 25 %a = call i32 @indirect_rec2() 26 ret i32 %a 27} 28; CHECK: Function Attrs 29; CHECK-SAME: readnone 30; CHECK-NOT: norecurse 31; CHECK-NEXT: define i32 @indirect_rec2() 32define i32 @indirect_rec2() { 33 %a = call i32 @indirect_rec() 34 ret i32 %a 35} 36 37; CHECK: Function Attrs 38; CHECK-SAME: readnone 39; CHECK-NOT: norecurse 40; CHECK-NEXT: define i32 @extern() 41define i32 @extern() { 42 %a = call i32 @k() 43 ret i32 %a 44} 45 46; CHECK: Function Attrs 47; CHECK-NEXT: declare i32 @k() 48declare i32 @k() readnone 49 50; CHECK: Function Attrs 51; CHECK-SAME: nounwind 52; CHECK-NOT: norecurse 53; CHECK-NEXT: define void @intrinsic(i8* nocapture %dest, i8* nocapture readonly %src, i32 %len) 54define void @intrinsic(i8* %dest, i8* %src, i32 %len) { 55 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i1 false) 56 ret void 57} 58 59; CHECK: Function Attrs 60; CHECK-NEXT: declare void @llvm.memcpy.p0i8.p0i8.i32 61declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i1) 62 63; CHECK: Function Attrs 64; CHECK-SAME: norecurse readnone 65; FIXME: missing "norecurse" 66; CHECK-NEXT: define internal i32 @called_by_norecurse() 67define internal i32 @called_by_norecurse() { 68 %a = call i32 @k() 69 ret i32 %a 70} 71; CHECK: Function Attrs 72; CHECK-NEXT: define void @m() 73define void @m() norecurse { 74 %a = call i32 @called_by_norecurse() 75 ret void 76} 77 78; CHECK: Function Attrs 79; CHECK-SAME: norecurse readnone 80; FIXME: missing "norecurse" 81; CHECK-NEXT: define internal i32 @called_by_norecurse_indirectly() 82define internal i32 @called_by_norecurse_indirectly() { 83 %a = call i32 @k() 84 ret i32 %a 85} 86define internal void @o() { 87 %a = call i32 @called_by_norecurse_indirectly() 88 ret void 89} 90define void @p() norecurse { 91 call void @o() 92 ret void 93} 94