1; REQUIRES: aarch64-registered-target
2
3; For convenience, to show what is being serialized.
4; RUN: opt -S -passes="print<stack-safety-local>" -disable-output < %s 2>&1 | FileCheck %s --check-prefixes=SSI
5
6; RUN: opt -module-summary %s -o %t.bc
7; RUN: llvm-bcanalyzer -dump %t.bc | FileCheck %s -check-prefixes=BC
8
9; RUN: llvm-dis -o - %t.bc | FileCheck %s --check-prefix=DIS
10; Round trip it through llvm-as
11; RUN: llvm-dis -o - %t.bc | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=DIS
12
13; RUN: opt -thinlto-bc %s -o %t.bc
14; RUN: llvm-bcanalyzer -dump %t.bc | FileCheck %s -check-prefixes=BC
15
16; RUN: llvm-dis -o - %t.bc | FileCheck %s --check-prefix=DIS
17; Round trip it through llvm-as
18; RUN: llvm-dis -o - %t.bc | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=DIS
19
20; DIS: ^0 = module: (path: "{{.*}}", hash: ({{.*}}))
21; ModuleID = 'thinlto-function-summary-paramaccess.ll'
22target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
23target triple = "aarch64-unknown-linux"
24
25attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" }
26
27; BC-LABEL: <GLOBALVAL_SUMMARY_BLOCK
28; BC-NEXT: <VERSION
29; BC-NEXT: <FLAGS
30
31; DIS-DAG: = gv: (name: "Callee") ; guid = 900789920918863816
32declare void @Callee(i8* %p)
33
34; DIS-DAG: = gv: (name: "Callee2") ; guid = 72710208629861106
35declare void @Callee2(i32 %x, i8* %p)
36
37; BC-NEXT: <PERMODULE
38; DIS-DAG: = gv: (name: "NoParam", summaries: {{.*}} guid = 10287433468618421703
39define void @NoParam() #0 {
40entry:
41  ret void
42}
43
44; SSI-LABEL: function 'IntParam'
45; BC-NEXT: <PERMODULE
46; DIS-DAG: = gv: (name: "IntParam", summaries: {{.*}} guid = 13164714711077064397
47define void @IntParam(i32 %x) #0 {
48entry:
49  ret void
50}
51
52; SSI-LABEL: for function 'WriteNone'
53; SSI: p[]: empty-set
54; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=0/>
55; BC-NEXT: <PERMODULE
56; DIS-DAG: = gv: (name: "WriteNone", summaries: {{.*}} params: ((param: 0, offset: [0, -1]))))) ; guid = 15261848357689602442
57define void @WriteNone(i8* %p) #0 {
58entry:
59  ret void
60}
61
62; SSI-LABEL: for function 'Write0'
63; SSI: p[]: [0,1)
64; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0/>
65; BC-NEXT: <PERMODULE
66; DIS-DAG: = gv: (name: "Write0", summaries: {{.*}} params: ((param: 0, offset: [0, 0]))))) ; guid = 5540766144860458461
67define void @Write0(i8* %p) #0 {
68entry:
69  store i8 0, i8* %p
70  ret void
71}
72
73; SSI-LABEL: for function 'WriteOffset'
74; SSI: p[]: [12,16)
75; BC-NEXT: <PARAM_ACCESS op0=0 op1=24 op2=32 op3=0/>
76; BC-NEXT: <PERMODULE
77; DIS-DAG: = gv: (name: "WriteOffset", summaries: {{.*}} params: ((param: 0, offset: [12, 15]))))) ; guid = 1417835201204712148
78define void @WriteOffset(i8* %p) #0 {
79entry:
80  %0 = bitcast i8* %p to i32*
81  %1 = getelementptr i32, i32* %0, i64 3
82  store i32 0, i32* %1
83  ret void
84}
85
86; SSI-LABEL: for function 'WriteNegOffset'
87; SSI: p[]: [-56,-48)
88; BC-NEXT: <PARAM_ACCESS op0=0 op1=113 op2=97 op3=0/>
89; BC-NEXT: <PERMODULE
90; DIS-DAG: = gv: (name: "WriteNegOffset", summaries: {{.*}} params: ((param: 0, offset: [-56, -49]))))) ; guid = 11847411556962310546
91define void @WriteNegOffset(i8* %p) #0 {
92entry:
93  %0 = bitcast i8* %p to i64*
94  %1 = getelementptr i64, i64* %0, i64 -7
95  store i64 0, i64* %1
96  ret void
97}
98
99; SSI-LABEL: for function 'WriteAnyOffset'
100; SSI: p[]: [-9223372036854775808,9223372036854775807)
101; BC-NEXT:  <PARAM_ACCESS op0=0 op1=1 op2=-2 op3=0/>
102; BC-NEXT: <PERMODULE
103; DIS-DAG: = gv: (name: "WriteAnyOffset", summaries: {{.*}} params: ((param: 0, offset: [-9223372036854775808, 9223372036854775806]))))) ; guid = 16159595372881907190
104define void @WriteAnyOffset(i8* %p, i64 %i) #0 {
105entry:
106  %0 = bitcast i8* %p to i24*
107  %1 = getelementptr i24, i24* %0, i64 %i
108  store i24 0, i24* %1
109  ret void
110}
111
112; SSI-LABEL: for function 'WritePQ'
113; SSI: p[]: [0,1)
114; SSI: q[]: [0,4)
115; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0 op4=1 op5=0 op6=8 op7=0/>
116; BC-NEXT: <PERMODULE
117; DIS-DAG: = gv: (name: "WritePQ", summaries: {{.*}} params: ((param: 0, offset: [0, 0]), (param: 1, offset: [0, 3]))))) ; guid = 6187077497926519485
118define void @WritePQ(i8* %p, i32* %q) #0 {
119entry:
120  store i8 5, i8* %p
121  store i32 6, i32* %q
122  ret void
123}
124
125; SSI-LABEL: for function 'WriteTwoPIQ'
126; SSI: p[]: [0,1)
127; SSI: q[]: [0,4)
128; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0 op4=2 op5=0 op6=8 op7=0/>
129; BC-NEXT: <PERMODULE
130; DIS-DAG: = gv: (name: "WriteTwoPIQ", summaries: {{.*}} params: ((param: 0, offset: [0, 0]), (param: 2, offset: [0, 3]))))) ; guid = 2949024673554120799
131define void @WriteTwoPIQ(i8* %p, i32 %i, i32* %q) #0 {
132entry:
133  store i8 7, i8* %p
134  store i32 %i, i32* %q
135  ret void
136}
137
138; SSI-LABEL: for function 'Call'
139; SSI: p[]: empty-set, @Callee(arg0, [0,1))
140; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE:-?[0-9]+]] op6=0 op7=2/>
141; BC-NEXT: <PERMODULE
142; DIS-DAG: = gv: (name: "Call", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [0, 0]))))))) ; guid = 8411925997558855107
143define void @Call(i8* %p) #0 {
144entry:
145  call void @Callee(i8* %p)
146  ret void
147}
148
149; SSI-LABEL: for function 'CallOffset'
150; SSI: p[]: empty-set, @Callee(arg0, [2,3))
151; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE]] op6=4 op7=6/>
152; BC-NEXT: <PERMODULE
153; DIS-DAG: = gv: (name: "CallOffset", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [2, 2]))))))) ; guid = 1075564720951610524
154define void @CallOffset(i8* %p) #0 {
155entry:
156  %p1 = getelementptr i8, i8* %p, i64 2
157  call void @Callee(i8* %p1)
158  ret void
159}
160
161; SSI-LABEL: for function 'CallNegOffset'
162; SSI: p[]: empty-set, @Callee(arg0, [-715,-714))
163; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE]] op6=1431 op7=1429/>
164; BC-NEXT: <PERMODULE
165; DIS-DAG: = gv: (name: "CallNegOffset", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]))))))) ; guid = 16532891468562335146
166define void @CallNegOffset(i8* %p) #0 {
167entry:
168  %p1 = getelementptr i8, i8* %p, i64 -715
169  call void @Callee(i8* %p1)
170  ret void
171}
172
173; BC-NEXT: <PERMODULE
174; SSI-LABEL: for function 'CallAnyOffset'
175; SSI: p[]: empty-set, @Callee(arg0, full-set)
176; DIS-DAG: = gv: (name: "CallAnyOffset", summaries: {{.*}} calls: ((callee: ^{{.*}}))))) ; guid = 4179978066780831873
177define void @CallAnyOffset(i8* %p, i64 %i) #0 {
178entry:
179  %p1 = getelementptr i8, i8* %p, i64 %i
180  call void @Callee(i8* %p1)
181  ret void
182}
183
184; SSI-LABEL: for function 'CallMany'
185; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)), @Callee(arg0, [-33,-32)), @Callee(arg0, [124,125))
186; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=3 op4=0 op5=[[CALLEE]] op6=1431 op7=1429 op8=0 op9=[[CALLEE]] op10=67 op11=65 op12=0 op13=[[CALLEE]] op14=248 op15=250/>
187; BC-NEXT: <PERMODULE
188; DIS-DAG: = gv: (name: "CallMany", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]), (callee: ^{{.*}}, param: 0, offset: [-33, -33]), (callee: ^{{.*}}, param: 0, offset: [124, 124]))))))) ; guid = 17150418543861409076
189define void @CallMany(i8* %p) #0 {
190entry:
191  %p0 = getelementptr i8, i8* %p, i64 -715
192  call void @Callee(i8* %p0)
193
194  %p1 = getelementptr i8, i8* %p, i64 -33
195  call void @Callee(i8* %p1)
196
197  %p2 = getelementptr i8, i8* %p, i64 124
198  call void @Callee(i8* %p2)
199
200  ret void
201}
202
203; SSI-LABEL: for function 'CallMany2'
204; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)), @Callee2(arg1, [-33,-32)), @Callee(arg0, [124,125))
205; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=3 op4=0 op5=[[CALLEE]] op6=1431 op7=1429 op8=1 op9=[[CALLEE2:-?[0-9]+]] op10=67 op11=65 op12=0 op13=[[CALLEE]] op14=248 op15=250/>
206; BC-NEXT: <PERMODULE
207; DIS-DAG: = gv: (name: "CallMany2", summaries: {{.*}} calls: ((callee: ^{{.*}}), (callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]), (callee: ^{{.*}}, param: 1, offset: [-33, -33]), (callee: ^{{.*}}, param: 0, offset: [124, 124]))))))) ; guid = 16654048340802466690
208define void @CallMany2(i8* %p) #0 {
209entry:
210  %p0 = getelementptr i8, i8* %p, i64 -715
211  call void @Callee(i8* %p0)
212
213  %p1 = getelementptr i8, i8* %p, i64 -33
214  call void @Callee2(i32 6, i8* %p1)
215
216  %p2 = getelementptr i8, i8* %p, i64 124
217  call void @Callee(i8* %p2)
218
219  ret void
220}
221
222; SSI-LABEL: for function 'CallManyUnsafe'
223; SSI: p[]: full-set, @Callee(arg0, [-715,-714)), @Callee(arg0, [-33,-32)), @Callee(arg0, [124,125))
224; BC-NEXT: <PERMODULE
225; DIS-DAG: = gv: (name: "CallManyUnsafe", summaries: {{.*}} calls: ((callee: ^{{.*}}))))) ; guid = 15696680128757863301
226define void @CallManyUnsafe(i8* %p, i64 %i) #0 {
227entry:
228  %pi = getelementptr i8, i8* %p, i64 %i
229  store i8 5, i8* %pi
230
231  %p0 = getelementptr i8, i8* %p, i64 -715
232  call void @Callee(i8* %p0)
233
234  %p1 = getelementptr i8, i8* %p, i64 -33
235  call void @Callee(i8* %p1)
236
237  %p2 = getelementptr i8, i8* %p, i64 124
238  call void @Callee(i8* %p2)
239
240  ret void
241}
242
243; SSI-LABEL: for function 'Ret'
244; SSI: p[]: full-set
245; BC-NEXT: <PERMODULE
246; DIS-DAG: = gv: (name: "Ret", summaries: {{.*}} ; guid = 6707380319572075172
247define i8* @Ret(i8* %p) #0 {
248entry:
249  ret i8* %p
250}
251
252; BC-NOT: <PERMODULE
253; BC-NOT: <PARAM_ACCESS1
254
255
256