• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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