xref: /llvm-project/llvm/test/Analysis/StackSafetyAnalysis/Inputs/ipa.ll (revision 7cf5581712b24d4aea5dffa2e23f0ed42af1954d)
1target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
2target triple = "aarch64-unknown-linux"
3
4attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" }
5
6define dso_local void @Write1(ptr %p) #0 {
7entry:
8  store i8 0, ptr %p, align 1
9  ret void
10}
11
12define dso_local void @Write4(ptr %p) #0 {
13entry:
14  store i32 0, ptr %p, align 1
15  ret void
16}
17
18define dso_local void @Write4_2(ptr %p, ptr %q) #0 {
19entry:
20  store i32 0, ptr %p, align 1
21  store i32 0, ptr %q, align 1
22  ret void
23}
24
25define dso_local void @Write8(ptr %p) #0 {
26entry:
27  store i64 0, ptr %p, align 1
28  ret void
29}
30
31define dso_local ptr @WriteAndReturn8(ptr %p) #0 {
32entry:
33  store i8 0, ptr %p, align 1
34  ret ptr %p
35}
36
37declare dso_local void @ExternalCall(ptr %p)
38
39define dso_preemptable void @PreemptableWrite1(ptr %p) #0 {
40entry:
41  store i8 0, ptr %p, align 1
42  ret void
43}
44
45define linkonce dso_local void @InterposableWrite1(ptr %p) #0 {
46entry:
47  store i8 0, ptr %p, align 1
48  ret void
49}
50
51define dso_local ptr @ReturnDependent(ptr %p) #0 {
52entry:
53  %p2 = getelementptr i8, ptr %p, i64 2
54  ret ptr %p2
55}
56
57; access range [2, 6)
58define dso_local void @Rec0(ptr %p) #0 {
59entry:
60  %p1 = getelementptr i8, ptr %p, i64 2
61  call void @Write4(ptr %p1)
62  ret void
63}
64
65; access range [3, 7)
66define dso_local void @Rec1(ptr %p) #0 {
67entry:
68  %p1 = getelementptr i8, ptr %p, i64 1
69  call void @Rec0(ptr %p1)
70  ret void
71}
72
73; access range [-2, 2)
74define dso_local void @Rec2(ptr %p) #0 {
75entry:
76  %p1 = getelementptr i8, ptr %p, i64 -5
77  call void @Rec1(ptr %p1)
78  ret void
79}
80
81; Recursive function that passes %acc unchanged => access range [0, 4).
82define dso_local void @RecursiveNoOffset(ptr %p, i32 %size, ptr %acc) {
83entry:
84  %cmp = icmp eq i32 %size, 0
85  br i1 %cmp, label %return, label %if.end
86
87if.end:
88  %load0 = load i32, ptr %p, align 4
89  %load1 = load i32, ptr %acc, align 4
90  %add = add nsw i32 %load1, %load0
91  store i32 %add, ptr %acc, align 4
92  %add.ptr = getelementptr inbounds i32, ptr %p, i64 1
93  %sub = add nsw i32 %size, -1
94  tail call void @RecursiveNoOffset(ptr %add.ptr, i32 %sub, ptr %acc)
95  ret void
96
97return:
98  ret void
99}
100
101; Recursive function that advances %acc on each iteration => access range unlimited.
102define dso_local void @RecursiveWithOffset(i32 %size, ptr %acc) {
103entry:
104  %cmp = icmp eq i32 %size, 0
105  br i1 %cmp, label %return, label %if.end
106
107if.end:
108  store i32 0, ptr %acc, align 4
109  %acc2 = getelementptr inbounds i32, ptr %acc, i64 1
110  %sub = add nsw i32 %size, -1
111  tail call void @RecursiveWithOffset(i32 %sub, ptr %acc2)
112  ret void
113
114return:
115  ret void
116}
117
118define dso_local ptr @ReturnAlloca() {
119entry:
120  %x = alloca i64, align 4
121  ret ptr %x
122}
123
124define dso_local void @Write1Private(ptr %p) #0 {
125entry:
126  call void @Private(ptr %p)
127  ret void
128}
129
130define dso_local void @Write1SameModule(ptr %p) #0 {
131entry:
132  call void @Write1(ptr %p)
133  ret void
134}
135
136declare void @Write1Module0(ptr %p)
137
138define dso_local void @Write1DiffModule(ptr %p) #0 {
139entry:
140  call void @Write1Module0(ptr %p)
141  ret void
142}
143
144define private dso_local void @Private(ptr %p) #0 {
145entry:
146  %p1 = getelementptr i8, ptr %p, i64 -1
147  store i8 0, ptr %p1, align 1
148  ret void
149}
150
151define dso_local void @Write1Weak(ptr %p) #0 {
152entry:
153  call void @Weak(ptr %p)
154  ret void
155}
156
157define weak dso_local void @Weak(ptr %p) #0 {
158entry:
159  %p1 = getelementptr i8, ptr %p, i64 -1
160  store i8 0, ptr %p1, align 1
161  ret void
162}
163
164