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