blob: d4cf349442409ccc2862ee2f338775b3446d62f6 [file] [log] [blame]
Tom Stellardfd253952015-08-07 23:19:30 +00001; 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(
10define void @test_2d_rd_1_0(%opencl.image2d_t addrspace(1)* %in, ; read_only
11 i32 addrspace(1)* %out) {
12entry:
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(
24define void @test_3d_rd_1_0(%opencl.image3d_t addrspace(1)* %in, ; read_only
25 i32 addrspace(1)* %out) {
26entry:
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(
40define void @test_2d_wr_1_0(%opencl.image2d_t addrspace(1)* %in, ; write_only
41 i32 addrspace(1)* %out) {
42entry:
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(
54define void @test_3d_wr_1_0(%opencl.image3d_t addrspace(1)* %in, ; write_only
55 i32 addrspace(1)* %out) {
56entry:
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(
70define 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) {
73entry:
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(
85define 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) {
88entry:
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(
100define 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) {
103entry:
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(
115define 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) {
118entry:
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(
132define 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) {
135entry:
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(
147define 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) {
150entry:
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(
162define 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) {
165entry:
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(
177define 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) {
180entry:
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(
194define 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) {
198entry:
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(
211define 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) {
215entry:
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(
229define 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) {
233entry:
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(
246define 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) {
250entry:
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(
264define 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) {
268entry:
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(
280define 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) {
284entry:
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(
296define 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) {
300entry:
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(
312define 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) {
316entry:
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
327declare i32 @llvm.OpenCL.image.get.resource.id.2d(%opencl.image2d_t addrspace(1)*) #0
328declare i32 @llvm.OpenCL.image.get.resource.id.3d(%opencl.image3d_t addrspace(1)*) #0
329
330attributes #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", !"", !"", !"", !""}