AMDGPU: Add pass to lower OpenCL image and sampler arguments.
[oota-llvm.git] / test / CodeGen / AMDGPU / image-resource-id.ll
1 ; RUN: llc -march=r600 -mcpu=juniper < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
2
3 ; === 1 image arg, read_only ===================================================
4
5 ; FUNC-LABEL: {{^}}test_2d_rd_1_0:
6 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
7 ; EG: MOV [[VAL]], literal.x
8 ; EG-NEXT: LSHR
9 ; EG-NEXT: 0(
10 define void @test_2d_rd_1_0(%opencl.image2d_t addrspace(1)* %in, ; read_only
11                             i32 addrspace(1)* %out) {
12 entry:
13   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
14       %opencl.image2d_t addrspace(1)* %in) #0
15   store i32 %0, i32 addrspace(1)* %out
16   ret void
17 }
18
19 ; FUNC-LABEL: {{^}}test_3d_rd_1_0:
20 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
21 ; EG: MOV [[VAL]], literal.x
22 ; EG-NEXT: LSHR
23 ; EG-NEXT: 0(
24 define void @test_3d_rd_1_0(%opencl.image3d_t addrspace(1)* %in, ; read_only
25                             i32 addrspace(1)* %out) {
26 entry:
27   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
28       %opencl.image3d_t addrspace(1)* %in) #0
29   store i32 %0, i32 addrspace(1)* %out
30   ret void
31 }
32
33 ; === 1 image arg, write_only ==================================================
34
35 ; FUNC-LABEL: {{^}}test_2d_wr_1_0:
36 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
37 ; EG: MOV [[VAL]], literal.x
38 ; EG-NEXT: LSHR
39 ; EG-NEXT: 0(
40 define void @test_2d_wr_1_0(%opencl.image2d_t addrspace(1)* %in, ; write_only
41                             i32 addrspace(1)* %out) {
42 entry:
43   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
44       %opencl.image2d_t addrspace(1)* %in) #0
45   store i32 %0, i32 addrspace(1)* %out
46   ret void
47 }
48
49 ; FUNC-LABEL: {{^}}test_3d_wr_1_0:
50 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
51 ; EG: MOV [[VAL]], literal.x
52 ; EG-NEXT: LSHR
53 ; EG-NEXT: 0(
54 define void @test_3d_wr_1_0(%opencl.image3d_t addrspace(1)* %in, ; write_only
55                             i32 addrspace(1)* %out) {
56 entry:
57   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
58       %opencl.image3d_t addrspace(1)* %in) #0
59   store i32 %0, i32 addrspace(1)* %out
60   ret void
61 }
62
63 ; === 2 image args, read_only ==================================================
64
65 ; FUNC-LABEL: {{^}}test_2d_rd_2_0:
66 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
67 ; EG: MOV [[VAL]], literal.x
68 ; EG-NEXT: LSHR
69 ; EG-NEXT: 0(
70 define void @test_2d_rd_2_0(%opencl.image2d_t addrspace(1)* %in1, ; read_only
71                             %opencl.image2d_t addrspace(1)* %in2, ; read_only
72                             i32 addrspace(1)* %out) {
73 entry:
74   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
75       %opencl.image2d_t addrspace(1)* %in1) #0
76   store i32 %0, i32 addrspace(1)* %out
77   ret void
78 }
79
80 ; FUNC-LABEL: {{^}}test_2d_rd_2_1:
81 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
82 ; EG: MOV [[VAL]], literal.x
83 ; EG-NEXT: LSHR
84 ; EG-NEXT: 1(
85 define void @test_2d_rd_2_1(%opencl.image2d_t addrspace(1)* %in1, ; read_only
86                             %opencl.image2d_t addrspace(1)* %in2, ; read_only
87                             i32 addrspace(1)* %out) {
88 entry:
89   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
90       %opencl.image2d_t addrspace(1)* %in2) #0
91   store i32 %0, i32 addrspace(1)* %out
92   ret void
93 }
94
95 ; FUNC-LABEL: {{^}}test_3d_rd_2_0:
96 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
97 ; EG: MOV [[VAL]], literal.x
98 ; EG-NEXT: LSHR
99 ; EG-NEXT: 0(
100 define void @test_3d_rd_2_0(%opencl.image3d_t addrspace(1)* %in1, ; read_only
101                             %opencl.image3d_t addrspace(1)* %in2, ; read_only
102                             i32 addrspace(1)* %out) {
103 entry:
104   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
105       %opencl.image3d_t addrspace(1)* %in1) #0
106   store i32 %0, i32 addrspace(1)* %out
107   ret void
108 }
109
110 ; FUNC-LABEL: {{^}}test_3d_rd_2_1:
111 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
112 ; EG: MOV [[VAL]], literal.x
113 ; EG-NEXT: LSHR
114 ; EG-NEXT: 1(
115 define void @test_3d_rd_2_1(%opencl.image3d_t addrspace(1)* %in1, ; read_only
116                             %opencl.image3d_t addrspace(1)* %in2, ; read_only
117                             i32 addrspace(1)* %out) {
118 entry:
119   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
120       %opencl.image3d_t addrspace(1)* %in2) #0
121   store i32 %0, i32 addrspace(1)* %out
122   ret void
123 }
124
125 ; === 2 image args, write_only =================================================
126
127 ; FUNC-LABEL: {{^}}test_2d_wr_2_0:
128 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
129 ; EG: MOV [[VAL]], literal.x
130 ; EG-NEXT: LSHR
131 ; EG-NEXT: 0(
132 define void @test_2d_wr_2_0(%opencl.image2d_t addrspace(1)* %in1, ; write_only
133                             %opencl.image2d_t addrspace(1)* %in2, ; write_only
134                             i32 addrspace(1)* %out) {
135 entry:
136   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
137       %opencl.image2d_t addrspace(1)* %in1) #0
138   store i32 %0, i32 addrspace(1)* %out
139   ret void
140 }
141
142 ; FUNC-LABEL: {{^}}test_2d_wr_2_1:
143 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
144 ; EG: MOV [[VAL]], literal.x
145 ; EG-NEXT: LSHR
146 ; EG-NEXT: 1(
147 define void @test_2d_wr_2_1(%opencl.image2d_t addrspace(1)* %in1, ; write_only
148                             %opencl.image2d_t addrspace(1)* %in2, ; write_only
149                             i32 addrspace(1)* %out) {
150 entry:
151   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
152       %opencl.image2d_t addrspace(1)* %in2) #0
153   store i32 %0, i32 addrspace(1)* %out
154   ret void
155 }
156
157 ; FUNC-LABEL: {{^}}test_3d_wr_2_0:
158 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
159 ; EG: MOV [[VAL]], literal.x
160 ; EG-NEXT: LSHR
161 ; EG-NEXT: 0(
162 define void @test_3d_wr_2_0(%opencl.image3d_t addrspace(1)* %in1, ; write_only
163                             %opencl.image3d_t addrspace(1)* %in2, ; write_only
164                             i32 addrspace(1)* %out) {
165 entry:
166   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
167       %opencl.image3d_t addrspace(1)* %in1) #0
168   store i32 %0, i32 addrspace(1)* %out
169   ret void
170 }
171
172 ; FUNC-LABEL: {{^}}test_3d_wr_2_1:
173 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
174 ; EG: MOV [[VAL]], literal.x
175 ; EG-NEXT: LSHR
176 ; EG-NEXT: 1(
177 define void @test_3d_wr_2_1(%opencl.image3d_t addrspace(1)* %in1, ; write_only
178                             %opencl.image3d_t addrspace(1)* %in2, ; write_only
179                             i32 addrspace(1)* %out) {
180 entry:
181   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
182       %opencl.image3d_t addrspace(1)* %in2) #0
183   store i32 %0, i32 addrspace(1)* %out
184   ret void
185 }
186
187 ; === 3 image args, read_only ==================================================
188
189 ; FUNC-LABEL: {{^}}test_2d_rd_3_0:
190 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
191 ; EG: MOV [[VAL]], literal.x
192 ; EG-NEXT: LSHR
193 ; EG-NEXT: 2(
194 define void @test_2d_rd_3_0(%opencl.image2d_t addrspace(1)* %in1, ; read_only
195                             %opencl.image3d_t addrspace(1)* %in2, ; read_only
196                             %opencl.image2d_t addrspace(1)* %in3, ; read_only
197                             i32 addrspace(1)* %out) {
198 entry:
199   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
200       %opencl.image2d_t addrspace(1)* %in3) #0
201   store i32 %0, i32 addrspace(1)* %out
202   ret void
203 }
204
205
206 ; FUNC-LABEL: {{^}}test_3d_rd_3_0:
207 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
208 ; EG: MOV [[VAL]], literal.x
209 ; EG-NEXT: LSHR
210 ; EG-NEXT: 2(
211 define void @test_3d_rd_3_0(%opencl.image3d_t addrspace(1)* %in1, ; read_only
212                             %opencl.image2d_t addrspace(1)* %in2, ; read_only
213                             %opencl.image3d_t addrspace(1)* %in3, ; read_only
214                             i32 addrspace(1)* %out) {
215 entry:
216   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
217       %opencl.image3d_t addrspace(1)* %in3) #0
218   store i32 %0, i32 addrspace(1)* %out
219   ret void
220 }
221
222 ; === 3 image args, write_only =================================================
223
224 ; FUNC-LABEL: {{^}}test_2d_wr_3_0:
225 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
226 ; EG: MOV [[VAL]], literal.x
227 ; EG-NEXT: LSHR
228 ; EG-NEXT: 2(
229 define void @test_2d_wr_3_0(%opencl.image2d_t addrspace(1)* %in1, ; write_only
230                             %opencl.image3d_t addrspace(1)* %in2, ; write_only
231                             %opencl.image2d_t addrspace(1)* %in3, ; write_only
232                             i32 addrspace(1)* %out) {
233 entry:
234   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
235       %opencl.image2d_t addrspace(1)* %in3) #0
236   store i32 %0, i32 addrspace(1)* %out
237   ret void
238 }
239
240
241 ; FUNC-LABEL: {{^}}test_3d_wr_3_0:
242 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
243 ; EG: MOV [[VAL]], literal.x
244 ; EG-NEXT: LSHR
245 ; EG-NEXT: 2(
246 define void @test_3d_wr_3_0(%opencl.image3d_t addrspace(1)* %in1, ; write_only
247                             %opencl.image2d_t addrspace(1)* %in2, ; write_only
248                             %opencl.image3d_t addrspace(1)* %in3, ; write_only
249                             i32 addrspace(1)* %out) {
250 entry:
251   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
252       %opencl.image3d_t addrspace(1)* %in3) #0
253   store i32 %0, i32 addrspace(1)* %out
254   ret void
255 }
256
257 ; === 3 image args, mixed ======================================================
258
259 ; FUNC-LABEL: {{^}}test_2d_mix_3_0:
260 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
261 ; EG: MOV [[VAL]], literal.x
262 ; EG-NEXT: LSHR
263 ; EG-NEXT: 1(
264 define void @test_2d_mix_3_0(%opencl.image2d_t addrspace(1)* %in1, ; write_only
265                              %opencl.image3d_t addrspace(1)* %in2, ; read_only
266                              %opencl.image2d_t addrspace(1)* %in3, ; read_only
267                              i32 addrspace(1)* %out) {
268 entry:
269   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
270       %opencl.image2d_t addrspace(1)* %in3) #0
271   store i32 %0, i32 addrspace(1)* %out
272   ret void
273 }
274
275 ; FUNC-LABEL: {{^}}test_3d_mix_3_0:
276 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
277 ; EG: MOV [[VAL]], literal.x
278 ; EG-NEXT: LSHR
279 ; EG-NEXT: 1(
280 define void @test_3d_mix_3_0(%opencl.image3d_t addrspace(1)* %in1, ; write_only
281                              %opencl.image2d_t addrspace(1)* %in2, ; read_only
282                              %opencl.image3d_t addrspace(1)* %in3, ; read_only
283                              i32 addrspace(1)* %out) {
284 entry:
285   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
286       %opencl.image3d_t addrspace(1)* %in3) #0
287   store i32 %0, i32 addrspace(1)* %out
288   ret void
289 }
290
291 ; FUNC-LABEL: {{^}}test_2d_mix_3_1:
292 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
293 ; EG: MOV [[VAL]], literal.x
294 ; EG-NEXT: LSHR
295 ; EG-NEXT: 1(
296 define void @test_2d_mix_3_1(%opencl.image2d_t addrspace(1)* %in1, ; write_only
297                              %opencl.image3d_t addrspace(1)* %in2, ; read_only
298                              %opencl.image2d_t addrspace(1)* %in3, ; write_only
299                              i32 addrspace(1)* %out) {
300 entry:
301   %0 = call i32 @llvm.OpenCL.image.get.resource.id.2d(
302       %opencl.image2d_t addrspace(1)* %in3) #0
303   store i32 %0, i32 addrspace(1)* %out
304   ret void
305 }
306
307 ; FUNC-LABEL: {{^}}test_3d_mix_3_1:
308 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
309 ; EG: MOV [[VAL]], literal.x
310 ; EG-NEXT: LSHR
311 ; EG-NEXT: 1(
312 define void @test_3d_mix_3_1(%opencl.image3d_t addrspace(1)* %in1, ; write_only
313                              %opencl.image2d_t addrspace(1)* %in2, ; read_only
314                              %opencl.image3d_t addrspace(1)* %in3, ; write_only
315                              i32 addrspace(1)* %out) {
316 entry:
317   %0 = call i32 @llvm.OpenCL.image.get.resource.id.3d(
318       %opencl.image3d_t addrspace(1)* %in3) #0
319   store i32 %0, i32 addrspace(1)* %out
320   ret void
321 }
322
323
324 %opencl.image2d_t = type opaque
325 %opencl.image3d_t = type opaque
326
327 declare i32 @llvm.OpenCL.image.get.resource.id.2d(%opencl.image2d_t addrspace(1)*) #0
328 declare i32 @llvm.OpenCL.image.get.resource.id.3d(%opencl.image3d_t addrspace(1)*) #0
329
330 attributes #0 = { readnone }
331
332 !opencl.kernels = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13,
333                     !14, !15, !16, !17, !18, !19}
334 !0 = !{void (%opencl.image2d_t addrspace(1)*, i32 addrspace(1)*)* @test_2d_rd_1_0,
335        !110, !120, !130, !140, !150}
336 !1 = !{void (%opencl.image3d_t addrspace(1)*, i32 addrspace(1)*)* @test_3d_rd_1_0,
337        !110, !120, !131, !141, !150}
338 !2 = !{void (%opencl.image2d_t addrspace(1)*, i32 addrspace(1)*)* @test_2d_wr_1_0,
339        !110, !121, !130, !140, !150}
340 !3 = !{void (%opencl.image3d_t addrspace(1)*, i32 addrspace(1)*)* @test_3d_wr_1_0,
341        !110, !121, !131, !141, !150}
342 !110 = !{!"kernel_arg_addr_space", i32 1, i32 1}
343 !120 = !{!"kernel_arg_access_qual", !"read_only", !"none"}
344 !121 = !{!"kernel_arg_access_qual", !"write_only", !"none"}
345 !130 = !{!"kernel_arg_type", !"image2d_t", !"int*"}
346 !131 = !{!"kernel_arg_type", !"image3d_t", !"int*"}
347 !140 = !{!"kernel_arg_base_type", !"image2d_t", !"int*"}
348 !141 = !{!"kernel_arg_base_type", !"image3d_t", !"int*"}
349 !150 = !{!"kernel_arg_type_qual", !"", !""}
350
351 !4  = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
352               i32 addrspace(1)*)* @test_2d_rd_2_0, !112, !122, !132, !142, !152}
353 !5  = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
354               i32 addrspace(1)*)* @test_2d_rd_2_1, !112, !122, !132, !142, !152}
355 !6  = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
356               i32 addrspace(1)*)* @test_3d_rd_2_0, !112, !122, !133, !143, !152}
357 !7  = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
358               i32 addrspace(1)*)* @test_3d_rd_2_1, !112, !122, !133, !143, !152}
359 !8  = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
360               i32 addrspace(1)*)* @test_2d_wr_2_0, !112, !123, !132, !142, !152}
361 !9  = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
362               i32 addrspace(1)*)* @test_2d_wr_2_1, !112, !123, !132, !142, !152}
363 !10 = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
364               i32 addrspace(1)*)* @test_3d_wr_2_0, !112, !123, !133, !143, !152}
365 !11 = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
366               i32 addrspace(1)*)* @test_3d_wr_2_1, !112, !123, !133, !143, !152}
367 !112 = !{!"kernel_arg_addr_space", i32 1, i32 1, i32 1}
368 !122 = !{!"kernel_arg_access_qual", !"read_only", !"read_only", !"none"}
369 !123 = !{!"kernel_arg_access_qual", !"write_only", !"write_only", !"none"}
370 !132 = !{!"kernel_arg_type", !"image2d_t", !"image2d_t", !"int*"}
371 !133 = !{!"kernel_arg_type", !"image3d_t", !"image3d_t", !"int*"}
372 !142 = !{!"kernel_arg_base_type", !"image2d_t", !"image2d_t", !"int*"}
373 !143 = !{!"kernel_arg_base_type", !"image3d_t", !"image3d_t", !"int*"}
374 !152 = !{!"kernel_arg_type_qual", !"", !"", !""}
375
376 !12 = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
377               %opencl.image2d_t addrspace(1)*, i32 addrspace(1)*)* @test_2d_rd_3_0,
378               !114, !124, !134, !144, !154}
379 !13 = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
380               %opencl.image3d_t addrspace(1)*, i32 addrspace(1)*)* @test_3d_rd_3_0,
381               !114, !124, !135, !145, !154}
382 !14 = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
383               %opencl.image2d_t addrspace(1)*, i32 addrspace(1)*)* @test_2d_wr_3_0,
384               !114, !125, !134, !144, !154}
385 !15 = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
386               %opencl.image3d_t addrspace(1)*, i32 addrspace(1)*)* @test_3d_wr_3_0,
387               !114, !125, !135, !145, !154}
388 !16 = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
389               %opencl.image2d_t addrspace(1)*, i32 addrspace(1)*)* @test_2d_mix_3_0,
390               !114, !126, !134, !144, !154}
391 !17 = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
392               %opencl.image3d_t addrspace(1)*, i32 addrspace(1)*)* @test_3d_mix_3_0,
393               !114, !126, !135, !145, !154}
394 !18 = !{void (%opencl.image2d_t addrspace(1)*, %opencl.image3d_t addrspace(1)*,
395               %opencl.image2d_t addrspace(1)*, i32 addrspace(1)*)* @test_2d_mix_3_1,
396               !114, !127, !134, !144, !154}
397 !19 = !{void (%opencl.image3d_t addrspace(1)*, %opencl.image2d_t addrspace(1)*,
398               %opencl.image3d_t addrspace(1)*, i32 addrspace(1)*)* @test_3d_mix_3_1,
399               !114, !127, !135, !145, !154}
400 !114 = !{!"kernel_arg_addr_space", i32 1, i32 1, i32 1, i32 1}
401 !124 = !{!"kernel_arg_access_qual", !"read_only", !"read_only", !"read_only", !"none"}
402 !125 = !{!"kernel_arg_access_qual", !"write_only", !"write_only", !"write_only", !"none"}
403 !126 = !{!"kernel_arg_access_qual", !"write_only", !"read_only", !"read_only", !"none"}
404 !127 = !{!"kernel_arg_access_qual", !"write_only", !"read_only", !"write_only", !"none"}
405 !134 = !{!"kernel_arg_type", !"image2d_t", !"image3d_t", !"image2d_t", !"int*"}
406 !135 = !{!"kernel_arg_type", !"image3d_t", !"image2d_t", !"image3d_t", !"int*"}
407 !144 = !{!"kernel_arg_base_type", !"image2d_t", !"image3d_t", !"image2d_t", !"int*"}
408 !145 = !{!"kernel_arg_base_type", !"image3d_t", !"image2d_t", !"image3d_t", !"int*"}
409 !154 = !{!"kernel_arg_type_qual", !"", !"", !"", !""}