Revert "[LoopVectorize] Add support for reverse loops in isDereferenceableAndAlignedI...
[llvm-project.git] / llvm / test / Transforms / InstCombine / AMDGPU / amdgcn-intrinsics.ll
blob5fdb918c875459ec1b49bff8e9f1e448eb3fa90c
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -passes=instcombine -S < %s | FileCheck %s
4 ; --------------------------------------------------------------------
5 ; llvm.amdgcn.rcp
6 ; --------------------------------------------------------------------
8 declare float @llvm.amdgcn.rcp.f32(float) nounwind readnone
9 declare double @llvm.amdgcn.rcp.f64(double) nounwind readnone
11 define float @test_constant_fold_rcp_f32_undef() nounwind {
12 ; CHECK-LABEL: @test_constant_fold_rcp_f32_undef(
13 ; CHECK-NEXT:    ret float 0x7FF8000000000000
15   %val = call float @llvm.amdgcn.rcp.f32(float undef) nounwind readnone
16   ret float %val
19 define float @test_constant_fold_rcp_f32_1() nounwind {
20 ; CHECK-LABEL: @test_constant_fold_rcp_f32_1(
21 ; CHECK-NEXT:    ret float 1.000000e+00
23   %val = call float @llvm.amdgcn.rcp.f32(float 1.0) nounwind readnone
24   ret float %val
27 define double @test_constant_fold_rcp_f64_1() nounwind {
28 ; CHECK-LABEL: @test_constant_fold_rcp_f64_1(
29 ; CHECK-NEXT:    ret double 1.000000e+00
31   %val = call double @llvm.amdgcn.rcp.f64(double 1.0) nounwind readnone
32   ret double %val
35 define float @test_constant_fold_rcp_f32_half() nounwind {
36 ; CHECK-LABEL: @test_constant_fold_rcp_f32_half(
37 ; CHECK-NEXT:    ret float 2.000000e+00
39   %val = call float @llvm.amdgcn.rcp.f32(float 0.5) nounwind readnone
40   ret float %val
43 define double @test_constant_fold_rcp_f64_half() nounwind {
44 ; CHECK-LABEL: @test_constant_fold_rcp_f64_half(
45 ; CHECK-NEXT:    ret double 2.000000e+00
47   %val = call double @llvm.amdgcn.rcp.f64(double 0.5) nounwind readnone
48   ret double %val
51 define float @test_constant_fold_rcp_f32_43() nounwind {
52 ; CHECK-LABEL: @test_constant_fold_rcp_f32_43(
53 ; CHECK-NEXT:    ret float 0x3F97D05F40000000
55   %val = call float @llvm.amdgcn.rcp.f32(float 4.300000e+01) nounwind readnone
56   ret float %val
59 define double @test_constant_fold_rcp_f64_43() nounwind {
60 ; CHECK-LABEL: @test_constant_fold_rcp_f64_43(
61 ; CHECK-NEXT:    ret double 0x3F97D05F417D05F4
63   %val = call double @llvm.amdgcn.rcp.f64(double 4.300000e+01) nounwind readnone
64   ret double %val
67 define float @test_constant_fold_rcp_f32_43_strictfp() nounwind strictfp {
68 ; CHECK-LABEL: @test_constant_fold_rcp_f32_43_strictfp(
69 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 4.300000e+01) #[[ATTR14:[0-9]+]]
70 ; CHECK-NEXT:    ret float [[VAL]]
72   %val = call float @llvm.amdgcn.rcp.f32(float 4.300000e+01) strictfp nounwind readnone
73   ret float %val
76 ; --------------------------------------------------------------------
77 ; llvm.amdgcn.sqrt
78 ; --------------------------------------------------------------------
80 declare half @llvm.amdgcn.sqrt.f16(half) nounwind readnone
81 declare float @llvm.amdgcn.sqrt.f32(float) nounwind readnone
82 declare double @llvm.amdgcn.sqrt.f64(double) nounwind readnone
84 define half @test_constant_fold_sqrt_f16_undef() nounwind {
85 ; CHECK-LABEL: @test_constant_fold_sqrt_f16_undef(
86 ; CHECK-NEXT:    ret half 0xH7E00
88   %val = call half @llvm.amdgcn.sqrt.f16(half undef) nounwind readnone
89   ret half %val
92 define float @test_constant_fold_sqrt_f32_undef() nounwind {
93 ; CHECK-LABEL: @test_constant_fold_sqrt_f32_undef(
94 ; CHECK-NEXT:    ret float 0x7FF8000000000000
96   %val = call float @llvm.amdgcn.sqrt.f32(float undef) nounwind readnone
97   ret float %val
100 define double @test_constant_fold_sqrt_f64_undef() nounwind {
101 ; CHECK-LABEL: @test_constant_fold_sqrt_f64_undef(
102 ; CHECK-NEXT:    ret double 0x7FF8000000000000
104   %val = call double @llvm.amdgcn.sqrt.f64(double undef) nounwind readnone
105   ret double %val
108 define half @test_constant_fold_sqrt_f16_0() nounwind {
109 ; CHECK-LABEL: @test_constant_fold_sqrt_f16_0(
110 ; CHECK-NEXT:    ret half 0xH0000
112   %val = call half @llvm.amdgcn.sqrt.f16(half 0.0) nounwind readnone
113   ret half %val
116 define float @test_constant_fold_sqrt_f32_0() nounwind {
117 ; CHECK-LABEL: @test_constant_fold_sqrt_f32_0(
118 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.sqrt.f32(float 0.000000e+00) #[[ATTR15:[0-9]+]]
119 ; CHECK-NEXT:    ret float [[VAL]]
121   %val = call float @llvm.amdgcn.sqrt.f32(float 0.0) nounwind readnone
122   ret float %val
125 define double @test_constant_fold_sqrt_f64_0() nounwind {
126 ; CHECK-LABEL: @test_constant_fold_sqrt_f64_0(
127 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.sqrt.f64(double 0.000000e+00) #[[ATTR15]]
128 ; CHECK-NEXT:    ret double [[VAL]]
130   %val = call double @llvm.amdgcn.sqrt.f64(double 0.0) nounwind readnone
131   ret double %val
134 define half @test_constant_fold_sqrt_f16_neg0() nounwind {
135 ; CHECK-LABEL: @test_constant_fold_sqrt_f16_neg0(
136 ; CHECK-NEXT:    ret half 0xH8000
138   %val = call half @llvm.amdgcn.sqrt.f16(half -0.0) nounwind readnone
139   ret half %val
142 define float @test_constant_fold_sqrt_f32_neg0() nounwind {
143 ; CHECK-LABEL: @test_constant_fold_sqrt_f32_neg0(
144 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.sqrt.f32(float -0.000000e+00) #[[ATTR15]]
145 ; CHECK-NEXT:    ret float [[VAL]]
147   %val = call float @llvm.amdgcn.sqrt.f32(float -0.0) nounwind readnone
148   ret float %val
151 define double @test_constant_fold_sqrt_f64_neg0() nounwind {
152 ; CHECK-LABEL: @test_constant_fold_sqrt_f64_neg0(
153 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.sqrt.f64(double -0.000000e+00) #[[ATTR15]]
154 ; CHECK-NEXT:    ret double [[VAL]]
156   %val = call double @llvm.amdgcn.sqrt.f64(double -0.0) nounwind readnone
157   ret double %val
160 define double @test_constant_fold_sqrt_snan_f64() nounwind {
161 ; CHECK-LABEL: @test_constant_fold_sqrt_snan_f64(
162 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.sqrt.f64(double 0x7FF0000000000001)
163 ; CHECK-NEXT:    ret double [[VAL]]
165   %val = call double @llvm.amdgcn.sqrt.f64(double 0x7FF0000000000001)
166   ret double %val
169 define double @test_constant_fold_sqrt_qnan_f64() nounwind {
170 ; CHECK-LABEL: @test_constant_fold_sqrt_qnan_f64(
171 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.sqrt.f64(double 0x7FF8000000000000)
172 ; CHECK-NEXT:    ret double [[VAL]]
174   %val = call double @llvm.amdgcn.sqrt.f64(double 0x7FF8000000000000)
175   ret double %val
178 define double @test_constant_fold_sqrt_neg1() nounwind {
179 ; CHECK-LABEL: @test_constant_fold_sqrt_neg1(
180 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.sqrt.f64(double -1.000000e+00)
181 ; CHECK-NEXT:    ret double [[VAL]]
183   %val = call double @llvm.amdgcn.sqrt.f64(double -1.0)
184   ret double %val
187 define half @test_amdgcn_sqrt_f16(half %arg) {
188 ; CHECK-LABEL: @test_amdgcn_sqrt_f16(
189 ; CHECK-NEXT:    [[VAL:%.*]] = call half @llvm.sqrt.f16(half [[ARG:%.*]])
190 ; CHECK-NEXT:    ret half [[VAL]]
192   %val = call half @llvm.amdgcn.sqrt.f16(half %arg)
193   ret half %val
196 define half @test_amdgcn_sqrt_f16_flags(half %arg) {
197 ; CHECK-LABEL: @test_amdgcn_sqrt_f16_flags(
198 ; CHECK-NEXT:    [[VAL:%.*]] = call nnan half @llvm.sqrt.f16(half [[ARG:%.*]])
199 ; CHECK-NEXT:    ret half [[VAL]]
201   %val = call nnan half @llvm.amdgcn.sqrt.f16(half %arg)
202   ret half %val
205 define float @test_amdgcn_sqrt_f32(float %arg) {
206 ; CHECK-LABEL: @test_amdgcn_sqrt_f32(
207 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.sqrt.f32(float [[ARG:%.*]])
208 ; CHECK-NEXT:    ret float [[VAL]]
210   %val = call float @llvm.amdgcn.sqrt.f32(float %arg)
211   ret float %val
214 define double @test_amdgcn_sqrt_f64(double %arg) {
215 ; CHECK-LABEL: @test_amdgcn_sqrt_f64(
216 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.sqrt.f64(double [[ARG:%.*]])
217 ; CHECK-NEXT:    ret double [[VAL]]
219   %val = call double @llvm.amdgcn.sqrt.f64(double %arg)
220   ret double %val
223 ; --------------------------------------------------------------------
224 ; llvm.amdgcn.rsq
225 ; --------------------------------------------------------------------
227 declare float @llvm.amdgcn.rsq.f32(float) nounwind readnone
229 define float @test_constant_fold_rsq_f32_undef() nounwind {
230 ; CHECK-LABEL: @test_constant_fold_rsq_f32_undef(
231 ; CHECK-NEXT:    ret float 0x7FF8000000000000
233   %val = call float @llvm.amdgcn.rsq.f32(float undef) nounwind readnone
234   ret float %val
237 ; --------------------------------------------------------------------
238 ; llvm.amdgcn.frexp.mant
239 ; --------------------------------------------------------------------
241 declare float @llvm.amdgcn.frexp.mant.f32(float) nounwind readnone
242 declare double @llvm.amdgcn.frexp.mant.f64(double) nounwind readnone
245 define float @test_constant_fold_frexp_mant_f32_undef() nounwind {
246 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_undef(
247 ; CHECK-NEXT:    ret float undef
249   %val = call float @llvm.amdgcn.frexp.mant.f32(float undef)
250   ret float %val
253 define double @test_constant_fold_frexp_mant_f64_undef() nounwind {
254 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_undef(
255 ; CHECK-NEXT:    ret double undef
257   %val = call double @llvm.amdgcn.frexp.mant.f64(double undef)
258   ret double %val
261 define float @test_constant_fold_frexp_mant_f32_0() nounwind {
262 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_0(
263 ; CHECK-NEXT:    ret float 0.000000e+00
265   %val = call float @llvm.amdgcn.frexp.mant.f32(float 0.0)
266   ret float %val
269 define double @test_constant_fold_frexp_mant_f64_0() nounwind {
270 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_0(
271 ; CHECK-NEXT:    ret double 0.000000e+00
273   %val = call double @llvm.amdgcn.frexp.mant.f64(double 0.0)
274   ret double %val
277 define float @test_constant_fold_frexp_mant_f32_n0() nounwind {
278 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n0(
279 ; CHECK-NEXT:    ret float -0.000000e+00
281   %val = call float @llvm.amdgcn.frexp.mant.f32(float -0.0)
282   ret float %val
285 define double @test_constant_fold_frexp_mant_f64_n0() nounwind {
286 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n0(
287 ; CHECK-NEXT:    ret double -0.000000e+00
289   %val = call double @llvm.amdgcn.frexp.mant.f64(double -0.0)
290   ret double %val
293 define float @test_constant_fold_frexp_mant_f32_1() nounwind {
294 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_1(
295 ; CHECK-NEXT:    ret float 5.000000e-01
297   %val = call float @llvm.amdgcn.frexp.mant.f32(float 1.0)
298   ret float %val
301 define double @test_constant_fold_frexp_mant_f64_1() nounwind {
302 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_1(
303 ; CHECK-NEXT:    ret double 5.000000e-01
305   %val = call double @llvm.amdgcn.frexp.mant.f64(double 1.0)
306   ret double %val
309 define float @test_constant_fold_frexp_mant_f32_n1() nounwind {
310 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n1(
311 ; CHECK-NEXT:    ret float -5.000000e-01
313   %val = call float @llvm.amdgcn.frexp.mant.f32(float -1.0)
314   ret float %val
317 define double @test_constant_fold_frexp_mant_f64_n1() nounwind {
318 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n1(
319 ; CHECK-NEXT:    ret double -5.000000e-01
321   %val = call double @llvm.amdgcn.frexp.mant.f64(double -1.0)
322   ret double %val
325 define float @test_constant_fold_frexp_mant_f32_nan() nounwind {
326 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_nan(
327 ; CHECK-NEXT:    ret float 0x7FF8000000000000
329   %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF8000000000000)
330   ret float %val
333 define double @test_constant_fold_frexp_mant_f64_nan() nounwind {
334 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_nan(
335 ; CHECK-NEXT:    ret double 0x7FF8000000000000
337   %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF8000000000000)
338   ret double %val
341 define float @test_constant_fold_frexp_mant_f32_inf() nounwind {
342 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_inf(
343 ; CHECK-NEXT:    ret float 0x7FF0000000000000
345   %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF0000000000000)
346   ret float %val
349 define double @test_constant_fold_frexp_mant_f64_inf() nounwind {
350 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_inf(
351 ; CHECK-NEXT:    ret double 0x7FF0000000000000
353   %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF0000000000000)
354   ret double %val
357 define float @test_constant_fold_frexp_mant_f32_ninf() nounwind {
358 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_ninf(
359 ; CHECK-NEXT:    ret float 0xFFF0000000000000
361   %val = call float @llvm.amdgcn.frexp.mant.f32(float 0xFFF0000000000000)
362   ret float %val
365 define double @test_constant_fold_frexp_mant_f64_ninf() nounwind {
366 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_ninf(
367 ; CHECK-NEXT:    ret double 0xFFF0000000000000
369   %val = call double @llvm.amdgcn.frexp.mant.f64(double 0xFFF0000000000000)
370   ret double %val
373 define float @test_constant_fold_frexp_mant_f32_max_num() nounwind {
374 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_max_num(
375 ; CHECK-NEXT:    ret float 0x3FEFFFFFE0000000
377   %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x47EFFFFFE0000000)
378   ret float %val
381 define double @test_constant_fold_frexp_mant_f64_max_num() nounwind {
382 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_max_num(
383 ; CHECK-NEXT:    ret double 0x3FEFFFFFFFFFFFFF
385   %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FEFFFFFFFFFFFFF)
386   ret double %val
389 define float @test_constant_fold_frexp_mant_f32_min_num() nounwind {
390 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_min_num(
391 ; CHECK-NEXT:    ret float 5.000000e-01
393   %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x36A0000000000000)
394   ret float %val
397 define double @test_constant_fold_frexp_mant_f64_min_num() nounwind {
398 ; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_min_num(
399 ; CHECK-NEXT:    ret double 5.000000e-01
401   %val = call double @llvm.amdgcn.frexp.mant.f64(double 4.940656e-324)
402   ret double %val
406 ; --------------------------------------------------------------------
407 ; llvm.amdgcn.frexp.exp
408 ; --------------------------------------------------------------------
410 declare i32 @llvm.amdgcn.frexp.exp.f32(float) nounwind readnone
411 declare i32 @llvm.amdgcn.frexp.exp.f64(double) nounwind readnone
413 define i32 @test_constant_fold_frexp_exp_f32_undef() nounwind {
414 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_undef(
415 ; CHECK-NEXT:    ret i32 undef
417   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float undef)
418   ret i32 %val
421 define i32 @test_constant_fold_frexp_exp_f64_undef() nounwind {
422 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_undef(
423 ; CHECK-NEXT:    ret i32 undef
425   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double undef)
426   ret i32 %val
429 define i32 @test_constant_fold_frexp_exp_f32_0() nounwind {
430 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_0(
431 ; CHECK-NEXT:    ret i32 0
433   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0)
434   ret i32 %val
437 define i32 @test_constant_fold_frexp_exp_f64_0() nounwind {
438 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_0(
439 ; CHECK-NEXT:    ret i32 0
441   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0)
442   ret i32 %val
445 define i32 @test_constant_fold_frexp_exp_f32_n0() nounwind {
446 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n0(
447 ; CHECK-NEXT:    ret i32 0
449   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -0.0)
450   ret i32 %val
453 define i32 @test_constant_fold_frexp_exp_f64_n0() nounwind {
454 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n0(
455 ; CHECK-NEXT:    ret i32 0
457   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -0.0)
458   ret i32 %val
461 define i32 @test_constant_fold_frexp_exp_f32_1024() nounwind {
462 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1024(
463 ; CHECK-NEXT:    ret i32 11
465   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 1024.0)
466   ret i32 %val
469 define i32 @test_constant_fold_frexp_exp_f64_1024() nounwind {
470 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1024(
471 ; CHECK-NEXT:    ret i32 11
473   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 1024.0)
474   ret i32 %val
477 define i32 @test_constant_fold_frexp_exp_f32_n1024() nounwind {
478 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n1024(
479 ; CHECK-NEXT:    ret i32 11
481   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -1024.0)
482   ret i32 %val
485 define i32 @test_constant_fold_frexp_exp_f64_n1024() nounwind {
486 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n1024(
487 ; CHECK-NEXT:    ret i32 11
489   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -1024.0)
490   ret i32 %val
493 define i32 @test_constant_fold_frexp_exp_f32_1_1024() nounwind {
494 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1_1024(
495 ; CHECK-NEXT:    ret i32 -9
497   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0009765625)
498   ret i32 %val
501 define i32 @test_constant_fold_frexp_exp_f64_1_1024() nounwind {
502 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1_1024(
503 ; CHECK-NEXT:    ret i32 -9
505   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0009765625)
506   ret i32 %val
509 define i32 @test_constant_fold_frexp_exp_f32_nan() nounwind {
510 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_nan(
511 ; CHECK-NEXT:    ret i32 0
513   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF8000000000000)
514   ret i32 %val
517 define i32 @test_constant_fold_frexp_exp_f64_nan() nounwind {
518 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_nan(
519 ; CHECK-NEXT:    ret i32 0
521   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF8000000000000)
522   ret i32 %val
525 define i32 @test_constant_fold_frexp_exp_f32_inf() nounwind {
526 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_inf(
527 ; CHECK-NEXT:    ret i32 0
529   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF0000000000000)
530   ret i32 %val
533 define i32 @test_constant_fold_frexp_exp_f64_inf() nounwind {
534 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_inf(
535 ; CHECK-NEXT:    ret i32 0
537   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF0000000000000)
538   ret i32 %val
541 define i32 @test_constant_fold_frexp_exp_f32_ninf() nounwind {
542 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_ninf(
543 ; CHECK-NEXT:    ret i32 0
545   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0xFFF0000000000000)
546   ret i32 %val
549 define i32 @test_constant_fold_frexp_exp_f64_ninf() nounwind {
550 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_ninf(
551 ; CHECK-NEXT:    ret i32 0
553   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0xFFF0000000000000)
554   ret i32 %val
557 define i32 @test_constant_fold_frexp_exp_f32_max_num() nounwind {
558 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_max_num(
559 ; CHECK-NEXT:    ret i32 128
561   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x47EFFFFFE0000000)
562   ret i32 %val
565 define i32 @test_constant_fold_frexp_exp_f64_max_num() nounwind {
566 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_max_num(
567 ; CHECK-NEXT:    ret i32 1024
569   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FEFFFFFFFFFFFFF)
570   ret i32 %val
573 define i32 @test_constant_fold_frexp_exp_f32_min_num() nounwind {
574 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_min_num(
575 ; CHECK-NEXT:    ret i32 -148
577   %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x36A0000000000000)
578   ret i32 %val
581 define i32 @test_constant_fold_frexp_exp_f64_min_num() nounwind {
582 ; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_min_num(
583 ; CHECK-NEXT:    ret i32 -1073
585   %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 4.940656e-324)
586   ret i32 %val
589 ; --------------------------------------------------------------------
590 ; llvm.amdgcn.class
591 ; --------------------------------------------------------------------
593 declare i1 @llvm.amdgcn.class.f32(float, i32) nounwind readnone
594 declare i1 @llvm.amdgcn.class.f64(double, i32) nounwind readnone
596 define i1 @test_class_undef_mask_f32(float %x) nounwind {
597 ; CHECK-LABEL: @test_class_undef_mask_f32(
598 ; CHECK-NEXT:    ret i1 false
600   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 undef)
601   ret i1 %val
604 define i1 @test_class_poison_poison_f32(float %x) nounwind {
605 ; CHECK-LABEL: @test_class_poison_poison_f32(
606 ; CHECK-NEXT:    ret i1 poison
608   %val = call i1 @llvm.amdgcn.class.f32(float poison, i32 poison)
609   ret i1 %val
611 define i1 @test_class_val_poison_f32(float %arg) nounwind {
612 ; CHECK-LABEL: @test_class_val_poison_f32(
613 ; CHECK-NEXT:    ret i1 poison
615   %val = call i1 @llvm.amdgcn.class.f32(float %arg, i32 poison)
616   ret i1 %val
619 define i1 @test_class_poison_val_f32(i32 %arg) nounwind {
620 ; CHECK-LABEL: @test_class_poison_val_f32(
621 ; CHECK-NEXT:    ret i1 poison
623   %val = call i1 @llvm.amdgcn.class.f32(float poison, i32 %arg)
624   ret i1 %val
627 define i1 @test_class_over_max_mask_f32(float %x) nounwind {
628 ; CHECK-LABEL: @test_class_over_max_mask_f32(
629 ; CHECK-NEXT:    [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 1)
630 ; CHECK-NEXT:    ret i1 [[VAL]]
632   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 1025)
633   ret i1 %val
636 define i1 @test_class_no_mask_f32(float %x) nounwind {
637 ; CHECK-LABEL: @test_class_no_mask_f32(
638 ; CHECK-NEXT:    ret i1 false
640   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 0)
641   ret i1 %val
644 define i1 @test_class_full_mask_f32(float %x) nounwind {
645 ; CHECK-LABEL: @test_class_full_mask_f32(
646 ; CHECK-NEXT:    ret i1 true
648   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 1023)
649   ret i1 %val
652 define i1 @test_class_undef_no_mask_f32() nounwind {
653 ; CHECK-LABEL: @test_class_undef_no_mask_f32(
654 ; CHECK-NEXT:    ret i1 false
656   %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 0)
657   ret i1 %val
660 define i1 @test_class_undef_full_mask_f32() nounwind {
661 ; CHECK-LABEL: @test_class_undef_full_mask_f32(
662 ; CHECK-NEXT:    ret i1 true
664   %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 1023)
665   ret i1 %val
668 define i1 @test_class_undef_val_f32() nounwind {
669 ; CHECK-LABEL: @test_class_undef_val_f32(
670 ; CHECK-NEXT:    ret i1 undef
672   %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 4)
673   ret i1 %val
676 define i1 @test_class_undef_val_f32_var(i32 %arg) nounwind {
677 ; CHECK-LABEL: @test_class_undef_val_f32_var(
678 ; CHECK-NEXT:    [[VAL:%.*]] = icmp ne i32 [[ARG:%.*]], 0
679 ; CHECK-NEXT:    ret i1 [[VAL]]
681   %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 %arg)
682   ret i1 %val
685 define i1 @test_class_val_undef_f32(float %arg) nounwind {
686 ; CHECK-LABEL: @test_class_val_undef_f32(
687 ; CHECK-NEXT:    ret i1 false
689   %val = call i1 @llvm.amdgcn.class.f32(float %arg, i32 undef)
690   ret i1 %val
693 define i1 @test_class_undef_undef_f32() nounwind {
694 ; CHECK-LABEL: @test_class_undef_undef_f32(
695 ; CHECK-NEXT:    ret i1 false
697   %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 undef)
698   ret i1 %val
701 define i1 @test_class_var_mask_f32(float %x, i32 %mask) nounwind {
702 ; CHECK-LABEL: @test_class_var_mask_f32(
703 ; CHECK-NEXT:    [[VAL:%.*]] = call i1 @llvm.amdgcn.class.f32(float [[X:%.*]], i32 [[MASK:%.*]])
704 ; CHECK-NEXT:    ret i1 [[VAL]]
706   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 %mask)
707   ret i1 %val
710 define i1 @test_class_isnan_f32(float %x) nounwind {
711 ; CHECK-LABEL: @test_class_isnan_f32(
712 ; CHECK-NEXT:    [[VAL:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
713 ; CHECK-NEXT:    ret i1 [[VAL]]
715   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 3)
716   ret i1 %val
719 define i1 @test_class_isnan_f32_strict(float %x) nounwind strictfp {
720 ; CHECK-LABEL: @test_class_isnan_f32_strict(
721 ; CHECK-NEXT:    [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 3) #[[ATTR16:[0-9]+]]
722 ; CHECK-NEXT:    ret i1 [[VAL]]
724   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 3) strictfp
725   ret i1 %val
728 define i1 @test_class_is_p0_n0_f32(float %x) nounwind {
729 ; CHECK-LABEL: @test_class_is_p0_n0_f32(
730 ; CHECK-NEXT:    [[VAL:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
731 ; CHECK-NEXT:    ret i1 [[VAL]]
733   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 96)
734   ret i1 %val
737 define i1 @test_class_is_p0_n0_f32_strict(float %x) nounwind strictfp {
738 ; CHECK-LABEL: @test_class_is_p0_n0_f32_strict(
739 ; CHECK-NEXT:    [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 96) #[[ATTR16]]
740 ; CHECK-NEXT:    ret i1 [[VAL]]
742   %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 96) strictfp
743   ret i1 %val
746 define i1 @test_constant_class_snan_test_snan_f64() nounwind {
747 ; CHECK-LABEL: @test_constant_class_snan_test_snan_f64(
748 ; CHECK-NEXT:    ret i1 true
750   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000001, i32 1)
751   ret i1 %val
754 define i1 @test_constant_class_qnan_test_qnan_f64() nounwind {
755 ; CHECK-LABEL: @test_constant_class_qnan_test_qnan_f64(
756 ; CHECK-NEXT:    ret i1 true
758   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 2)
759   ret i1 %val
762 define i1 @test_constant_class_qnan_test_snan_f64() nounwind {
763 ; CHECK-LABEL: @test_constant_class_qnan_test_snan_f64(
764 ; CHECK-NEXT:    ret i1 false
766   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 1)
767   ret i1 %val
770 define i1 @test_constant_class_ninf_test_ninf_f64() nounwind {
771 ; CHECK-LABEL: @test_constant_class_ninf_test_ninf_f64(
772 ; CHECK-NEXT:    ret i1 true
774   %val = call i1 @llvm.amdgcn.class.f64(double 0xFFF0000000000000, i32 4)
775   ret i1 %val
778 define i1 @test_constant_class_pinf_test_ninf_f64() nounwind {
779 ; CHECK-LABEL: @test_constant_class_pinf_test_ninf_f64(
780 ; CHECK-NEXT:    ret i1 false
782   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000000, i32 4)
783   ret i1 %val
786 define i1 @test_constant_class_qnan_test_ninf_f64() nounwind {
787 ; CHECK-LABEL: @test_constant_class_qnan_test_ninf_f64(
788 ; CHECK-NEXT:    ret i1 false
790   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 4)
791   ret i1 %val
794 define i1 @test_constant_class_snan_test_ninf_f64() nounwind {
795 ; CHECK-LABEL: @test_constant_class_snan_test_ninf_f64(
796 ; CHECK-NEXT:    ret i1 false
798   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000001, i32 4)
799   ret i1 %val
802 define i1 @test_constant_class_nnormal_test_nnormal_f64() nounwind {
803 ; CHECK-LABEL: @test_constant_class_nnormal_test_nnormal_f64(
804 ; CHECK-NEXT:    ret i1 true
806   %val = call i1 @llvm.amdgcn.class.f64(double -1.0, i32 8)
807   ret i1 %val
810 define i1 @test_constant_class_pnormal_test_nnormal_f64() nounwind {
811 ; CHECK-LABEL: @test_constant_class_pnormal_test_nnormal_f64(
812 ; CHECK-NEXT:    ret i1 false
814   %val = call i1 @llvm.amdgcn.class.f64(double 1.0, i32 8)
815   ret i1 %val
818 define i1 @test_constant_class_nsubnormal_test_nsubnormal_f64() nounwind {
819 ; CHECK-LABEL: @test_constant_class_nsubnormal_test_nsubnormal_f64(
820 ; CHECK-NEXT:    ret i1 true
822   %val = call i1 @llvm.amdgcn.class.f64(double 0x800fffffffffffff, i32 16)
823   ret i1 %val
826 define i1 @test_constant_class_psubnormal_test_nsubnormal_f64() nounwind {
827 ; CHECK-LABEL: @test_constant_class_psubnormal_test_nsubnormal_f64(
828 ; CHECK-NEXT:    ret i1 false
830   %val = call i1 @llvm.amdgcn.class.f64(double 0x000fffffffffffff, i32 16)
831   ret i1 %val
834 define i1 @test_constant_class_nzero_test_nzero_f64() nounwind {
835 ; CHECK-LABEL: @test_constant_class_nzero_test_nzero_f64(
836 ; CHECK-NEXT:    ret i1 true
838   %val = call i1 @llvm.amdgcn.class.f64(double -0.0, i32 32)
839   ret i1 %val
842 define i1 @test_constant_class_pzero_test_nzero_f64() nounwind {
843 ; CHECK-LABEL: @test_constant_class_pzero_test_nzero_f64(
844 ; CHECK-NEXT:    ret i1 false
846   %val = call i1 @llvm.amdgcn.class.f64(double 0.0, i32 32)
847   ret i1 %val
850 define i1 @test_constant_class_pzero_test_pzero_f64() nounwind {
851 ; CHECK-LABEL: @test_constant_class_pzero_test_pzero_f64(
852 ; CHECK-NEXT:    ret i1 true
854   %val = call i1 @llvm.amdgcn.class.f64(double 0.0, i32 64)
855   ret i1 %val
858 define i1 @test_constant_class_nzero_test_pzero_f64() nounwind {
859 ; CHECK-LABEL: @test_constant_class_nzero_test_pzero_f64(
860 ; CHECK-NEXT:    ret i1 false
862   %val = call i1 @llvm.amdgcn.class.f64(double -0.0, i32 64)
863   ret i1 %val
866 define i1 @test_constant_class_psubnormal_test_psubnormal_f64() nounwind {
867 ; CHECK-LABEL: @test_constant_class_psubnormal_test_psubnormal_f64(
868 ; CHECK-NEXT:    ret i1 true
870   %val = call i1 @llvm.amdgcn.class.f64(double 0x000fffffffffffff, i32 128)
871   ret i1 %val
874 define i1 @test_constant_class_nsubnormal_test_psubnormal_f64() nounwind {
875 ; CHECK-LABEL: @test_constant_class_nsubnormal_test_psubnormal_f64(
876 ; CHECK-NEXT:    ret i1 false
878   %val = call i1 @llvm.amdgcn.class.f64(double 0x800fffffffffffff, i32 128)
879   ret i1 %val
882 define i1 @test_constant_class_pnormal_test_pnormal_f64() nounwind {
883 ; CHECK-LABEL: @test_constant_class_pnormal_test_pnormal_f64(
884 ; CHECK-NEXT:    ret i1 true
886   %val = call i1 @llvm.amdgcn.class.f64(double 1.0, i32 256)
887   ret i1 %val
890 define i1 @test_constant_class_nnormal_test_pnormal_f64() nounwind {
891 ; CHECK-LABEL: @test_constant_class_nnormal_test_pnormal_f64(
892 ; CHECK-NEXT:    ret i1 false
894   %val = call i1 @llvm.amdgcn.class.f64(double -1.0, i32 256)
895   ret i1 %val
898 define i1 @test_constant_class_pinf_test_pinf_f64() nounwind {
899 ; CHECK-LABEL: @test_constant_class_pinf_test_pinf_f64(
900 ; CHECK-NEXT:    ret i1 true
902   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000000, i32 512)
903   ret i1 %val
906 define i1 @test_constant_class_ninf_test_pinf_f64() nounwind {
907 ; CHECK-LABEL: @test_constant_class_ninf_test_pinf_f64(
908 ; CHECK-NEXT:    ret i1 false
910   %val = call i1 @llvm.amdgcn.class.f64(double 0xFFF0000000000000, i32 512)
911   ret i1 %val
914 define i1 @test_constant_class_qnan_test_pinf_f64() nounwind {
915 ; CHECK-LABEL: @test_constant_class_qnan_test_pinf_f64(
916 ; CHECK-NEXT:    ret i1 false
918   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 512)
919   ret i1 %val
922 define i1 @test_constant_class_snan_test_pinf_f64() nounwind {
923 ; CHECK-LABEL: @test_constant_class_snan_test_pinf_f64(
924 ; CHECK-NEXT:    ret i1 false
926   %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000001, i32 512)
927   ret i1 %val
930 define i1 @test_class_is_snan_nnan_src(float %x) {
931 ; CHECK-LABEL: @test_class_is_snan_nnan_src(
932 ; CHECK-NEXT:    ret i1 false
934   %nnan = fadd nnan float %x, 1.0
935   %class = call i1 @llvm.amdgcn.class.f32(float %nnan, i32 1)
936   ret i1 %class
939 define i1 @test_class_is_qnan_nnan_src(float %x) {
940 ; CHECK-LABEL: @test_class_is_qnan_nnan_src(
941 ; CHECK-NEXT:    ret i1 false
943   %nnan = fadd nnan float %x, 1.0
944   %class = call i1 @llvm.amdgcn.class.f32(float %nnan, i32 2)
945   ret i1 %class
948 define i1 @test_class_is_nan_nnan_src(float %x) {
949 ; CHECK-LABEL: @test_class_is_nan_nnan_src(
950 ; CHECK-NEXT:    ret i1 false
952   %nnan = fadd nnan float %x, 1.0
953   %class = call i1 @llvm.amdgcn.class.f32(float %nnan, i32 3)
954   ret i1 %class
957 define i1 @test_class_is_nan_other_nnan_src(float %x) {
958 ; CHECK-LABEL: @test_class_is_nan_other_nnan_src(
959 ; CHECK-NEXT:    [[NNAN:%.*]] = fadd nnan float [[X:%.*]], 1.000000e+00
960 ; CHECK-NEXT:    [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NNAN]], i32 264)
961 ; CHECK-NEXT:    ret i1 [[CLASS]]
963   %nnan = fadd nnan float %x, 1.0
964   %class = call i1 @llvm.amdgcn.class.f32(float %nnan, i32 267)
965   ret i1 %class
968 ; --------------------------------------------------------------------
969 ; llvm.amdgcn.cos
970 ; --------------------------------------------------------------------
971 declare float @llvm.amdgcn.cos.f32(float) nounwind readnone
972 declare float @llvm.fabs.f32(float) nounwind readnone
974 define float @cos_fneg_f32(float %x) {
975 ; CHECK-LABEL: @cos_fneg_f32(
976 ; CHECK-NEXT:    [[COS:%.*]] = call float @llvm.amdgcn.cos.f32(float [[X:%.*]])
977 ; CHECK-NEXT:    ret float [[COS]]
979   %x.fneg = fsub float -0.0, %x
980   %cos = call float @llvm.amdgcn.cos.f32(float %x.fneg)
981   ret float %cos
984 define float @cos_unary_fneg_f32(float %x) {
985 ; CHECK-LABEL: @cos_unary_fneg_f32(
986 ; CHECK-NEXT:    [[COS:%.*]] = call float @llvm.amdgcn.cos.f32(float [[X:%.*]])
987 ; CHECK-NEXT:    ret float [[COS]]
989   %x.fneg = fneg float %x
990   %cos = call float @llvm.amdgcn.cos.f32(float %x.fneg)
991   ret float %cos
994 define float @cos_fabs_f32(float %x) {
995 ; CHECK-LABEL: @cos_fabs_f32(
996 ; CHECK-NEXT:    [[COS:%.*]] = call float @llvm.amdgcn.cos.f32(float [[X:%.*]])
997 ; CHECK-NEXT:    ret float [[COS]]
999   %x.fabs = call float @llvm.fabs.f32(float %x)
1000   %cos = call float @llvm.amdgcn.cos.f32(float %x.fabs)
1001   ret float %cos
1004 define float @cos_fabs_fneg_f32(float %x) {
1005 ; CHECK-LABEL: @cos_fabs_fneg_f32(
1006 ; CHECK-NEXT:    [[COS:%.*]] = call float @llvm.amdgcn.cos.f32(float [[X:%.*]])
1007 ; CHECK-NEXT:    ret float [[COS]]
1009   %x.fabs = call float @llvm.fabs.f32(float %x)
1010   %x.fabs.fneg = fsub float -0.0, %x.fabs
1011   %cos = call float @llvm.amdgcn.cos.f32(float %x.fabs.fneg)
1012   ret float %cos
1015 define float @cos_fabs_unary_fneg_f32(float %x) {
1016 ; CHECK-LABEL: @cos_fabs_unary_fneg_f32(
1017 ; CHECK-NEXT:    [[COS:%.*]] = call float @llvm.amdgcn.cos.f32(float [[X:%.*]])
1018 ; CHECK-NEXT:    ret float [[COS]]
1020   %x.fabs = call float @llvm.fabs.f32(float %x)
1021   %x.fabs.fneg = fneg float %x.fabs
1022   %cos = call float @llvm.amdgcn.cos.f32(float %x.fabs.fneg)
1023   ret float %cos
1027 ; --------------------------------------------------------------------
1028 ; llvm.amdgcn.sin
1029 ; --------------------------------------------------------------------
1030 declare float @llvm.amdgcn.sin.f32(float) nounwind readnone
1032 define float @sin_fneg_f32(float %x) {
1033 ; CHECK-LABEL: @sin_fneg_f32(
1034 ; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X:%.*]])
1035 ; CHECK-NEXT:    [[SIN:%.*]] = fneg float [[TMP1]]
1036 ; CHECK-NEXT:    ret float [[SIN]]
1038   %x.fneg = fneg float %x
1039   %sin = call float @llvm.amdgcn.sin.f32(float %x.fneg)
1040   ret float %sin
1043 define float @sin_fabs_f32(float %x) {
1044 ; CHECK-LABEL: @sin_fabs_f32(
1045 ; CHECK-NEXT:    [[X_FABS:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
1046 ; CHECK-NEXT:    [[SIN:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X_FABS]])
1047 ; CHECK-NEXT:    ret float [[SIN]]
1049   %x.fabs = call float @llvm.fabs.f32(float %x)
1050   %sin = call float @llvm.amdgcn.sin.f32(float %x.fabs)
1051   ret float %sin
1054 define float @sin_fabs_fneg_f32(float %x) {
1055 ; CHECK-LABEL: @sin_fabs_fneg_f32(
1056 ; CHECK-NEXT:    [[X_FABS:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
1057 ; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.amdgcn.sin.f32(float [[X_FABS]])
1058 ; CHECK-NEXT:    [[SIN:%.*]] = fneg float [[TMP1]]
1059 ; CHECK-NEXT:    ret float [[SIN]]
1061   %x.fabs = call float @llvm.fabs.f32(float %x)
1062   %x.fabs.fneg = fneg float %x.fabs
1063   %sin = call float @llvm.amdgcn.sin.f32(float %x.fabs.fneg)
1064   ret float %sin
1067 define float @sin_fabs_fneg_fast_f32(float %x) {
1068 ; CHECK-LABEL: @sin_fabs_fneg_fast_f32(
1069 ; CHECK-NEXT:    [[X_FABS:%.*]] = call fast float @llvm.fabs.f32(float [[X:%.*]])
1070 ; CHECK-NEXT:    [[TMP1:%.*]] = call fast float @llvm.amdgcn.sin.f32(float [[X_FABS]])
1071 ; CHECK-NEXT:    [[SIN:%.*]] = fneg fast float [[TMP1]]
1072 ; CHECK-NEXT:    ret float [[SIN]]
1074   %x.fabs = call fast float @llvm.fabs.f32(float %x)
1075   %x.fabs.fneg = fneg float %x.fabs
1076   %sin = call fast float @llvm.amdgcn.sin.f32(float %x.fabs.fneg)
1077   ret float %sin
1080 ; --------------------------------------------------------------------
1081 ; llvm.amdgcn.cvt.pkrtz
1082 ; --------------------------------------------------------------------
1084 declare <2 x half> @llvm.amdgcn.cvt.pkrtz(float, float) nounwind readnone
1086 define <2 x half> @vars_lhs_cvt_pkrtz(float %x, float %y) {
1087 ; CHECK-LABEL: @vars_lhs_cvt_pkrtz(
1088 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float [[X:%.*]], float [[Y:%.*]])
1089 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1091   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %x, float %y)
1092   ret <2 x half> %cvt
1095 define <2 x half> @constant_lhs_cvt_pkrtz(float %y) {
1096 ; CHECK-LABEL: @constant_lhs_cvt_pkrtz(
1097 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 0.000000e+00, float [[Y:%.*]])
1098 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1100   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 0.0, float %y)
1101   ret <2 x half> %cvt
1104 define <2 x half> @constant_rhs_cvt_pkrtz(float %x) {
1105 ; CHECK-LABEL: @constant_rhs_cvt_pkrtz(
1106 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float [[X:%.*]], float 0.000000e+00)
1107 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1109   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %x, float 0.0)
1110   ret <2 x half> %cvt
1113 define <2 x half> @undef_lhs_cvt_pkrtz(float %y) {
1114 ; CHECK-LABEL: @undef_lhs_cvt_pkrtz(
1115 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float undef, float [[Y:%.*]])
1116 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1118   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float undef, float %y)
1119   ret <2 x half> %cvt
1122 define <2 x half> @undef_rhs_cvt_pkrtz(float %x) {
1123 ; CHECK-LABEL: @undef_rhs_cvt_pkrtz(
1124 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float [[X:%.*]], float undef)
1125 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1127   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %x, float undef)
1128   ret <2 x half> %cvt
1131 define <2 x half> @undef_cvt_pkrtz() {
1132 ; CHECK-LABEL: @undef_cvt_pkrtz(
1133 ; CHECK-NEXT:    ret <2 x half> undef
1135   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float undef, float undef)
1136   ret <2 x half> %cvt
1139 define <2 x half> @constant_splat0_cvt_pkrtz() {
1140 ; CHECK-LABEL: @constant_splat0_cvt_pkrtz(
1141 ; CHECK-NEXT:    ret <2 x half> zeroinitializer
1143   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 0.0, float 0.0)
1144   ret <2 x half> %cvt
1147 define <2 x half> @constant_cvt_pkrtz() {
1148 ; CHECK-LABEL: @constant_cvt_pkrtz(
1149 ; CHECK-NEXT:    ret <2 x half> <half 0xH4000, half 0xH4400>
1151   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 2.0, float 4.0)
1152   ret <2 x half> %cvt
1155 ; Test constant values where rtz changes result
1156 define <2 x half> @constant_rtz_pkrtz() {
1157 ; CHECK-LABEL: @constant_rtz_pkrtz(
1158 ; CHECK-NEXT:    ret <2 x half> splat (half 0xH7BFF)
1160   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 65535.0, float 65535.0)
1161   ret <2 x half> %cvt
1164 define <2 x half> @fpext_const_cvt_pkrtz(half %x) {
1165 ; CHECK-LABEL: @fpext_const_cvt_pkrtz(
1166 ; CHECK-NEXT:    [[CVT:%.*]] = insertelement <2 x half> <half poison, half 0xH4200>, half [[X:%.*]], i64 0
1167 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1169   %ext = fpext half %x to float
1170   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %ext, float 3.0)
1171   ret <2 x half> %cvt
1174 define <2 x half> @const_fpext_cvt_pkrtz(half %y) {
1175 ; CHECK-LABEL: @const_fpext_cvt_pkrtz(
1176 ; CHECK-NEXT:    [[CVT:%.*]] = insertelement <2 x half> <half 0xH4500, half poison>, half [[Y:%.*]], i64 1
1177 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1179   %ext = fpext half %y to float
1180   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 5.0, float %ext)
1181   ret <2 x half> %cvt
1184 define <2 x half> @const_fpext_multi_cvt_pkrtz(half %y) {
1185 ; CHECK-LABEL: @const_fpext_multi_cvt_pkrtz(
1186 ; CHECK-NEXT:    [[CVT1:%.*]] = insertelement <2 x half> <half 0xH4500, half poison>, half [[Y:%.*]], i64 1
1187 ; CHECK-NEXT:    [[CVT2:%.*]] = insertelement <2 x half> <half 0xH4200, half poison>, half [[Y]], i64 1
1188 ; CHECK-NEXT:    [[ADD:%.*]] = fadd <2 x half> [[CVT1]], [[CVT2]]
1189 ; CHECK-NEXT:    ret <2 x half> [[ADD]]
1191   %ext = fpext half %y to float
1192   %cvt1 = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 5.0, float %ext)
1193   %cvt2 = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float 3.0, float %ext)
1194   %add = fadd <2 x half> %cvt1, %cvt2
1195   ret <2 x half> %add
1198 define <2 x half> @fpext_fpext_cvt_pkrtz(half %x, half %y) {
1199 ; CHECK-LABEL: @fpext_fpext_cvt_pkrtz(
1200 ; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x half> poison, half [[X:%.*]], i64 0
1201 ; CHECK-NEXT:    [[CVT:%.*]] = insertelement <2 x half> [[TMP1]], half [[Y:%.*]], i64 1
1202 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1204   %extx = fpext half %x to float
1205   %exty = fpext half %y to float
1206   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %extx, float %exty)
1207   ret <2 x half> %cvt
1210 define <2 x half> @fpext_fpext_bf16_cvt_pkrtz(bfloat %x, bfloat %y) {
1211 ; CHECK-LABEL: @fpext_fpext_bf16_cvt_pkrtz(
1212 ; CHECK-NEXT:    [[EXTX:%.*]] = fpext bfloat [[X:%.*]] to float
1213 ; CHECK-NEXT:    [[EXTY:%.*]] = fpext bfloat [[Y:%.*]] to float
1214 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float [[EXTX]], float [[EXTY]])
1215 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1217   %extx = fpext bfloat %x to float
1218   %exty = fpext bfloat %y to float
1219   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %extx, float %exty)
1220   ret <2 x half> %cvt
1223 define <2 x half> @poison_fpext_cvt_pkrtz(half %y) {
1224 ; CHECK-LABEL: @poison_fpext_cvt_pkrtz(
1225 ; CHECK-NEXT:    [[CVT:%.*]] = insertelement <2 x half> poison, half [[Y:%.*]], i64 1
1226 ; CHECK-NEXT:    ret <2 x half> [[CVT]]
1228   %ext = fpext half %y to float
1229   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float poison, float %ext)
1230   ret <2 x half> %cvt
1233 define <2 x half> @fpext_poison_cvt_pkrtz(half %x) {
1234 ; CHECK-LABEL: @fpext_poison_cvt_pkrtz(
1235 ; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x half> poison, half [[X:%.*]], i64 0
1236 ; CHECK-NEXT:    ret <2 x half> [[TMP1]]
1238   %ext = fpext half %x to float
1239   %cvt = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %ext, float poison)
1240   ret <2 x half> %cvt
1243 ; --------------------------------------------------------------------
1244 ; llvm.amdgcn.cvt.pknorm.i16
1245 ; --------------------------------------------------------------------
1247 declare <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float, float) nounwind readnone
1249 define <2 x i16> @undef_lhs_cvt_pknorm_i16(float %y) {
1250 ; CHECK-LABEL: @undef_lhs_cvt_pknorm_i16(
1251 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float undef, float [[Y:%.*]])
1252 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1254   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float undef, float %y)
1255   ret <2 x i16> %cvt
1258 define <2 x i16> @undef_rhs_cvt_pknorm_i16(float %x) {
1259 ; CHECK-LABEL: @undef_rhs_cvt_pknorm_i16(
1260 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float [[X:%.*]], float undef)
1261 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1263   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float %x, float undef)
1264   ret <2 x i16> %cvt
1267 define <2 x i16> @undef_cvt_pknorm_i16() {
1268 ; CHECK-LABEL: @undef_cvt_pknorm_i16(
1269 ; CHECK-NEXT:    ret <2 x i16> undef
1271   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float undef, float undef)
1272   ret <2 x i16> %cvt
1275 ; --------------------------------------------------------------------
1276 ; llvm.amdgcn.cvt.pknorm.u16
1277 ; --------------------------------------------------------------------
1279 declare <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float, float) nounwind readnone
1281 define <2 x i16> @undef_lhs_cvt_pknorm_u16(float %y) {
1282 ; CHECK-LABEL: @undef_lhs_cvt_pknorm_u16(
1283 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float undef, float [[Y:%.*]])
1284 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1286   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float undef, float %y)
1287   ret <2 x i16> %cvt
1290 define <2 x i16> @undef_rhs_cvt_pknorm_u16(float %x) {
1291 ; CHECK-LABEL: @undef_rhs_cvt_pknorm_u16(
1292 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float [[X:%.*]], float undef)
1293 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1295   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float %x, float undef)
1296   ret <2 x i16> %cvt
1299 define <2 x i16> @undef_cvt_pknorm_u16() {
1300 ; CHECK-LABEL: @undef_cvt_pknorm_u16(
1301 ; CHECK-NEXT:    ret <2 x i16> undef
1303   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float undef, float undef)
1304   ret <2 x i16> %cvt
1307 ; --------------------------------------------------------------------
1308 ; llvm.amdgcn.cvt.pk.i16
1309 ; --------------------------------------------------------------------
1311 declare <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32, i32) nounwind readnone
1313 define <2 x i16> @undef_lhs_cvt_pk_i16(i32 %y) {
1314 ; CHECK-LABEL: @undef_lhs_cvt_pk_i16(
1315 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 undef, i32 [[Y:%.*]])
1316 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1318   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 undef, i32 %y)
1319   ret <2 x i16> %cvt
1322 define <2 x i16> @undef_rhs_cvt_pk_i16(i32 %x) {
1323 ; CHECK-LABEL: @undef_rhs_cvt_pk_i16(
1324 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 [[X:%.*]], i32 undef)
1325 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1327   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 %x, i32 undef)
1328   ret <2 x i16> %cvt
1331 define <2 x i16> @undef_cvt_pk_i16() {
1332 ; CHECK-LABEL: @undef_cvt_pk_i16(
1333 ; CHECK-NEXT:    ret <2 x i16> undef
1335   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 undef, i32 undef)
1336   ret <2 x i16> %cvt
1339 ; --------------------------------------------------------------------
1340 ; llvm.amdgcn.cvt.pk.u16
1341 ; --------------------------------------------------------------------
1343 declare <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32, i32) nounwind readnone
1345 define <2 x i16> @undef_lhs_cvt_pk_u16(i32 %y) {
1346 ; CHECK-LABEL: @undef_lhs_cvt_pk_u16(
1347 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 undef, i32 [[Y:%.*]])
1348 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1350   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 undef, i32 %y)
1351   ret <2 x i16> %cvt
1354 define <2 x i16> @undef_rhs_cvt_pk_u16(i32 %x) {
1355 ; CHECK-LABEL: @undef_rhs_cvt_pk_u16(
1356 ; CHECK-NEXT:    [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 [[X:%.*]], i32 undef)
1357 ; CHECK-NEXT:    ret <2 x i16> [[CVT]]
1359   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 %x, i32 undef)
1360   ret <2 x i16> %cvt
1363 define <2 x i16> @undef_cvt_pk_u16() {
1364 ; CHECK-LABEL: @undef_cvt_pk_u16(
1365 ; CHECK-NEXT:    ret <2 x i16> undef
1367   %cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 undef, i32 undef)
1368   ret <2 x i16> %cvt
1371 ; --------------------------------------------------------------------
1372 ; llvm.amdgcn.ubfe
1373 ; --------------------------------------------------------------------
1375 declare i32 @llvm.amdgcn.ubfe.i32(i32, i32, i32) nounwind readnone
1376 declare i64 @llvm.amdgcn.ubfe.i64(i64, i32, i32) nounwind readnone
1378 define i32 @ubfe_var_i32(i32 %src, i32 %offset, i32 %width) {
1379 ; CHECK-LABEL: @ubfe_var_i32(
1380 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 [[OFFSET:%.*]], i32 [[WIDTH:%.*]])
1381 ; CHECK-NEXT:    ret i32 [[BFE]]
1383   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 %offset, i32 %width)
1384   ret i32 %bfe
1387 define i32 @ubfe_clear_high_bits_constant_offset_i32(i32 %src, i32 %width) {
1388 ; CHECK-LABEL: @ubfe_clear_high_bits_constant_offset_i32(
1389 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 5, i32 [[WIDTH:%.*]])
1390 ; CHECK-NEXT:    ret i32 [[BFE]]
1392   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 133, i32 %width)
1393   ret i32 %bfe
1396 define i32 @ubfe_clear_high_bits_constant_width_i32(i32 %src, i32 %offset) {
1397 ; CHECK-LABEL: @ubfe_clear_high_bits_constant_width_i32(
1398 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 [[OFFSET:%.*]], i32 5)
1399 ; CHECK-NEXT:    ret i32 [[BFE]]
1401   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 %offset, i32 133)
1402   ret i32 %bfe
1405 define i32 @ubfe_width_0(i32 %src, i32 %offset) {
1406 ; CHECK-LABEL: @ubfe_width_0(
1407 ; CHECK-NEXT:    ret i32 0
1409   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 %offset, i32 0)
1410   ret i32 %bfe
1413 define i32 @ubfe_width_31(i32 %src, i32 %offset) {
1414 ; CHECK-LABEL: @ubfe_width_31(
1415 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 [[OFFSET:%.*]], i32 31)
1416 ; CHECK-NEXT:    ret i32 [[BFE]]
1418   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 %offset, i32 31)
1419   ret i32 %bfe
1422 define i32 @ubfe_width_32(i32 %src, i32 %offset) {
1423 ; CHECK-LABEL: @ubfe_width_32(
1424 ; CHECK-NEXT:    ret i32 0
1426   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 %offset, i32 32)
1427   ret i32 %bfe
1430 define i32 @ubfe_width_33(i32 %src, i32 %offset) {
1431 ; CHECK-LABEL: @ubfe_width_33(
1432 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 [[OFFSET:%.*]], i32 1)
1433 ; CHECK-NEXT:    ret i32 [[BFE]]
1435   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 %offset, i32 33)
1436   ret i32 %bfe
1439 define i32 @ubfe_offset_33(i32 %src, i32 %width) {
1440 ; CHECK-LABEL: @ubfe_offset_33(
1441 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 1, i32 [[WIDTH:%.*]])
1442 ; CHECK-NEXT:    ret i32 [[BFE]]
1444   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 33, i32 %width)
1445   ret i32 %bfe
1448 define i32 @ubfe_offset_0(i32 %src, i32 %width) {
1449 ; CHECK-LABEL: @ubfe_offset_0(
1450 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 0, i32 [[WIDTH:%.*]])
1451 ; CHECK-NEXT:    ret i32 [[BFE]]
1453   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 0, i32 %width)
1454   ret i32 %bfe
1457 define i32 @ubfe_offset_32(i32 %src, i32 %width) {
1458 ; CHECK-LABEL: @ubfe_offset_32(
1459 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 0, i32 [[WIDTH:%.*]])
1460 ; CHECK-NEXT:    ret i32 [[BFE]]
1462   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 32, i32 %width)
1463   ret i32 %bfe
1466 define i32 @ubfe_offset_31(i32 %src, i32 %width) {
1467 ; CHECK-LABEL: @ubfe_offset_31(
1468 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 31, i32 [[WIDTH:%.*]])
1469 ; CHECK-NEXT:    ret i32 [[BFE]]
1471   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 31, i32 %width)
1472   ret i32 %bfe
1475 define i32 @ubfe_offset_0_width_0(i32 %src) {
1476 ; CHECK-LABEL: @ubfe_offset_0_width_0(
1477 ; CHECK-NEXT:    ret i32 0
1479   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 0, i32 0)
1480   ret i32 %bfe
1483 define i32 @ubfe_offset_0_width_3(i32 %src) {
1484 ; CHECK-LABEL: @ubfe_offset_0_width_3(
1485 ; CHECK-NEXT:    [[BFE:%.*]] = and i32 [[SRC:%.*]], 7
1486 ; CHECK-NEXT:    ret i32 [[BFE]]
1488   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 0, i32 3)
1489   ret i32 %bfe
1492 define i32 @ubfe_offset_3_width_1(i32 %src) {
1493 ; CHECK-LABEL: @ubfe_offset_3_width_1(
1494 ; CHECK-NEXT:    [[TMP1:%.*]] = lshr i32 [[SRC:%.*]], 3
1495 ; CHECK-NEXT:    [[BFE:%.*]] = and i32 [[TMP1]], 1
1496 ; CHECK-NEXT:    ret i32 [[BFE]]
1498   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 3, i32 1)
1499   ret i32 %bfe
1502 define i32 @ubfe_offset_3_width_4(i32 %src) {
1503 ; CHECK-LABEL: @ubfe_offset_3_width_4(
1504 ; CHECK-NEXT:    [[TMP1:%.*]] = lshr i32 [[SRC:%.*]], 3
1505 ; CHECK-NEXT:    [[BFE:%.*]] = and i32 [[TMP1]], 15
1506 ; CHECK-NEXT:    ret i32 [[BFE]]
1508   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 3, i32 4)
1509   ret i32 %bfe
1512 define i32 @ubfe_0_0_0() {
1513 ; CHECK-LABEL: @ubfe_0_0_0(
1514 ; CHECK-NEXT:    ret i32 0
1516   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 0, i32 0, i32 0)
1517   ret i32 %bfe
1520 define i32 @ubfe_neg1_5_7() {
1521 ; CHECK-LABEL: @ubfe_neg1_5_7(
1522 ; CHECK-NEXT:    ret i32 127
1524   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 -1, i32 5, i32 7)
1525   ret i32 %bfe
1528 define i32 @ubfe_undef_src_i32(i32 %offset, i32 %width) {
1529 ; CHECK-LABEL: @ubfe_undef_src_i32(
1530 ; CHECK-NEXT:    ret i32 undef
1532   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 undef, i32 %offset, i32 %width)
1533   ret i32 %bfe
1536 define i32 @ubfe_undef_offset_i32(i32 %src, i32 %width) {
1537 ; CHECK-LABEL: @ubfe_undef_offset_i32(
1538 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 undef, i32 [[WIDTH:%.*]])
1539 ; CHECK-NEXT:    ret i32 [[BFE]]
1541   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 undef, i32 %width)
1542   ret i32 %bfe
1545 define i32 @ubfe_undef_width_i32(i32 %src, i32 %offset) {
1546 ; CHECK-LABEL: @ubfe_undef_width_i32(
1547 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.ubfe.i32(i32 [[SRC:%.*]], i32 [[OFFSET:%.*]], i32 undef)
1548 ; CHECK-NEXT:    ret i32 [[BFE]]
1550   %bfe = call i32 @llvm.amdgcn.ubfe.i32(i32 %src, i32 %offset, i32 undef)
1551   ret i32 %bfe
1554 define i64 @ubfe_offset_33_width_4_i64(i64 %src) {
1555 ; CHECK-LABEL: @ubfe_offset_33_width_4_i64(
1556 ; CHECK-NEXT:    [[TMP1:%.*]] = lshr i64 [[SRC:%.*]], 33
1557 ; CHECK-NEXT:    [[BFE:%.*]] = and i64 [[TMP1]], 15
1558 ; CHECK-NEXT:    ret i64 [[BFE]]
1560   %bfe = call i64 @llvm.amdgcn.ubfe.i64(i64 %src, i32 33, i32 4)
1561   ret i64 %bfe
1564 define i64 @ubfe_offset_0_i64(i64 %src, i32 %width) {
1565 ; CHECK-LABEL: @ubfe_offset_0_i64(
1566 ; CHECK-NEXT:    [[BFE:%.*]] = call i64 @llvm.amdgcn.ubfe.i64(i64 [[SRC:%.*]], i32 0, i32 [[WIDTH:%.*]])
1567 ; CHECK-NEXT:    ret i64 [[BFE]]
1569   %bfe = call i64 @llvm.amdgcn.ubfe.i64(i64 %src, i32 0, i32 %width)
1570   ret i64 %bfe
1573 define i64 @ubfe_offset_32_width_32_i64(i64 %src) {
1574 ; CHECK-LABEL: @ubfe_offset_32_width_32_i64(
1575 ; CHECK-NEXT:    [[BFE:%.*]] = lshr i64 [[SRC:%.*]], 32
1576 ; CHECK-NEXT:    ret i64 [[BFE]]
1578   %bfe = call i64 @llvm.amdgcn.ubfe.i64(i64 %src, i32 32, i32 32)
1579   ret i64 %bfe
1582 ; --------------------------------------------------------------------
1583 ; llvm.amdgcn.sbfe
1584 ; --------------------------------------------------------------------
1586 declare i32 @llvm.amdgcn.sbfe.i32(i32, i32, i32) nounwind readnone
1587 declare i64 @llvm.amdgcn.sbfe.i64(i64, i32, i32) nounwind readnone
1589 define i32 @sbfe_offset_31(i32 %src, i32 %width) {
1590 ; CHECK-LABEL: @sbfe_offset_31(
1591 ; CHECK-NEXT:    [[BFE:%.*]] = call i32 @llvm.amdgcn.sbfe.i32(i32 [[SRC:%.*]], i32 31, i32 [[WIDTH:%.*]])
1592 ; CHECK-NEXT:    ret i32 [[BFE]]
1594   %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 %src, i32 31, i32 %width)
1595   ret i32 %bfe
1598 define i32 @sbfe_neg1_5_7() {
1599 ; CHECK-LABEL: @sbfe_neg1_5_7(
1600 ; CHECK-NEXT:    ret i32 -1
1602   %bfe = call i32 @llvm.amdgcn.sbfe.i32(i32 -1, i32 5, i32 7)
1603   ret i32 %bfe
1606 define i64 @sbfe_offset_32_width_32_i64(i64 %src) {
1607 ; CHECK-LABEL: @sbfe_offset_32_width_32_i64(
1608 ; CHECK-NEXT:    [[BFE:%.*]] = ashr i64 [[SRC:%.*]], 32
1609 ; CHECK-NEXT:    ret i64 [[BFE]]
1611   %bfe = call i64 @llvm.amdgcn.sbfe.i64(i64 %src, i32 32, i32 32)
1612   ret i64 %bfe
1615 ; --------------------------------------------------------------------
1616 ; llvm.amdgcn.exp
1617 ; --------------------------------------------------------------------
1619 declare void @llvm.amdgcn.exp.f32(i32 immarg, i32 immarg, float, float, float, float, i1 immarg, i1 immarg) nounwind inaccessiblememonly
1624 define void @exp_disabled_inputs_to_undef(float %x, float %y, float %z, float %w) {
1625   ; enable src0..src3 constants
1626 ; CHECK-LABEL: @exp_disabled_inputs_to_undef(
1627 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 1, float 1.000000e+00, float undef, float undef, float undef, i1 true, i1 false)
1628 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 2, float undef, float 2.000000e+00, float undef, float undef, i1 true, i1 false)
1629 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 4, float undef, float undef, float 5.000000e-01, float undef, i1 true, i1 false)
1630 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 8, float undef, float undef, float undef, float 4.000000e+00, i1 true, i1 false)
1631 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 1, float [[X:%.*]], float undef, float undef, float undef, i1 true, i1 false)
1632 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 2, float undef, float [[Y:%.*]], float undef, float undef, i1 true, i1 false)
1633 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 4, float undef, float undef, float [[Z:%.*]], float undef, i1 true, i1 false)
1634 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 8, float undef, float undef, float undef, float [[W:%.*]], i1 true, i1 false)
1635 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float undef, float undef, float undef, float undef, i1 true, i1 false)
1636 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 3, float 1.000000e+00, float 2.000000e+00, float undef, float undef, i1 true, i1 false)
1637 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 5, float 1.000000e+00, float undef, float 5.000000e-01, float undef, i1 true, i1 false)
1638 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 9, float 1.000000e+00, float undef, float undef, float 4.000000e+00, i1 false, i1 false)
1639 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.000000e+00, float 2.000000e+00, float 5.000000e-01, float 4.000000e+00, i1 false, i1 false)
1640 ; CHECK-NEXT:    ret void
1642   call void @llvm.amdgcn.exp.f32(i32 0, i32 1, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
1643   call void @llvm.amdgcn.exp.f32(i32 0, i32 2, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
1644   call void @llvm.amdgcn.exp.f32(i32 0, i32 4, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
1645   call void @llvm.amdgcn.exp.f32(i32 0, i32 8, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
1647   ; enable src0..src3 variables
1648   call void @llvm.amdgcn.exp.f32(i32 0, i32 1, float %x, float %y, float %z, float %w, i1 true, i1 false)
1649   call void @llvm.amdgcn.exp.f32(i32 0, i32 2, float %x, float %y, float %z, float %w, i1 true, i1 false)
1650   call void @llvm.amdgcn.exp.f32(i32 0, i32 4, float %x, float %y, float %z, float %w, i1 true, i1 false)
1651   call void @llvm.amdgcn.exp.f32(i32 0, i32 8, float %x, float %y, float %z, float %w, i1 true, i1 false)
1653   ; enable none
1654   call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float %x, float %y, float %z, float %w, i1 true, i1 false)
1656   ; enable different source combinations
1657   call void @llvm.amdgcn.exp.f32(i32 0, i32 3, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
1658   call void @llvm.amdgcn.exp.f32(i32 0, i32 5, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
1659   call void @llvm.amdgcn.exp.f32(i32 0, i32 9, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
1660   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
1662   ret void
1665 ; --------------------------------------------------------------------
1666 ; llvm.amdgcn.exp.compr
1667 ; --------------------------------------------------------------------
1669 declare void @llvm.amdgcn.exp.compr.v2f16(i32 immarg, i32 immarg, <2 x half>, <2 x half>, i1 immarg, i1 immarg) nounwind inaccessiblememonly
1673 define void @exp_compr_disabled_inputs_to_undef(<2 x half> %xy, <2 x half> %zw) {
1674 ; CHECK-LABEL: @exp_compr_disabled_inputs_to_undef(
1675 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 0, <2 x half> undef, <2 x half> undef, i1 true, i1 false)
1676 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 1, <2 x half> <half 0xH3C00, half 0xH4000>, <2 x half> undef, i1 true, i1 false)
1677 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 2, <2 x half> <half 0xH3C00, half 0xH4000>, <2 x half> undef, i1 true, i1 false)
1678 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> <half 0xH3C00, half 0xH4000>, <2 x half> undef, i1 true, i1 false)
1679 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 0, <2 x half> undef, <2 x half> undef, i1 true, i1 false)
1680 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 1, <2 x half> [[XY:%.*]], <2 x half> undef, i1 true, i1 false)
1681 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 2, <2 x half> [[XY]], <2 x half> undef, i1 true, i1 false)
1682 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> [[XY]], <2 x half> undef, i1 true, i1 false)
1683 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 12, <2 x half> undef, <2 x half> [[ZW:%.*]], i1 true, i1 false)
1684 ; CHECK-NEXT:    call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 15, <2 x half> [[XY]], <2 x half> [[ZW]], i1 true, i1 false)
1685 ; CHECK-NEXT:    ret void
1687   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 0, <2 x half> <half 1.0, half 2.0>, <2 x half> <half 0.5, half 4.0>, i1 true, i1 false)
1688   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 1, <2 x half> <half 1.0, half 2.0>, <2 x half> <half 0.5, half 4.0>, i1 true, i1 false)
1689   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 2, <2 x half> <half 1.0, half 2.0>, <2 x half> <half 0.5, half 4.0>, i1 true, i1 false)
1690   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> <half 1.0, half 2.0>, <2 x half> <half 0.5, half 4.0>, i1 true, i1 false)
1692   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 0, <2 x half> %xy, <2 x half> %zw, i1 true, i1 false)
1693   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 1, <2 x half> %xy, <2 x half> %zw, i1 true, i1 false)
1694   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 2, <2 x half> %xy, <2 x half> %zw, i1 true, i1 false)
1695   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 3, <2 x half> %xy, <2 x half> %zw, i1 true, i1 false)
1697   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 12, <2 x half> %xy, <2 x half> %zw, i1 true, i1 false)
1698   call void @llvm.amdgcn.exp.compr.v2f16(i32 0, i32 15, <2 x half> %xy, <2 x half> %zw, i1 true, i1 false)
1699   ret void
1702 ; --------------------------------------------------------------------
1703 ; llvm.amdgcn.fmed3
1704 ; --------------------------------------------------------------------
1706 declare float @llvm.amdgcn.fmed3.f32(float, float, float) nounwind readnone
1708 define float @fmed3_f32(float %x, float %y, float %z) {
1709 ; CHECK-LABEL: @fmed3_f32(
1710 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X:%.*]], float [[Y:%.*]], float [[Z:%.*]])
1711 ; CHECK-NEXT:    ret float [[MED3]]
1713   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float %z)
1714   ret float %med3
1717 define float @fmed3_canonicalize_x_c0_c1_f32(float %x) {
1718 ; CHECK-LABEL: @fmed3_canonicalize_x_c0_c1_f32(
1719 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X:%.*]], float 0.000000e+00, float 1.000000e+00)
1720 ; CHECK-NEXT:    ret float [[MED3]]
1722   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0.0, float 1.0)
1723   ret float %med3
1726 define float @fmed3_canonicalize_c0_x_c1_f32(float %x) {
1727 ; CHECK-LABEL: @fmed3_canonicalize_c0_x_c1_f32(
1728 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X:%.*]], float 0.000000e+00, float 1.000000e+00)
1729 ; CHECK-NEXT:    ret float [[MED3]]
1731   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %x, float 1.0)
1732   ret float %med3
1735 define float @fmed3_canonicalize_c0_c1_x_f32(float %x) {
1736 ; CHECK-LABEL: @fmed3_canonicalize_c0_c1_x_f32(
1737 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X:%.*]], float 0.000000e+00, float 1.000000e+00)
1738 ; CHECK-NEXT:    ret float [[MED3]]
1740   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %x)
1741   ret float %med3
1744 define float @fmed3_canonicalize_x_y_c_f32(float %x, float %y) {
1745 ; CHECK-LABEL: @fmed3_canonicalize_x_y_c_f32(
1746 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X:%.*]], float [[Y:%.*]], float 1.000000e+00)
1747 ; CHECK-NEXT:    ret float [[MED3]]
1749   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 1.0)
1750   ret float %med3
1753 define float @fmed3_canonicalize_x_c_y_f32(float %x, float %y) {
1754 ; CHECK-LABEL: @fmed3_canonicalize_x_c_y_f32(
1755 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X:%.*]], float [[Y:%.*]], float 1.000000e+00)
1756 ; CHECK-NEXT:    ret float [[MED3]]
1758   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 1.0, float %y)
1759   ret float %med3
1762 define float @fmed3_canonicalize_c_x_y_f32(float %x, float %y) {
1763 ; CHECK-LABEL: @fmed3_canonicalize_c_x_y_f32(
1764 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X:%.*]], float [[Y:%.*]], float 1.000000e+00)
1765 ; CHECK-NEXT:    ret float [[MED3]]
1767   %med3 = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %x, float %y)
1768   ret float %med3
1771 define float @fmed3_undef_x_y_f32(float %x, float %y) {
1772 ; CHECK-LABEL: @fmed3_undef_x_y_f32(
1773 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]])
1774 ; CHECK-NEXT:    ret float [[MED3]]
1776   %med3 = call float @llvm.amdgcn.fmed3.f32(float undef, float %x, float %y)
1777   ret float %med3
1780 define float @fmed3_fmf_undef_x_y_f32(float %x, float %y) {
1781 ; CHECK-LABEL: @fmed3_fmf_undef_x_y_f32(
1782 ; CHECK-NEXT:    [[MED3:%.*]] = call nnan float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]])
1783 ; CHECK-NEXT:    ret float [[MED3]]
1785   %med3 = call nnan float @llvm.amdgcn.fmed3.f32(float undef, float %x, float %y)
1786   ret float %med3
1789 define float @fmed3_x_undef_y_f32(float %x, float %y) {
1790 ; CHECK-LABEL: @fmed3_x_undef_y_f32(
1791 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]])
1792 ; CHECK-NEXT:    ret float [[MED3]]
1794   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float undef, float %y)
1795   ret float %med3
1798 define float @fmed3_x_y_undef_f32(float %x, float %y) {
1799 ; CHECK-LABEL: @fmed3_x_y_undef_f32(
1800 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X:%.*]], float [[Y:%.*]])
1801 ; CHECK-NEXT:    ret float [[MED3]]
1803   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float undef)
1804   ret float %med3
1807 define float @fmed3_qnan0_x_y_f32(float %x, float %y) {
1808 ; CHECK-LABEL: @fmed3_qnan0_x_y_f32(
1809 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]])
1810 ; CHECK-NEXT:    ret float [[MED3]]
1812   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float %x, float %y)
1813   ret float %med3
1816 define float @fmed3_x_qnan0_y_f32(float %x, float %y) {
1817 ; CHECK-LABEL: @fmed3_x_qnan0_y_f32(
1818 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]])
1819 ; CHECK-NEXT:    ret float [[MED3]]
1821   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF8000000000000, float %y)
1822   ret float %med3
1825 define float @fmed3_x_y_qnan0_f32(float %x, float %y) {
1826 ; CHECK-LABEL: @fmed3_x_y_qnan0_f32(
1827 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X:%.*]], float [[Y:%.*]])
1828 ; CHECK-NEXT:    ret float [[MED3]]
1830   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF8000000000000)
1831   ret float %med3
1834 define float @fmed3_qnan1_x_y_f32(float %x, float %y) {
1835 ; CHECK-LABEL: @fmed3_qnan1_x_y_f32(
1836 ; CHECK-NEXT:    [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]])
1837 ; CHECK-NEXT:    ret float [[MED3]]
1839   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000100000000, float %x, float %y)
1840   ret float %med3
1843 ; This can return any of the qnans.
1844 define float @fmed3_qnan0_qnan1_qnan2_f32(float %x, float %y) {
1845 ; CHECK-LABEL: @fmed3_qnan0_qnan1_qnan2_f32(
1846 ; CHECK-NEXT:    ret float 0x7FF8030000000000
1848   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000100000000, float 0x7FF8002000000000, float 0x7FF8030000000000)
1849   ret float %med3
1852 define float @fmed3_constant_src0_0_f32(float %x, float %y) {
1853 ; CHECK-LABEL: @fmed3_constant_src0_0_f32(
1854 ; CHECK-NEXT:    ret float 5.000000e-01
1856   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.5, float -1.0, float 4.0)
1857   ret float %med3
1860 define float @fmed3_constant_src0_1_f32(float %x, float %y) {
1861 ; CHECK-LABEL: @fmed3_constant_src0_1_f32(
1862 ; CHECK-NEXT:    ret float 5.000000e-01
1864   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.5, float 4.0, float -1.0)
1865   ret float %med3
1868 define float @fmed3_constant_src1_0_f32(float %x, float %y) {
1869 ; CHECK-LABEL: @fmed3_constant_src1_0_f32(
1870 ; CHECK-NEXT:    ret float 5.000000e-01
1872   %med3 = call float @llvm.amdgcn.fmed3.f32(float -1.0, float 0.5, float 4.0)
1873   ret float %med3
1876 define float @fmed3_constant_src1_1_f32(float %x, float %y) {
1877 ; CHECK-LABEL: @fmed3_constant_src1_1_f32(
1878 ; CHECK-NEXT:    ret float 5.000000e-01
1880   %med3 = call float @llvm.amdgcn.fmed3.f32(float 4.0, float 0.5, float -1.0)
1881   ret float %med3
1884 define float @fmed3_constant_src2_0_f32(float %x, float %y) {
1885 ; CHECK-LABEL: @fmed3_constant_src2_0_f32(
1886 ; CHECK-NEXT:    ret float 5.000000e-01
1888   %med3 = call float @llvm.amdgcn.fmed3.f32(float -1.0, float 4.0, float 0.5)
1889   ret float %med3
1892 define float @fmed3_constant_src2_1_f32(float %x, float %y) {
1893 ; CHECK-LABEL: @fmed3_constant_src2_1_f32(
1894 ; CHECK-NEXT:    ret float 5.000000e-01
1896   %med3 = call float @llvm.amdgcn.fmed3.f32(float 4.0, float -1.0, float 0.5)
1897   ret float %med3
1900 define float @fmed3_x_qnan0_qnan1_f32(float %x) {
1901 ; CHECK-LABEL: @fmed3_x_qnan0_qnan1_f32(
1902 ; CHECK-NEXT:    ret float [[X:%.*]]
1904   %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF8001000000000, float 0x7FF8002000000000)
1905   ret float %med3
1908 define float @fmed3_qnan0_x_qnan1_f32(float %x) {
1909 ; CHECK-LABEL: @fmed3_qnan0_x_qnan1_f32(
1910 ; CHECK-NEXT:    ret float [[X:%.*]]
1912   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8001000000000, float %x, float 0x7FF8002000000000)
1913   ret float %med3
1916 define float @fmed3_qnan0_qnan1_x_f32(float %x) {
1917 ; CHECK-LABEL: @fmed3_qnan0_qnan1_x_f32(
1918 ; CHECK-NEXT:    ret float [[X:%.*]]
1920   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8001000000000, float 0x7FF8002000000000, float %x)
1921   ret float %med3
1924 define float @fmed3_nan_0_1_f32() {
1925 ; CHECK-LABEL: @fmed3_nan_0_1_f32(
1926 ; CHECK-NEXT:    ret float 0.000000e+00
1928   %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8001000000000, float 0.0, float 1.0)
1929   ret float %med3
1932 define float @fmed3_0_nan_1_f32() {
1933 ; CHECK-LABEL: @fmed3_0_nan_1_f32(
1934 ; CHECK-NEXT:    ret float 0.000000e+00
1936   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 0x7FF8001000000000, float 1.0)
1937   ret float %med
1940 define float @fmed3_0_1_nan_f32() {
1941 ; CHECK-LABEL: @fmed3_0_1_nan_f32(
1942 ; CHECK-NEXT:    ret float 1.000000e+00
1944   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8001000000000)
1945   ret float %med
1948 define float @fmed3_undef_0_1_f32() {
1949 ; CHECK-LABEL: @fmed3_undef_0_1_f32(
1950 ; CHECK-NEXT:    ret float 0.000000e+00
1952   %med3 = call float @llvm.amdgcn.fmed3.f32(float undef, float 0.0, float 1.0)
1953   ret float %med3
1956 define float @fmed3_0_undef_1_f32() {
1957 ; CHECK-LABEL: @fmed3_0_undef_1_f32(
1958 ; CHECK-NEXT:    ret float 0.000000e+00
1960   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float undef, float 1.0)
1961   ret float %med
1964 define float @fmed3_0_1_undef_f32() {
1965 ; CHECK-LABEL: @fmed3_0_1_undef_f32(
1966 ; CHECK-NEXT:    ret float 1.000000e+00
1968   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float undef)
1969   ret float %med
1972 ; --------------------------------------------------------------------
1973 ; llvm.amdgcn.icmp
1974 ; --------------------------------------------------------------------
1976 declare i64 @llvm.amdgcn.icmp.i64.i32(i32, i32, i32 immarg) nounwind readnone convergent
1977 declare i64 @llvm.amdgcn.icmp.i64.i64(i64, i64, i32 immarg) nounwind readnone convergent
1978 declare i64 @llvm.amdgcn.icmp.i64.i1(i1, i1, i32 immarg) nounwind readnone convergent
1980 define i64 @invalid_icmp_code(i32 %a, i32 %b) {
1981 ; CHECK-LABEL: @invalid_icmp_code(
1982 ; CHECK-NEXT:    [[UNDER:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 31)
1983 ; CHECK-NEXT:    [[OVER:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A]], i32 [[B]], i32 42)
1984 ; CHECK-NEXT:    [[OR:%.*]] = or i64 [[UNDER]], [[OVER]]
1985 ; CHECK-NEXT:    ret i64 [[OR]]
1987   %under = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %a, i32 %b, i32 31)
1988   %over = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %a, i32 %b, i32 42)
1989   %or = or i64 %under, %over
1990   ret i64 %or
1993 define i64 @icmp_constant_inputs_false() {
1994 ; CHECK-LABEL: @icmp_constant_inputs_false(
1995 ; CHECK-NEXT:    ret i64 0
1997   %result = call i64 @llvm.amdgcn.icmp.i64.i32(i32 9, i32 8, i32 32)
1998   ret i64 %result
2001 define i64 @icmp_constant_inputs_true() {
2002 ; CHECK-LABEL: @icmp_constant_inputs_true(
2003 ; CHECK-NEXT:    [[RESULT:%.*]] = call i64 @llvm.read_register.i64(metadata [[META0:![0-9]+]]) #[[ATTR17:[0-9]+]]
2004 ; CHECK-NEXT:    ret i64 [[RESULT]]
2006   %result = call i64 @llvm.amdgcn.icmp.i64.i32(i32 9, i32 8, i32 34)
2007   ret i64 %result
2010 define i64 @icmp_constant_to_rhs_slt(i32 %x) {
2011 ; CHECK-LABEL: @icmp_constant_to_rhs_slt(
2012 ; CHECK-NEXT:    [[RESULT:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[X:%.*]], i32 9, i32 38)
2013 ; CHECK-NEXT:    ret i64 [[RESULT]]
2015   %result = call i64 @llvm.amdgcn.icmp.i64.i32(i32 9, i32 %x, i32 40)
2016   ret i64 %result
2019 define i64 @fold_icmp_ne_0_zext_icmp_eq_i32(i32 %a, i32 %b) {
2020 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_eq_i32(
2021 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 32)
2022 ; CHECK-NEXT:    ret i64 [[MASK]]
2024   %cmp = icmp eq i32 %a, %b
2025   %zext.cmp = zext i1 %cmp to i32
2026   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2027   ret i64 %mask
2030 define i64 @fold_icmp_ne_0_zext_icmp_ne_i32(i32 %a, i32 %b) {
2031 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_ne_i32(
2032 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 33)
2033 ; CHECK-NEXT:    ret i64 [[MASK]]
2035   %cmp = icmp ne i32 %a, %b
2036   %zext.cmp = zext i1 %cmp to i32
2037   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2038   ret i64 %mask
2041 define i64 @fold_icmp_ne_0_zext_icmp_sle_i32(i32 %a, i32 %b) {
2042 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_sle_i32(
2043 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 41)
2044 ; CHECK-NEXT:    ret i64 [[MASK]]
2046   %cmp = icmp sle i32 %a, %b
2047   %zext.cmp = zext i1 %cmp to i32
2048   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2049   ret i64 %mask
2052 define i64 @fold_icmp_ne_0_zext_icmp_ugt_i64(i64 %a, i64 %b) {
2053 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_ugt_i64(
2054 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i64(i64 [[A:%.*]], i64 [[B:%.*]], i32 34)
2055 ; CHECK-NEXT:    ret i64 [[MASK]]
2057   %cmp = icmp ugt i64 %a, %b
2058   %zext.cmp = zext i1 %cmp to i32
2059   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2060   ret i64 %mask
2063 define i64 @fold_icmp_ne_0_zext_icmp_ult_swap_i64(i64 %a, i64 %b) {
2064 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_ult_swap_i64(
2065 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i64(i64 [[A:%.*]], i64 [[B:%.*]], i32 34)
2066 ; CHECK-NEXT:    ret i64 [[MASK]]
2068   %cmp = icmp ugt i64 %a, %b
2069   %zext.cmp = zext i1 %cmp to i32
2070   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 0, i32 %zext.cmp, i32 33)
2071   ret i64 %mask
2074 define i64 @fold_icmp_ne_0_zext_fcmp_oeq_f32(float %a, float %b) {
2075 ; CHECK-LABEL: @fold_icmp_ne_0_zext_fcmp_oeq_f32(
2076 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[A:%.*]], float [[B:%.*]], i32 1)
2077 ; CHECK-NEXT:    ret i64 [[MASK]]
2079   %cmp = fcmp oeq float %a, %b
2080   %zext.cmp = zext i1 %cmp to i32
2081   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2082   ret i64 %mask
2085 define i64 @fold_icmp_ne_0_zext_fcmp_une_f32(float %a, float %b) {
2086 ; CHECK-LABEL: @fold_icmp_ne_0_zext_fcmp_une_f32(
2087 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[A:%.*]], float [[B:%.*]], i32 14)
2088 ; CHECK-NEXT:    ret i64 [[MASK]]
2090   %cmp = fcmp une float %a, %b
2091   %zext.cmp = zext i1 %cmp to i32
2092   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2093   ret i64 %mask
2096 define i64 @fold_icmp_ne_0_zext_fcmp_olt_f64(double %a, double %b) {
2097 ; CHECK-LABEL: @fold_icmp_ne_0_zext_fcmp_olt_f64(
2098 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f64(double [[A:%.*]], double [[B:%.*]], i32 4)
2099 ; CHECK-NEXT:    ret i64 [[MASK]]
2101   %cmp = fcmp olt double %a, %b
2102   %zext.cmp = zext i1 %cmp to i32
2103   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2104   ret i64 %mask
2107 define i64 @fold_icmp_sext_icmp_ne_0_i32(i32 %a, i32 %b) {
2108 ; CHECK-LABEL: @fold_icmp_sext_icmp_ne_0_i32(
2109 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 32)
2110 ; CHECK-NEXT:    ret i64 [[MASK]]
2112   %cmp = icmp eq i32 %a, %b
2113   %sext.cmp = sext i1 %cmp to i32
2114   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %sext.cmp, i32 0, i32 33)
2115   ret i64 %mask
2118 define i64 @fold_icmp_eq_0_zext_icmp_eq_i32(i32 %a, i32 %b) {
2119 ; CHECK-LABEL: @fold_icmp_eq_0_zext_icmp_eq_i32(
2120 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 33)
2121 ; CHECK-NEXT:    ret i64 [[MASK]]
2123   %cmp = icmp eq i32 %a, %b
2124   %zext.cmp = zext i1 %cmp to i32
2125   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 32)
2126   ret i64 %mask
2129 define i64 @fold_icmp_eq_0_zext_icmp_slt_i32(i32 %a, i32 %b) {
2130 ; CHECK-LABEL: @fold_icmp_eq_0_zext_icmp_slt_i32(
2131 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 39)
2132 ; CHECK-NEXT:    ret i64 [[MASK]]
2134   %cmp = icmp slt i32 %a, %b
2135   %zext.cmp = zext i1 %cmp to i32
2136   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 32)
2137   ret i64 %mask
2140 define i64 @fold_icmp_eq_0_zext_fcmp_oeq_f32(float %a, float %b) {
2141 ; CHECK-LABEL: @fold_icmp_eq_0_zext_fcmp_oeq_f32(
2142 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[A:%.*]], float [[B:%.*]], i32 14)
2143 ; CHECK-NEXT:    ret i64 [[MASK]]
2145   %cmp = fcmp oeq float %a, %b
2146   %zext.cmp = zext i1 %cmp to i32
2147   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 32)
2148   ret i64 %mask
2151 define i64 @fold_icmp_eq_0_zext_fcmp_ule_f32(float %a, float %b) {
2152 ; CHECK-LABEL: @fold_icmp_eq_0_zext_fcmp_ule_f32(
2153 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[A:%.*]], float [[B:%.*]], i32 2)
2154 ; CHECK-NEXT:    ret i64 [[MASK]]
2156   %cmp = fcmp ule float %a, %b
2157   %zext.cmp = zext i1 %cmp to i32
2158   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 32)
2159   ret i64 %mask
2162 define i64 @fold_icmp_eq_0_zext_fcmp_ogt_f32(float %a, float %b) {
2163 ; CHECK-LABEL: @fold_icmp_eq_0_zext_fcmp_ogt_f32(
2164 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[A:%.*]], float [[B:%.*]], i32 13)
2165 ; CHECK-NEXT:    ret i64 [[MASK]]
2167   %cmp = fcmp ogt float %a, %b
2168   %zext.cmp = zext i1 %cmp to i32
2169   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 32)
2170   ret i64 %mask
2173 define i64 @fold_icmp_zext_icmp_eq_1_i32(i32 %a, i32 %b) {
2174 ; CHECK-LABEL: @fold_icmp_zext_icmp_eq_1_i32(
2175 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 32)
2176 ; CHECK-NEXT:    ret i64 [[MASK]]
2178   %cmp = icmp eq i32 %a, %b
2179   %zext.cmp = zext i1 %cmp to i32
2180   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 1, i32 32)
2181   ret i64 %mask
2184 define i64 @fold_icmp_zext_argi1_eq_1_i32(i1 %cond) {
2185 ; CHECK-LABEL: @fold_icmp_zext_argi1_eq_1_i32(
2186 ; CHECK-NEXT:    [[ZEXT_COND:%.*]] = zext i1 [[COND:%.*]] to i32
2187 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[ZEXT_COND]], i32 0, i32 33)
2188 ; CHECK-NEXT:    ret i64 [[MASK]]
2190   %zext.cond = zext i1 %cond to i32
2191   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cond, i32 1, i32 32)
2192   ret i64 %mask
2195 define i64 @fold_icmp_zext_argi1_eq_neg1_i32(i1 %cond) {
2196 ; CHECK-LABEL: @fold_icmp_zext_argi1_eq_neg1_i32(
2197 ; CHECK-NEXT:    [[ZEXT_COND:%.*]] = zext i1 [[COND:%.*]] to i32
2198 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[ZEXT_COND]], i32 -1, i32 32)
2199 ; CHECK-NEXT:    ret i64 [[MASK]]
2201   %zext.cond = zext i1 %cond to i32
2202   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cond, i32 -1, i32 32)
2203   ret i64 %mask
2206 define i64 @fold_icmp_sext_argi1_eq_1_i32(i1 %cond) {
2207 ; CHECK-LABEL: @fold_icmp_sext_argi1_eq_1_i32(
2208 ; CHECK-NEXT:    [[SEXT_COND:%.*]] = sext i1 [[COND:%.*]] to i32
2209 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[SEXT_COND]], i32 1, i32 32)
2210 ; CHECK-NEXT:    ret i64 [[MASK]]
2212   %sext.cond = sext i1 %cond to i32
2213   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %sext.cond, i32 1, i32 32)
2214   ret i64 %mask
2217 define i64 @fold_icmp_sext_argi1_eq_neg1_i32(i1 %cond) {
2218 ; CHECK-LABEL: @fold_icmp_sext_argi1_eq_neg1_i32(
2219 ; CHECK-NEXT:    [[SEXT_COND:%.*]] = sext i1 [[COND:%.*]] to i32
2220 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[SEXT_COND]], i32 0, i32 33)
2221 ; CHECK-NEXT:    ret i64 [[MASK]]
2223   %sext.cond = sext i1 %cond to i32
2224   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %sext.cond, i32 -1, i32 32)
2225   ret i64 %mask
2228 define i64 @fold_icmp_sext_argi1_eq_neg1_i64(i1 %cond) {
2229 ; CHECK-LABEL: @fold_icmp_sext_argi1_eq_neg1_i64(
2230 ; CHECK-NEXT:    [[SEXT_COND:%.*]] = sext i1 [[COND:%.*]] to i64
2231 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i64(i64 [[SEXT_COND]], i64 0, i32 33)
2232 ; CHECK-NEXT:    ret i64 [[MASK]]
2234   %sext.cond = sext i1 %cond to i64
2235   %mask = call i64 @llvm.amdgcn.icmp.i64.i64(i64 %sext.cond, i64 -1, i32 32)
2236   ret i64 %mask
2239 ; TODO: Should be able to fold to false
2240 define i64 @fold_icmp_sext_icmp_eq_1_i32(i32 %a, i32 %b) {
2241 ; CHECK-LABEL: @fold_icmp_sext_icmp_eq_1_i32(
2242 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
2243 ; CHECK-NEXT:    [[SEXT_CMP:%.*]] = sext i1 [[CMP]] to i32
2244 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[SEXT_CMP]], i32 1, i32 32)
2245 ; CHECK-NEXT:    ret i64 [[MASK]]
2247   %cmp = icmp eq i32 %a, %b
2248   %sext.cmp = sext i1 %cmp to i32
2249   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %sext.cmp, i32 1, i32 32)
2250   ret i64 %mask
2253 define i64 @fold_icmp_sext_icmp_eq_neg1_i32(i32 %a, i32 %b) {
2254 ; CHECK-LABEL: @fold_icmp_sext_icmp_eq_neg1_i32(
2255 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 32)
2256 ; CHECK-NEXT:    ret i64 [[MASK]]
2258   %cmp = icmp eq i32 %a, %b
2259   %sext.cmp = sext i1 %cmp to i32
2260   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %sext.cmp, i32 -1, i32 32)
2261   ret i64 %mask
2264 define i64 @fold_icmp_sext_icmp_sge_neg1_i32(i32 %a, i32 %b) {
2265 ; CHECK-LABEL: @fold_icmp_sext_icmp_sge_neg1_i32(
2266 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 39)
2267 ; CHECK-NEXT:    ret i64 [[MASK]]
2269   %cmp = icmp sge i32 %a, %b
2270   %sext.cmp = sext i1 %cmp to i32
2271   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %sext.cmp, i32 -1, i32 32)
2272   ret i64 %mask
2275 define i64 @fold_not_icmp_ne_0_zext_icmp_sle_i32(i32 %a, i32 %b) {
2276 ; CHECK-LABEL: @fold_not_icmp_ne_0_zext_icmp_sle_i32(
2277 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[A:%.*]], i32 [[B:%.*]], i32 38)
2278 ; CHECK-NEXT:    ret i64 [[MASK]]
2280   %cmp = icmp sle i32 %a, %b
2281   %not = xor i1 %cmp, true
2282   %zext.cmp = zext i1 %not to i32
2283   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2284   ret i64 %mask
2287 define i64 @fold_icmp_ne_0_zext_icmp_eq_i4(i4 %a, i4 %b) {
2288 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_eq_i4(
2289 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i4 [[A:%.*]] to i16
2290 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i4 [[B:%.*]] to i16
2291 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[TMP1]], i16 [[TMP2]], i32 32)
2292 ; CHECK-NEXT:    ret i64 [[MASK]]
2294   %cmp = icmp eq i4 %a, %b
2295   %zext.cmp = zext i1 %cmp to i32
2296   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2297   ret i64 %mask
2300 define i64 @fold_icmp_ne_0_zext_icmp_eq_i8(i8 %a, i8 %b) {
2301 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_eq_i8(
2302 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[A:%.*]] to i16
2303 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i8 [[B:%.*]] to i16
2304 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[TMP1]], i16 [[TMP2]], i32 32)
2305 ; CHECK-NEXT:    ret i64 [[MASK]]
2307   %cmp = icmp eq i8 %a, %b
2308   %zext.cmp = zext i1 %cmp to i32
2309   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2310   ret i64 %mask
2313 define i64 @fold_icmp_ne_0_zext_icmp_eq_i16(i16 %a, i16 %b) {
2314 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_eq_i16(
2315 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[A:%.*]], i16 [[B:%.*]], i32 32)
2316 ; CHECK-NEXT:    ret i64 [[MASK]]
2318   %cmp = icmp eq i16 %a, %b
2319   %zext.cmp = zext i1 %cmp to i32
2320   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2321   ret i64 %mask
2324 define i64 @fold_icmp_ne_0_zext_icmp_eq_i36(i36 %a, i36 %b) {
2325 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_eq_i36(
2326 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i36 [[A:%.*]] to i64
2327 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i36 [[B:%.*]] to i64
2328 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i64(i64 [[TMP1]], i64 [[TMP2]], i32 32)
2329 ; CHECK-NEXT:    ret i64 [[MASK]]
2331   %cmp = icmp eq i36 %a, %b
2332   %zext.cmp = zext i1 %cmp to i32
2333   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2334   ret i64 %mask
2337 define i64 @fold_icmp_ne_0_zext_icmp_eq_i128(i128 %a, i128 %b) {
2338 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_eq_i128(
2339 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i128 [[A:%.*]], [[B:%.*]]
2340 ; CHECK-NEXT:    [[ZEXT_CMP:%.*]] = zext i1 [[CMP]] to i32
2341 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[ZEXT_CMP]], i32 0, i32 33)
2342 ; CHECK-NEXT:    ret i64 [[MASK]]
2344   %cmp = icmp eq i128 %a, %b
2345   %zext.cmp = zext i1 %cmp to i32
2346   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2347   ret i64 %mask
2350 define i64 @fold_icmp_ne_0_zext_fcmp_oeq_f16(half %a, half %b) {
2351 ; CHECK-LABEL: @fold_icmp_ne_0_zext_fcmp_oeq_f16(
2352 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f16(half [[A:%.*]], half [[B:%.*]], i32 1)
2353 ; CHECK-NEXT:    ret i64 [[MASK]]
2355   %cmp = fcmp oeq half %a, %b
2356   %zext.cmp = zext i1 %cmp to i32
2357   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2358   ret i64 %mask
2361 define i64 @fold_icmp_ne_0_zext_fcmp_oeq_f128(fp128 %a, fp128 %b) {
2362 ; CHECK-LABEL: @fold_icmp_ne_0_zext_fcmp_oeq_f128(
2363 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq fp128 [[A:%.*]], [[B:%.*]]
2364 ; CHECK-NEXT:    [[ZEXT_CMP:%.*]] = zext i1 [[CMP]] to i32
2365 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i32(i32 [[ZEXT_CMP]], i32 0, i32 33)
2366 ; CHECK-NEXT:    ret i64 [[MASK]]
2368   %cmp = fcmp oeq fp128 %a, %b
2369   %zext.cmp = zext i1 %cmp to i32
2370   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2371   ret i64 %mask
2374 define i64 @fold_icmp_ne_0_zext_icmp_slt_i4(i4 %a, i4 %b) {
2375 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_slt_i4(
2376 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i4 [[A:%.*]] to i16
2377 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i4 [[B:%.*]] to i16
2378 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[TMP1]], i16 [[TMP2]], i32 40)
2379 ; CHECK-NEXT:    ret i64 [[MASK]]
2381   %cmp = icmp slt i4 %a, %b
2382   %zext.cmp = zext i1 %cmp to i32
2383   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2384   ret i64 %mask
2387 define i64 @fold_icmp_ne_0_zext_icmp_slt_i8(i8 %a, i8 %b) {
2388 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_slt_i8(
2389 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[A:%.*]] to i16
2390 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i8 [[B:%.*]] to i16
2391 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[TMP1]], i16 [[TMP2]], i32 40)
2392 ; CHECK-NEXT:    ret i64 [[MASK]]
2394   %cmp = icmp slt i8 %a, %b
2395   %zext.cmp = zext i1 %cmp to i32
2396   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2397   ret i64 %mask
2400 define i64 @fold_icmp_ne_0_zext_icmp_slt_i16(i16 %a, i16 %b) {
2401 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_slt_i16(
2402 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[A:%.*]], i16 [[B:%.*]], i32 40)
2403 ; CHECK-NEXT:    ret i64 [[MASK]]
2405   %cmp = icmp slt i16 %a, %b
2406   %zext.cmp = zext i1 %cmp to i32
2407   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2408   ret i64 %mask
2411 define i64 @fold_icmp_ne_0_zext_icmp_ult_i4(i4 %a, i4 %b) {
2412 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_ult_i4(
2413 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i4 [[A:%.*]] to i16
2414 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i4 [[B:%.*]] to i16
2415 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[TMP1]], i16 [[TMP2]], i32 36)
2416 ; CHECK-NEXT:    ret i64 [[MASK]]
2418   %cmp = icmp ult i4 %a, %b
2419   %zext.cmp = zext i1 %cmp to i32
2420   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2421   ret i64 %mask
2424 define i64 @fold_icmp_ne_0_zext_icmp_ult_i8(i8 %a, i8 %b) {
2425 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_ult_i8(
2426 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[A:%.*]] to i16
2427 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i8 [[B:%.*]] to i16
2428 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[TMP1]], i16 [[TMP2]], i32 36)
2429 ; CHECK-NEXT:    ret i64 [[MASK]]
2431   %cmp = icmp ult i8 %a, %b
2432   %zext.cmp = zext i1 %cmp to i32
2433   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2434   ret i64 %mask
2437 define i64 @fold_icmp_ne_0_zext_icmp_ult_i16(i16 %a, i16 %b) {
2438 ; CHECK-LABEL: @fold_icmp_ne_0_zext_icmp_ult_i16(
2439 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i16(i16 [[A:%.*]], i16 [[B:%.*]], i32 36)
2440 ; CHECK-NEXT:    ret i64 [[MASK]]
2442   %cmp = icmp ult i16 %a, %b
2443   %zext.cmp = zext i1 %cmp to i32
2444   %mask = call i64 @llvm.amdgcn.icmp.i64.i32(i32 %zext.cmp, i32 0, i32 33)
2445   ret i64 %mask
2448 ; 1-bit NE comparisons
2450 define i64 @fold_icmp_i1_ne_0_icmp_eq_i1(i32 %a, i32 %b) {
2451 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i1(
2452 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
2453 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2454 ; CHECK-NEXT:    ret i64 [[MASK]]
2456   %cmp = icmp eq i32 %a, %b
2457   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2458   ret i64 %mask
2461 define i64 @fold_icmp_i1_ne_0_icmp_ne_i1(i32 %a, i32 %b) {
2462 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ne_i1(
2463 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[A:%.*]], [[B:%.*]]
2464 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2465 ; CHECK-NEXT:    ret i64 [[MASK]]
2467   %cmp = icmp ne i32 %a, %b
2468   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2469   ret i64 %mask
2472 define i64 @fold_icmp_i1_ne_0_icmp_sle_i1(i32 %a, i32 %b) {
2473 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_sle_i1(
2474 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A:%.*]], [[B:%.*]]
2475 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2476 ; CHECK-NEXT:    ret i64 [[MASK]]
2478   %cmp = icmp sle i32 %a, %b
2479   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2480   ret i64 %mask
2483 define i64 @fold_icmp_i1_ne_0_icmp_ugt_i64(i64 %a, i64 %b) {
2484 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ugt_i64(
2485 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[A:%.*]], [[B:%.*]]
2486 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2487 ; CHECK-NEXT:    ret i64 [[MASK]]
2489   %cmp = icmp ugt i64 %a, %b
2490   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2491   ret i64 %mask
2494 define i64 @fold_icmp_i1_ne_0_icmp_ult_swap_i64(i64 %a, i64 %b) {
2495 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_swap_i64(
2496 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[A:%.*]], [[B:%.*]]
2497 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2498 ; CHECK-NEXT:    ret i64 [[MASK]]
2500   %cmp = icmp ugt i64 %a, %b
2501   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 false, i1 %cmp, i32 33)
2502   ret i64 %mask
2505 define i64 @fold_icmp_i1_ne_0_fcmp_oeq_f32(float %a, float %b) {
2506 ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_oeq_f32(
2507 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[A:%.*]], [[B:%.*]]
2508 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2509 ; CHECK-NEXT:    ret i64 [[MASK]]
2511   %cmp = fcmp oeq float %a, %b
2512   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2513   ret i64 %mask
2516 define i64 @fold_icmp_i1_ne_0_fcmp_une_f32(float %a, float %b) {
2517 ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_une_f32(
2518 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp une float [[A:%.*]], [[B:%.*]]
2519 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2520 ; CHECK-NEXT:    ret i64 [[MASK]]
2522   %cmp = fcmp une float %a, %b
2523   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2524   ret i64 %mask
2527 define i64 @fold_icmp_i1_ne_0_fcmp_olt_f64(double %a, double %b) {
2528 ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_olt_f64(
2529 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[A:%.*]], [[B:%.*]]
2530 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2531 ; CHECK-NEXT:    ret i64 [[MASK]]
2533   %cmp = fcmp olt double %a, %b
2534   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2535   ret i64 %mask
2538 define i64 @fold_icmp_i1_ne_0_icmp_eq_i4(i4 %a, i4 %b) {
2539 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i4(
2540 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i4 [[A:%.*]], [[B:%.*]]
2541 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2542 ; CHECK-NEXT:    ret i64 [[MASK]]
2544   %cmp = icmp eq i4 %a, %b
2545   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2546   ret i64 %mask
2549 define i64 @fold_icmp_i1_ne_0_icmp_eq_i8(i8 %a, i8 %b) {
2550 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i8(
2551 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]]
2552 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2553 ; CHECK-NEXT:    ret i64 [[MASK]]
2555   %cmp = icmp eq i8 %a, %b
2556   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2557   ret i64 %mask
2560 define i64 @fold_icmp_i1_ne_0_icmp_eq_i16(i16 %a, i16 %b) {
2561 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i16(
2562 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[A:%.*]], [[B:%.*]]
2563 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2564 ; CHECK-NEXT:    ret i64 [[MASK]]
2566   %cmp = icmp eq i16 %a, %b
2567   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2568   ret i64 %mask
2571 define i64 @fold_icmp_i1_ne_0_icmp_eq_i36(i36 %a, i36 %b) {
2572 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i36(
2573 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i36 [[A:%.*]], [[B:%.*]]
2574 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2575 ; CHECK-NEXT:    ret i64 [[MASK]]
2577   %cmp = icmp eq i36 %a, %b
2578   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2579   ret i64 %mask
2582 define i64 @fold_icmp_i1_ne_0_icmp_eq_i128(i128 %a, i128 %b) {
2583 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i128(
2584 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i128 [[A:%.*]], [[B:%.*]]
2585 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2586 ; CHECK-NEXT:    ret i64 [[MASK]]
2588   %cmp = icmp eq i128 %a, %b
2589   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2590   ret i64 %mask
2593 define i64 @fold_icmp_i1_ne_0_fcmp_oeq_f16(half %a, half %b) {
2594 ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_oeq_f16(
2595 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq half [[A:%.*]], [[B:%.*]]
2596 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2597 ; CHECK-NEXT:    ret i64 [[MASK]]
2599   %cmp = fcmp oeq half %a, %b
2600   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2601   ret i64 %mask
2604 define i64 @fold_icmp_i1_ne_0_fcmp_oeq_f128(fp128 %a, fp128 %b) {
2605 ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_oeq_f128(
2606 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq fp128 [[A:%.*]], [[B:%.*]]
2607 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2608 ; CHECK-NEXT:    ret i64 [[MASK]]
2610   %cmp = fcmp oeq fp128 %a, %b
2611   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2612   ret i64 %mask
2615 define i64 @fold_icmp_i1_ne_0_icmp_slt_i4(i4 %a, i4 %b) {
2616 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_slt_i4(
2617 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i4 [[A:%.*]], [[B:%.*]]
2618 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2619 ; CHECK-NEXT:    ret i64 [[MASK]]
2621   %cmp = icmp slt i4 %a, %b
2622   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2623   ret i64 %mask
2626 define i64 @fold_icmp_i1_ne_0_icmp_slt_i8(i8 %a, i8 %b) {
2627 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_slt_i8(
2628 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[A:%.*]], [[B:%.*]]
2629 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2630 ; CHECK-NEXT:    ret i64 [[MASK]]
2632   %cmp = icmp slt i8 %a, %b
2633   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2634   ret i64 %mask
2637 define i64 @fold_icmp_i1_ne_0_icmp_slt_i16(i16 %a, i16 %b) {
2638 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_slt_i16(
2639 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
2640 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2641 ; CHECK-NEXT:    ret i64 [[MASK]]
2643   %cmp = icmp slt i16 %a, %b
2644   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2645   ret i64 %mask
2648 define i64 @fold_icmp_i1_ne_0_icmp_ult_i4(i4 %a, i4 %b) {
2649 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_i4(
2650 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i4 [[A:%.*]], [[B:%.*]]
2651 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2652 ; CHECK-NEXT:    ret i64 [[MASK]]
2654   %cmp = icmp ult i4 %a, %b
2655   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2656   ret i64 %mask
2659 define i64 @fold_icmp_i1_ne_0_icmp_ult_i8(i8 %a, i8 %b) {
2660 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_i8(
2661 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[A:%.*]], [[B:%.*]]
2662 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2663 ; CHECK-NEXT:    ret i64 [[MASK]]
2665   %cmp = icmp ult i8 %a, %b
2666   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2667   ret i64 %mask
2670 define i64 @fold_icmp_i1_ne_0_icmp_ult_i16(i16 %a, i16 %b) {
2671 ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_i16(
2672 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[A:%.*]], [[B:%.*]]
2673 ; CHECK-NEXT:    [[MASK:%.*]] = call i64 @llvm.amdgcn.icmp.i64.i1(i1 [[CMP]], i1 false, i32 33)
2674 ; CHECK-NEXT:    ret i64 [[MASK]]
2676   %cmp = icmp ult i16 %a, %b
2677   %mask = call i64 @llvm.amdgcn.icmp.i64.i1(i1 %cmp, i1 false, i32 33)
2678   ret i64 %mask
2681 ; --------------------------------------------------------------------
2682 ; llvm.amdgcn.fcmp
2683 ; --------------------------------------------------------------------
2685 declare i64 @llvm.amdgcn.fcmp.i64.f32(float, float, i32 immarg) nounwind readnone convergent
2687 define i64 @invalid_fcmp_code(float %a, float %b) {
2688 ; CHECK-LABEL: @invalid_fcmp_code(
2689 ; CHECK-NEXT:    [[UNDER:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[A:%.*]], float [[B:%.*]], i32 -1)
2690 ; CHECK-NEXT:    [[OVER:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[A]], float [[B]], i32 16)
2691 ; CHECK-NEXT:    [[OR:%.*]] = or i64 [[UNDER]], [[OVER]]
2692 ; CHECK-NEXT:    ret i64 [[OR]]
2694   %under = call i64 @llvm.amdgcn.fcmp.i64.f32(float %a, float %b, i32 -1)
2695   %over = call i64 @llvm.amdgcn.fcmp.i64.f32(float %a, float %b, i32 16)
2696   %or = or i64 %under, %over
2697   ret i64 %or
2700 define i64 @fcmp_constant_inputs_false() {
2701 ; CHECK-LABEL: @fcmp_constant_inputs_false(
2702 ; CHECK-NEXT:    ret i64 0
2704   %result = call i64 @llvm.amdgcn.fcmp.i64.f32(float 2.0, float 4.0, i32 1)
2705   ret i64 %result
2708 define i64 @fcmp_constant_inputs_true() {
2709 ; CHECK-LABEL: @fcmp_constant_inputs_true(
2710 ; CHECK-NEXT:    [[RESULT:%.*]] = call i64 @llvm.read_register.i64(metadata [[META0]]) #[[ATTR17]]
2711 ; CHECK-NEXT:    ret i64 [[RESULT]]
2713   %result = call i64 @llvm.amdgcn.fcmp.i64.f32(float 2.0, float 4.0, i32 4)
2714   ret i64 %result
2717 define i64 @fcmp_constant_to_rhs_olt(float %x) {
2718 ; CHECK-LABEL: @fcmp_constant_to_rhs_olt(
2719 ; CHECK-NEXT:    [[RESULT:%.*]] = call i64 @llvm.amdgcn.fcmp.i64.f32(float [[X:%.*]], float 4.000000e+00, i32 2)
2720 ; CHECK-NEXT:    ret i64 [[RESULT]]
2722   %result = call i64 @llvm.amdgcn.fcmp.i64.f32(float 4.0, float %x, i32 4)
2723   ret i64 %result
2726 ; --------------------------------------------------------------------
2727 ; llvm.amdgcn.ballot
2728 ; --------------------------------------------------------------------
2730 declare i64 @llvm.amdgcn.ballot.i64(i1) nounwind readnone convergent
2731 declare i32 @llvm.amdgcn.ballot.i32(i1) nounwind readnone convergent
2733 define i64 @ballot_nocombine_64(i1 %i) {
2734 ; CHECK-LABEL: @ballot_nocombine_64(
2735 ; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.amdgcn.ballot.i32(i1 [[I:%.*]])
2736 ; CHECK-NEXT:    [[B:%.*]] = zext i32 [[TMP1]] to i64
2737 ; CHECK-NEXT:    ret i64 [[B]]
2739   %b = call i64 @llvm.amdgcn.ballot.i64(i1 %i)
2740   ret i64 %b
2743 define i64 @ballot_zero_64() {
2744 ; CHECK-LABEL: @ballot_zero_64(
2745 ; CHECK-NEXT:    ret i64 0
2747   %b = call i64 @llvm.amdgcn.ballot.i64(i1 0)
2748   ret i64 %b
2751 define i64 @ballot_one_64() {
2752 ; CHECK-LABEL: @ballot_one_64(
2753 ; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.amdgcn.ballot.i32(i1 true)
2754 ; CHECK-NEXT:    [[B:%.*]] = zext i32 [[TMP1]] to i64
2755 ; CHECK-NEXT:    ret i64 [[B]]
2757   %b = call i64 @llvm.amdgcn.ballot.i64(i1 1)
2758   ret i64 %b
2761 define i32 @ballot_nocombine_32(i1 %i) {
2762 ; CHECK-LABEL: @ballot_nocombine_32(
2763 ; CHECK-NEXT:    [[B:%.*]] = call i32 @llvm.amdgcn.ballot.i32(i1 [[I:%.*]])
2764 ; CHECK-NEXT:    ret i32 [[B]]
2766   %b = call i32 @llvm.amdgcn.ballot.i32(i1 %i)
2767   ret i32 %b
2770 define i32 @ballot_zero_32() {
2771 ; CHECK-LABEL: @ballot_zero_32(
2772 ; CHECK-NEXT:    ret i32 0
2774   %b = call i32 @llvm.amdgcn.ballot.i32(i1 0)
2775   ret i32 %b
2778 define i32 @ballot_one_32() {
2779 ; CHECK-LABEL: @ballot_one_32(
2780 ; CHECK-NEXT:    [[B:%.*]] = call i32 @llvm.amdgcn.ballot.i32(i1 true)
2781 ; CHECK-NEXT:    ret i32 [[B]]
2783   %b = call i32 @llvm.amdgcn.ballot.i32(i1 1)
2784   ret i32 %b
2787 ; --------------------------------------------------------------------
2788 ; llvm.amdgcn.wqm.vote
2789 ; --------------------------------------------------------------------
2791 declare i1 @llvm.amdgcn.wqm.vote(i1)
2793 define float @wqm_vote_true() {
2794 ; CHECK-LABEL: @wqm_vote_true(
2795 ; CHECK-NEXT:  main_body:
2796 ; CHECK-NEXT:    ret float 1.000000e+00
2798 main_body:
2799   %w = call i1 @llvm.amdgcn.wqm.vote(i1 true)
2800   %r = select i1 %w, float 1.0, float 0.0
2801   ret float %r
2804 define float @wqm_vote_false() {
2805 ; CHECK-LABEL: @wqm_vote_false(
2806 ; CHECK-NEXT:  main_body:
2807 ; CHECK-NEXT:    ret float 0.000000e+00
2809 main_body:
2810   %w = call i1 @llvm.amdgcn.wqm.vote(i1 false)
2811   %r = select i1 %w, float 1.0, float 0.0
2812   ret float %r
2815 define float @wqm_vote_undef() {
2816 ; CHECK-LABEL: @wqm_vote_undef(
2817 ; CHECK-NEXT:  main_body:
2818 ; CHECK-NEXT:    ret float 0.000000e+00
2820 main_body:
2821   %w = call i1 @llvm.amdgcn.wqm.vote(i1 undef)
2822   %r = select i1 %w, float 1.0, float 0.0
2823   ret float %r
2826 ; --------------------------------------------------------------------
2827 ; llvm.amdgcn.kill
2828 ; --------------------------------------------------------------------
2830 declare void @llvm.amdgcn.kill(i1)
2832 define void @kill_true() {
2833 ; CHECK-LABEL: @kill_true(
2834 ; CHECK-NEXT:    ret void
2836   call void @llvm.amdgcn.kill(i1 true)
2837   ret void
2840 ; --------------------------------------------------------------------
2841 ; llvm.amdgcn.readfirstlane
2842 ; --------------------------------------------------------------------
2844 declare i32 @llvm.amdgcn.readfirstlane(i32)
2846 @gv = constant i32 0
2848 define amdgpu_kernel void @readfirstlane_constant(i32 %arg) {
2849 ; CHECK-LABEL: @readfirstlane_constant(
2850 ; CHECK-NEXT:    [[VAR:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[ARG:%.*]])
2851 ; CHECK-NEXT:    store volatile i32 [[VAR]], ptr undef, align 4
2852 ; CHECK-NEXT:    store volatile i32 0, ptr undef, align 4
2853 ; CHECK-NEXT:    store volatile i32 123, ptr undef, align 4
2854 ; CHECK-NEXT:    store volatile i32 ptrtoint (ptr @gv to i32), ptr undef, align 4
2855 ; CHECK-NEXT:    store volatile i32 undef, ptr undef, align 4
2856 ; CHECK-NEXT:    ret void
2858   %var = call i32 @llvm.amdgcn.readfirstlane(i32 %arg)
2859   %zero = call i32 @llvm.amdgcn.readfirstlane(i32 0)
2860   %imm = call i32 @llvm.amdgcn.readfirstlane(i32 123)
2861   %constexpr = call i32 @llvm.amdgcn.readfirstlane(i32 ptrtoint (ptr @gv to i32))
2862   %undef = call i32 @llvm.amdgcn.readfirstlane(i32 undef)
2863   store volatile i32 %var, ptr undef
2864   store volatile i32 %zero, ptr undef
2865   store volatile i32 %imm, ptr undef
2866   store volatile i32 %constexpr, ptr undef
2867   store volatile i32 %undef, ptr undef
2868   ret void
2871 define i32 @readfirstlane_idempotent(i32 %arg) {
2872 ; CHECK-LABEL: @readfirstlane_idempotent(
2873 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[ARG:%.*]])
2874 ; CHECK-NEXT:    ret i32 [[READ0]]
2876   %read0 = call i32 @llvm.amdgcn.readfirstlane(i32 %arg)
2877   %read1 = call i32 @llvm.amdgcn.readfirstlane(i32 %read0)
2878   %read2 = call i32 @llvm.amdgcn.readfirstlane(i32 %read1)
2879   ret i32 %read2
2882 define i32 @readfirstlane_readlane(i32 %arg) {
2883 ; CHECK-LABEL: @readfirstlane_readlane(
2884 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[ARG:%.*]])
2885 ; CHECK-NEXT:    ret i32 [[READ0]]
2887   %read0 = call i32 @llvm.amdgcn.readfirstlane(i32 %arg)
2888   %read1 = call i32 @llvm.amdgcn.readlane(i32 %read0, i32 0)
2889   ret i32 %read1
2892 define i32 @readfirstlane_readfirstlane_different_block(i32 %arg) {
2893 ; CHECK-LABEL: @readfirstlane_readfirstlane_different_block(
2894 ; CHECK-NEXT:  bb0:
2895 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[ARG:%.*]])
2896 ; CHECK-NEXT:    br label [[BB1:%.*]]
2897 ; CHECK:       bb1:
2898 ; CHECK-NEXT:    [[READ1:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[READ0]])
2899 ; CHECK-NEXT:    ret i32 [[READ1]]
2901 bb0:
2902   %read0 = call i32 @llvm.amdgcn.readfirstlane(i32 %arg)
2903   br label %bb1
2905 bb1:
2906   %read1 = call i32 @llvm.amdgcn.readfirstlane(i32 %read0)
2907   ret i32 %read1
2910 define i32 @readfirstlane_readlane_different_block(i32 %arg) {
2911 ; CHECK-LABEL: @readfirstlane_readlane_different_block(
2912 ; CHECK-NEXT:  bb0:
2913 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG:%.*]], i32 0)
2914 ; CHECK-NEXT:    br label [[BB1:%.*]]
2915 ; CHECK:       bb1:
2916 ; CHECK-NEXT:    [[READ1:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[READ0]])
2917 ; CHECK-NEXT:    ret i32 [[READ1]]
2919 bb0:
2920   %read0 = call i32 @llvm.amdgcn.readlane(i32 %arg, i32 0)
2921   br label %bb1
2923 bb1:
2924   %read1 = call i32 @llvm.amdgcn.readfirstlane(i32 %read0)
2925   ret i32 %read1
2928 ; --------------------------------------------------------------------
2929 ; llvm.amdgcn.readlane
2930 ; --------------------------------------------------------------------
2932 declare i32 @llvm.amdgcn.readlane(i32, i32)
2934 define amdgpu_kernel void @readlane_constant(i32 %arg, i32 %lane) {
2935 ; CHECK-LABEL: @readlane_constant(
2936 ; CHECK-NEXT:    [[VAR:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG:%.*]], i32 7)
2937 ; CHECK-NEXT:    store volatile i32 [[VAR]], ptr undef, align 4
2938 ; CHECK-NEXT:    store volatile i32 0, ptr undef, align 4
2939 ; CHECK-NEXT:    store volatile i32 123, ptr undef, align 4
2940 ; CHECK-NEXT:    store volatile i32 ptrtoint (ptr @gv to i32), ptr undef, align 4
2941 ; CHECK-NEXT:    store volatile i32 undef, ptr undef, align 4
2942 ; CHECK-NEXT:    ret void
2944   %var = call i32 @llvm.amdgcn.readlane(i32 %arg, i32 7)
2945   %zero = call i32 @llvm.amdgcn.readlane(i32 0, i32 %lane)
2946   %imm = call i32 @llvm.amdgcn.readlane(i32 123, i32 %lane)
2947   %constexpr = call i32 @llvm.amdgcn.readlane(i32 ptrtoint (ptr @gv to i32), i32 %lane)
2948   %undef = call i32 @llvm.amdgcn.readlane(i32 undef, i32 %lane)
2949   store volatile i32 %var, ptr undef
2950   store volatile i32 %zero, ptr undef
2951   store volatile i32 %imm, ptr undef
2952   store volatile i32 %constexpr, ptr undef
2953   store volatile i32 %undef, ptr undef
2954   ret void
2957 define i32 @readlane_idempotent(i32 %arg, i32 %lane) {
2958 ; CHECK-LABEL: @readlane_idempotent(
2959 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG:%.*]], i32 [[LANE:%.*]])
2960 ; CHECK-NEXT:    ret i32 [[READ0]]
2962   %read0 = call i32 @llvm.amdgcn.readlane(i32 %arg, i32 %lane)
2963   %read1 = call i32 @llvm.amdgcn.readlane(i32 %read0, i32 %lane)
2964   ret i32 %read1
2967 define i32 @readlane_idempotent_different_lanes(i32 %arg, i32 %lane0, i32 %lane1) {
2968 ; CHECK-LABEL: @readlane_idempotent_different_lanes(
2969 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG:%.*]], i32 [[LANE0:%.*]])
2970 ; CHECK-NEXT:    ret i32 [[READ0]]
2972   %read0 = call i32 @llvm.amdgcn.readlane(i32 %arg, i32 %lane0)
2973   %read1 = call i32 @llvm.amdgcn.readlane(i32 %read0, i32 %lane1)
2974   ret i32 %read1
2977 define i32 @readlane_readfirstlane(i32 %arg) {
2978 ; CHECK-LABEL: @readlane_readfirstlane(
2979 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[ARG:%.*]])
2980 ; CHECK-NEXT:    ret i32 [[READ0]]
2982   %read0 = call i32 @llvm.amdgcn.readfirstlane(i32 %arg)
2983   %read1 = call i32 @llvm.amdgcn.readlane(i32 %read0, i32 0)
2984   ret i32 %read1
2987 define i32 @readlane_idempotent_different_block(i32 %arg, i32 %lane) {
2988 ; CHECK-LABEL: @readlane_idempotent_different_block(
2989 ; CHECK-NEXT:  bb0:
2990 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG:%.*]], i32 [[LANE:%.*]])
2991 ; CHECK-NEXT:    br label [[BB1:%.*]]
2992 ; CHECK:       bb1:
2993 ; CHECK-NEXT:    [[READ1:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[READ0]], i32 [[LANE]])
2994 ; CHECK-NEXT:    ret i32 [[READ1]]
2996 bb0:
2997   %read0 = call i32 @llvm.amdgcn.readlane(i32 %arg, i32 %lane)
2998   br label %bb1
3000 bb1:
3001   %read1 = call i32 @llvm.amdgcn.readlane(i32 %read0, i32 %lane)
3002   ret i32 %read1
3006 define i32 @readlane_readfirstlane_different_block(i32 %arg) {
3007 ; CHECK-LABEL: @readlane_readfirstlane_different_block(
3008 ; CHECK-NEXT:  bb0:
3009 ; CHECK-NEXT:    [[READ0:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[ARG:%.*]])
3010 ; CHECK-NEXT:    br label [[BB1:%.*]]
3011 ; CHECK:       bb1:
3012 ; CHECK-NEXT:    [[READ1:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[READ0]], i32 0)
3013 ; CHECK-NEXT:    ret i32 [[READ1]]
3015 bb0:
3016   %read0 = call i32 @llvm.amdgcn.readfirstlane(i32 %arg)
3017   br label %bb1
3019 bb1:
3020   %read1 = call i32 @llvm.amdgcn.readlane(i32 %read0, i32 0)
3021   ret i32 %read1
3024 ; --------------------------------------------------------------------
3025 ; llvm.amdgcn.update.dpp.i32
3026 ; --------------------------------------------------------------------
3028 declare i32 @llvm.amdgcn.update.dpp.i32(i32, i32, i32, i32, i32, i1)
3030 define amdgpu_kernel void @update_dpp_no_combine(ptr addrspace(1) %out, i32 %in1, i32 %in2) {
3031 ; CHECK-LABEL: @update_dpp_no_combine(
3032 ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.amdgcn.update.dpp.i32(i32 [[IN1:%.*]], i32 [[IN2:%.*]], i32 1, i32 1, i32 1, i1 false)
3033 ; CHECK-NEXT:    store i32 [[TMP0]], ptr addrspace(1) [[OUT:%.*]], align 4
3034 ; CHECK-NEXT:    ret void
3036   %tmp0 = call i32 @llvm.amdgcn.update.dpp.i32(i32 %in1, i32 %in2, i32 1, i32 1, i32 1, i1 0)
3037   store i32 %tmp0, ptr addrspace(1) %out
3038   ret void
3041 define amdgpu_kernel void @update_dpp_drop_old(ptr addrspace(1) %out, i32 %in1, i32 %in2) {
3042 ; CHECK-LABEL: @update_dpp_drop_old(
3043 ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.amdgcn.update.dpp.i32(i32 undef, i32 [[IN2:%.*]], i32 3, i32 15, i32 15, i1 true)
3044 ; CHECK-NEXT:    store i32 [[TMP0]], ptr addrspace(1) [[OUT:%.*]], align 4
3045 ; CHECK-NEXT:    ret void
3047   %tmp0 = call i32 @llvm.amdgcn.update.dpp.i32(i32 %in1, i32 %in2, i32 3, i32 15, i32 15, i1 1)
3048   store i32 %tmp0, ptr addrspace(1) %out
3049   ret void
3052 define amdgpu_kernel void @update_dpp_undef_old(ptr addrspace(1) %out, i32 %in1) {
3053 ; CHECK-LABEL: @update_dpp_undef_old(
3054 ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.amdgcn.update.dpp.i32(i32 undef, i32 [[IN1:%.*]], i32 4, i32 15, i32 15, i1 true)
3055 ; CHECK-NEXT:    store i32 [[TMP0]], ptr addrspace(1) [[OUT:%.*]], align 4
3056 ; CHECK-NEXT:    ret void
3058   %tmp0 = call i32 @llvm.amdgcn.update.dpp.i32(i32 undef, i32 %in1, i32 4, i32 15, i32 15, i1 1)
3059   store i32 %tmp0, ptr addrspace(1) %out
3060   ret void
3064 ; --------------------------------------------------------------------
3065 ; llvm.amdgcn.permlane16
3066 ; --------------------------------------------------------------------
3068 declare i32 @llvm.amdgcn.permlane16.i32(i32, i32, i32, i32, i1 immarg, i1 immarg)
3070 define amdgpu_kernel void @permlane16(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
3071 ; CHECK-LABEL: @permlane16(
3072 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.amdgcn.permlane16.i32(i32 12345, i32 [[SRC0:%.*]], i32 [[SRC1:%.*]], i32 [[SRC2:%.*]], i1 false, i1 false)
3073 ; CHECK-NEXT:    store i32 [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
3074 ; CHECK-NEXT:    ret void
3076   %res = call i32 @llvm.amdgcn.permlane16.i32(i32 12345, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 false)
3077   store i32 %res, ptr addrspace(1) %out
3078   ret void
3081 define amdgpu_kernel void @permlane16_bound_ctrl(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
3082 ; CHECK-LABEL: @permlane16_bound_ctrl(
3083 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.amdgcn.permlane16.i32(i32 undef, i32 [[SRC0:%.*]], i32 [[SRC1:%.*]], i32 [[SRC2:%.*]], i1 false, i1 true)
3084 ; CHECK-NEXT:    store i32 [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
3085 ; CHECK-NEXT:    ret void
3087   %res = call i32 @llvm.amdgcn.permlane16.i32(i32 12345, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 true)
3088   store i32 %res, ptr addrspace(1) %out
3089   ret void
3092 define amdgpu_kernel void @permlane16_fetch_invalid_bound_ctrl(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
3093 ; CHECK-LABEL: @permlane16_fetch_invalid_bound_ctrl(
3094 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.amdgcn.permlane16.i32(i32 undef, i32 [[SRC0:%.*]], i32 [[SRC1:%.*]], i32 [[SRC2:%.*]], i1 true, i1 true)
3095 ; CHECK-NEXT:    store i32 [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
3096 ; CHECK-NEXT:    ret void
3098   %res = call i32 @llvm.amdgcn.permlane16.i32(i32 12345, i32 %src0, i32 %src1, i32 %src2, i1 true, i1 true)
3099   store i32 %res, ptr addrspace(1) %out
3100   ret void
3103 ; --------------------------------------------------------------------
3104 ; llvm.amdgcn.permlanex16
3105 ; --------------------------------------------------------------------
3107 declare i32 @llvm.amdgcn.permlanex16.i32(i32, i32, i32, i32, i1 immarg, i1 immarg)
3109 define amdgpu_kernel void @permlanex16(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
3110 ; CHECK-LABEL: @permlanex16(
3111 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.amdgcn.permlanex16.i32(i32 12345, i32 [[SRC0:%.*]], i32 [[SRC1:%.*]], i32 [[SRC2:%.*]], i1 false, i1 false)
3112 ; CHECK-NEXT:    store i32 [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
3113 ; CHECK-NEXT:    ret void
3115   %res = call i32 @llvm.amdgcn.permlanex16.i32(i32 12345, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 false)
3116   store i32 %res, ptr addrspace(1) %out
3117   ret void
3120 define amdgpu_kernel void @permlanex16_bound_ctrl(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
3121 ; CHECK-LABEL: @permlanex16_bound_ctrl(
3122 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.amdgcn.permlanex16.i32(i32 undef, i32 [[SRC0:%.*]], i32 [[SRC1:%.*]], i32 [[SRC2:%.*]], i1 false, i1 true)
3123 ; CHECK-NEXT:    store i32 [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
3124 ; CHECK-NEXT:    ret void
3126   %res = call i32 @llvm.amdgcn.permlanex16.i32(i32 12345, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 true)
3127   store i32 %res, ptr addrspace(1) %out
3128   ret void
3131 define amdgpu_kernel void @permlanex16_fetch_invalid_bound_ctrl(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
3132 ; CHECK-LABEL: @permlanex16_fetch_invalid_bound_ctrl(
3133 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.amdgcn.permlanex16.i32(i32 undef, i32 [[SRC0:%.*]], i32 [[SRC1:%.*]], i32 [[SRC2:%.*]], i1 true, i1 true)
3134 ; CHECK-NEXT:    store i32 [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
3135 ; CHECK-NEXT:    ret void
3137   %res = call i32 @llvm.amdgcn.permlanex16.i32(i32 12345, i32 %src0, i32 %src1, i32 %src2, i1 true, i1 true)
3138   store i32 %res, ptr addrspace(1) %out
3139   ret void
3142 ; --------------------------------------------------------------------
3143 ; llvm.amdgcn.permlane64
3144 ; --------------------------------------------------------------------
3146 define amdgpu_kernel void @permlane64_uniform(ptr addrspace(1) %out, i32 %src0) {
3147 ; CHECK-LABEL: @permlane64_uniform(
3148 ; CHECK-NEXT:    [[SRC1:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[SRC0:%.*]])
3149 ; CHECK-NEXT:    store i32 [[SRC1]], ptr addrspace(1) [[OUT:%.*]], align 4
3150 ; CHECK-NEXT:    ret void
3152   %src1 = call i32 @llvm.amdgcn.readfirstlane(i32 %src0)
3153   %res = call i32 @llvm.amdgcn.permlane64(i32 %src1)
3154   store i32 %res, ptr addrspace(1) %out
3155   ret void
3158 ; --------------------------------------------------------------------
3159 ; llvm.amdgcn.image.sample a16
3160 ; --------------------------------------------------------------------
3162 declare <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f32.v8i32.v4i32(i32, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3163 declare <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3164 declare <4 x float> @llvm.amdgcn.image.sample.3d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3165 declare <4 x float> @llvm.amdgcn.image.sample.cube.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3166 declare <4 x float> @llvm.amdgcn.image.sample.1darray.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3167 declare <4 x float> @llvm.amdgcn.image.sample.2darray.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3169 declare <4 x float> @llvm.amdgcn.image.sample.c.1d.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3170 declare <4 x float> @llvm.amdgcn.image.sample.c.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3171 declare <4 x float> @llvm.amdgcn.image.sample.cl.1d.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3172 declare <4 x float> @llvm.amdgcn.image.sample.cl.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3173 declare <4 x float> @llvm.amdgcn.image.sample.c.cl.1d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3174 declare <4 x float> @llvm.amdgcn.image.sample.c.cl.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3176 declare <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3177 declare <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3178 declare <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3179 declare <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3180 declare <4 x float> @llvm.amdgcn.image.sample.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3181 declare <4 x float> @llvm.amdgcn.image.sample.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3182 declare <4 x float> @llvm.amdgcn.image.sample.c.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3183 declare <4 x float> @llvm.amdgcn.image.sample.c.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3185 declare <4 x float> @llvm.amdgcn.image.sample.d.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3186 declare <4 x float> @llvm.amdgcn.image.sample.d.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3187 declare <4 x float> @llvm.amdgcn.image.sample.d.3d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3188 declare <4 x float> @llvm.amdgcn.image.sample.c.d.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3189 declare <4 x float> @llvm.amdgcn.image.sample.c.d.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3190 declare <4 x float> @llvm.amdgcn.image.sample.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3191 declare <4 x float> @llvm.amdgcn.image.sample.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3192 declare <4 x float> @llvm.amdgcn.image.sample.c.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3193 declare <4 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3195 declare <4 x float> @llvm.amdgcn.image.sample.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3196 declare <4 x float> @llvm.amdgcn.image.sample.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3197 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3198 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3199 declare <4 x float> @llvm.amdgcn.image.sample.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3200 declare <4 x float> @llvm.amdgcn.image.sample.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3201 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3202 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3204 declare <4 x float> @llvm.amdgcn.image.sample.l.1d.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3205 declare <4 x float> @llvm.amdgcn.image.sample.l.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3206 declare <4 x float> @llvm.amdgcn.image.sample.c.l.1d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3207 declare <4 x float> @llvm.amdgcn.image.sample.c.l.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3209 declare <4 x float> @llvm.amdgcn.image.sample.lz.1d.v4f32.f32.v8i32.v4i32(i32, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3210 declare <4 x float> @llvm.amdgcn.image.sample.lz.2d.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3211 declare <4 x float> @llvm.amdgcn.image.sample.c.lz.1d.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3212 declare <4 x float> @llvm.amdgcn.image.sample.c.lz.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3214 declare float @llvm.amdgcn.image.sample.c.d.o.2darray.f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3215 declare <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
3217 define amdgpu_kernel void @image_sample_a16_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s) {
3218 ; CHECK-LABEL: @image_sample_a16_1d(
3219 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3220 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3221 ; CHECK-NEXT:    ret void
3223   %s32 = fpext half %s to float
3224   %res = call <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3225   store <4 x float> %res, ptr addrspace(1) %out
3226   ret void
3229 define amdgpu_kernel void @image_sample_a16_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t) {
3230 ; CHECK-LABEL: @image_sample_a16_2d(
3231 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3232 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3233 ; CHECK-NEXT:    ret void
3235   %s32 = fpext half %s to float
3236   %t32 = fpext half %t to float
3237   %res = call <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3238   store <4 x float> %res, ptr addrspace(1) %out
3239   ret void
3242 define amdgpu_kernel void @image_sample_a16_3d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %r) {
3243 ; CHECK-LABEL: @image_sample_a16_3d(
3244 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.3d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[R:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3245 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3246 ; CHECK-NEXT:    ret void
3248   %s32 = fpext half %s to float
3249   %t32 = fpext half %t to float
3250   %r32 = fpext half %r to float
3251   %res = call <4 x float> @llvm.amdgcn.image.sample.3d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %r32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3252   store <4 x float> %res, ptr addrspace(1) %out
3253   ret void
3256 define amdgpu_kernel void @image_sample_a16_cube(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %face) {
3258 ; CHECK-LABEL: @image_sample_a16_cube(
3259 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cube.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[FACE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3260 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3261 ; CHECK-NEXT:    ret void
3263   %s32 = fpext half %s to float
3264   %t32 = fpext half %t to float
3265   %face32 = fpext half %face to float
3266   %res = call <4 x float> @llvm.amdgcn.image.sample.cube.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %face32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3267   store <4 x float> %res, ptr addrspace(1) %out
3268   ret void
3271 define amdgpu_kernel void @image_sample_a16_1darray(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %slice) {
3272 ; CHECK-LABEL: @image_sample_a16_1darray(
3273 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.1darray.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3274 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3275 ; CHECK-NEXT:    ret void
3277   %s32 = fpext half %s to float
3278   %slice32 = fpext half %slice to float
3279   %res = call <4 x float> @llvm.amdgcn.image.sample.1darray.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3280   store <4 x float> %res, ptr addrspace(1) %out
3281   ret void
3284 define amdgpu_kernel void @image_sample_a16_2darray(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %slice) {
3285 ; CHECK-LABEL: @image_sample_a16_2darray(
3286 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.2darray.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3287 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3288 ; CHECK-NEXT:    ret void
3290   %s32 = fpext half %s to float
3291   %t32 = fpext half %t to float
3292   %slice32 = fpext half %slice to float
3293   %res = call <4 x float> @llvm.amdgcn.image.sample.2darray.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3294   store <4 x float> %res, ptr addrspace(1) %out
3295   ret void
3298 define amdgpu_kernel void @image_sample_a16_c_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s) {
3299 ; CHECK-LABEL: @image_sample_a16_c_1d(
3300 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.1d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3301 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3302 ; CHECK-NEXT:    ret void
3304   %s32 = fpext half %s to float
3305   %res = call <4 x float> @llvm.amdgcn.image.sample.c.1d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3306   store <4 x float> %res, ptr addrspace(1) %out
3307   ret void
3310 define amdgpu_kernel void @image_sample_a16_c_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t) {
3311 ; CHECK-LABEL: @image_sample_a16_c_2d(
3312 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.2d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3313 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3314 ; CHECK-NEXT:    ret void
3316   %s32 = fpext half %s to float
3317   %t32 = fpext half %t to float
3318   %res = call <4 x float> @llvm.amdgcn.image.sample.c.2d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3319   store <4 x float> %res, ptr addrspace(1) %out
3320   ret void
3323 define amdgpu_kernel void @image_sample_a16_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %clamp) {
3324 ; CHECK-LABEL: @image_sample_a16_cl_1d(
3325 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cl.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3326 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3327 ; CHECK-NEXT:    ret void
3329   %s32 = fpext half %s to float
3330   %clamp32 = fpext half %clamp to float
3331   %res = call <4 x float> @llvm.amdgcn.image.sample.cl.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3332   store <4 x float> %res, ptr addrspace(1) %out
3333   ret void
3336 define amdgpu_kernel void @image_sample_a16_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %clamp) {
3337 ; CHECK-LABEL: @image_sample_a16_cl_2d(
3338 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cl.2d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3339 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3340 ; CHECK-NEXT:    ret void
3342   %s32 = fpext half %s to float
3343   %t32 = fpext half %t to float
3344   %clamp32 = fpext half %clamp to float
3345   %res = call <4 x float> @llvm.amdgcn.image.sample.cl.2d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3346   store <4 x float> %res, ptr addrspace(1) %out
3347   ret void
3350 define amdgpu_kernel void @image_sample_a16_c_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %clamp) {
3351 ; CHECK-LABEL: @image_sample_a16_c_cl_1d(
3352 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cl.1d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3353 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3354 ; CHECK-NEXT:    ret void
3356   %s32 = fpext half %s to float
3357   %clamp32 = fpext half %clamp to float
3358   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cl.1d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3359   store <4 x float> %res, ptr addrspace(1) %out
3360   ret void
3363 define amdgpu_kernel void @image_sample_a16_c_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t, half %clamp) {
3364 ; CHECK-LABEL: @image_sample_a16_c_cl_2d(
3365 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cl.2d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3366 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3367 ; CHECK-NEXT:    ret void
3369   %s32 = fpext half %s to float
3370   %t32 = fpext half %t to float
3371   %clamp32 = fpext half %clamp to float
3372   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cl.2d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3373   store <4 x float> %res, ptr addrspace(1) %out
3374   ret void
3377 define amdgpu_kernel void @image_sample_a16_b16_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, half %s) {
3378 ; CHECK-LABEL: @image_sample_a16_b16_1d(
3379 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3380 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3381 ; CHECK-NEXT:    ret void
3383   %bias32 = fpext half %bias to float
3384   %s32 = fpext half %s to float
3385   %res = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3386   store <4 x float> %res, ptr addrspace(1) %out
3387   ret void
3390 define amdgpu_kernel void @image_sample_a16_b32_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, half %s) {
3391 ; CHECK-LABEL: @image_sample_a16_b32_1d(
3392 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3393 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3394 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3395 ; CHECK-NEXT:    ret void
3397   %s32 = fpext half %s to float
3398   %res = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3399   store <4 x float> %res, ptr addrspace(1) %out
3400   ret void
3403 define amdgpu_kernel void @image_sample_a16_b16_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, half %s, half %t) {
3404 ; CHECK-LABEL: @image_sample_a16_b16_2d(
3405 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3406 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3407 ; CHECK-NEXT:    ret void
3409   %bias32 = fpext half %bias to float
3410   %s32 = fpext half %s to float
3411   %t32 = fpext half %t to float
3412   %res = call <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3413   store <4 x float> %res, ptr addrspace(1) %out
3414   ret void
3417 define amdgpu_kernel void @image_sample_a16_b32_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, half %s, half %t) {
3418 ; CHECK-LABEL: @image_sample_a16_b32_2d(
3419 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3420 ; CHECK-NEXT:    [[T32:%.*]] = fpext half [[T:%.*]] to float
3421 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S32]], float [[T32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3422 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3423 ; CHECK-NEXT:    ret void
3425   %s32 = fpext half %s to float
3426   %t32 = fpext half %t to float
3427   %res = call <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3428   store <4 x float> %res, ptr addrspace(1) %out
3429   ret void
3432 define amdgpu_kernel void @image_sample_a16_c_b16_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, float %zcompare, half %s) {
3433 ; CHECK-LABEL: @image_sample_a16_c_b16_1d(
3434 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], float [[ZCOMPARE:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3435 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3436 ; CHECK-NEXT:    ret void
3438   %bias32 = fpext half %bias to float
3439   %s32 = fpext half %s to float
3440   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %zcompare, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3441   store <4 x float> %res, ptr addrspace(1) %out
3442   ret void
3445 define amdgpu_kernel void @image_sample_a16_c_b32_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, half %s) {
3446 ; CHECK-LABEL: @image_sample_a16_c_b32_1d(
3447 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3448 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3449 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3450 ; CHECK-NEXT:    ret void
3452   %s32 = fpext half %s to float
3453   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %zcompare, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3454   store <4 x float> %res, ptr addrspace(1) %out
3455   ret void
3458 define amdgpu_kernel void @image_sample_a16_c_b16_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, float %zcompare, half %s, half %t) {
3459 ; CHECK-LABEL: @image_sample_a16_c_b16_2d(
3460 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3461 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3462 ; CHECK-NEXT:    ret void
3464   %bias32 = fpext half %bias to float
3465   %s32 = fpext half %s to float
3466   %t32 = fpext half %t to float
3467   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %zcompare, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3468   store <4 x float> %res, ptr addrspace(1) %out
3469   ret void
3472 define amdgpu_kernel void @image_sample_a16_c_b32_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, half %s, half %t) {
3473 ; CHECK-LABEL: @image_sample_a16_c_b32_2d(
3474 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3475 ; CHECK-NEXT:    [[T32:%.*]] = fpext half [[T:%.*]] to float
3476 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S32]], float [[T32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3477 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3478 ; CHECK-NEXT:    ret void
3480   %s32 = fpext half %s to float
3481   %t32 = fpext half %t to float
3482   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %zcompare, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3483   store <4 x float> %res, ptr addrspace(1) %out
3484   ret void
3487 define amdgpu_kernel void @image_sample_a16_b16_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, half %s, half %clamp) {
3488 ; CHECK-LABEL: @image_sample_a16_b16_cl_1d(
3489 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.cl.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3490 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3491 ; CHECK-NEXT:    ret void
3493   %bias32 = fpext half %bias to float
3494   %s32 = fpext half %s to float
3495   %clamp32 = fpext half %clamp to float
3496   %res = call <4 x float> @llvm.amdgcn.image.sample.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3497   store <4 x float> %res, ptr addrspace(1) %out
3498   ret void
3501 define amdgpu_kernel void @image_sample_a16_b32_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, half %s, half %clamp) {
3502 ; CHECK-LABEL: @image_sample_a16_b32_cl_1d(
3503 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3504 ; CHECK-NEXT:    [[CLAMP32:%.*]] = fpext half [[CLAMP:%.*]] to float
3505 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S32]], float [[CLAMP32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3506 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3507 ; CHECK-NEXT:    ret void
3509   %s32 = fpext half %s to float
3510   %clamp32 = fpext half %clamp to float
3511   %res = call <4 x float> @llvm.amdgcn.image.sample.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3512   store <4 x float> %res, ptr addrspace(1) %out
3513   ret void
3516 define amdgpu_kernel void @image_sample_a16_b16_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, half %s, half %t, half %clamp) {
3517 ; CHECK-LABEL: @image_sample_a16_b16_cl_2d(
3518 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.cl.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3519 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3520 ; CHECK-NEXT:    ret void
3522   %bias32 = fpext half %bias to float
3523   %s32 = fpext half %s to float
3524   %t32 = fpext half %t to float
3525   %clamp32 = fpext half %clamp to float
3526   %res = call <4 x float> @llvm.amdgcn.image.sample.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3527   store <4 x float> %res, ptr addrspace(1) %out
3528   ret void
3531 define amdgpu_kernel void @image_sample_a16_b32_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, half %s, half %t, half %clamp) {
3532 ; CHECK-LABEL: @image_sample_a16_b32_cl_2d(
3533 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3534 ; CHECK-NEXT:    [[T32:%.*]] = fpext half [[T:%.*]] to float
3535 ; CHECK-NEXT:    [[CLAMP32:%.*]] = fpext half [[CLAMP:%.*]] to float
3536 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S32]], float [[T32]], float [[CLAMP32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3537 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3538 ; CHECK-NEXT:    ret void
3540   %s32 = fpext half %s to float
3541   %t32 = fpext half %t to float
3542   %clamp32 = fpext half %clamp to float
3543   %res = call <4 x float> @llvm.amdgcn.image.sample.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3544   store <4 x float> %res, ptr addrspace(1) %out
3545   ret void
3548 define amdgpu_kernel void @image_sample_a16_c_b16_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, float %zcompare, half %s, half %clamp) {
3549 ; CHECK-LABEL: @image_sample_a16_c_b16_cl_1d(
3550 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3551 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3552 ; CHECK-NEXT:    ret void
3554   %bias32 = fpext half %bias to float
3555   %s32 = fpext half %s to float
3556   %clamp32 = fpext half %clamp to float
3557   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %zcompare, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3558   store <4 x float> %res, ptr addrspace(1) %out
3559   ret void
3562 define amdgpu_kernel void @image_sample_a16_c_b32_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, half %s, half %clamp) {
3563 ; CHECK-LABEL: @image_sample_a16_c_b32_cl_1d(
3564 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3565 ; CHECK-NEXT:    [[CLAMP32:%.*]] = fpext half [[CLAMP:%.*]] to float
3566 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S32]], float [[CLAMP32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3567 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3568 ; CHECK-NEXT:    ret void
3570   %s32 = fpext half %s to float
3571   %clamp32 = fpext half %clamp to float
3572   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %zcompare, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3573   store <4 x float> %res, ptr addrspace(1) %out
3574   ret void
3577 define amdgpu_kernel void @image_sample_a16_c_b16_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, float %zcompare, half %s, half %t, half %clamp) {
3578 ; CHECK-LABEL: @image_sample_a16_c_b16_cl_2d(
3579 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[BIAS:%.*]], float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3580 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3581 ; CHECK-NEXT:    ret void
3583   %bias32 = fpext half %bias to float
3584   %s32 = fpext half %s to float
3585   %t32 = fpext half %t to float
3586   %clamp32 = fpext half %clamp to float
3587   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias32, float %zcompare, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3588   store <4 x float> %res, ptr addrspace(1) %out
3589   ret void
3592 define amdgpu_kernel void @image_sample_a16_c_b32_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, half %s, half %t, half %clamp) {
3593 ; CHECK-LABEL: @image_sample_a16_c_b32_cl_2d(
3594 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
3595 ; CHECK-NEXT:    [[T32:%.*]] = fpext half [[T:%.*]] to float
3596 ; CHECK-NEXT:    [[CLAMP32:%.*]] = fpext half [[CLAMP:%.*]] to float
3597 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S32]], float [[T32]], float [[CLAMP32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3598 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3599 ; CHECK-NEXT:    ret void
3601   %s32 = fpext half %s to float
3602   %t32 = fpext half %t to float
3603   %clamp32 = fpext half %clamp to float
3604   %res = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %bias, float %zcompare, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3605   store <4 x float> %res, ptr addrspace(1) %out
3606   ret void
3609 define amdgpu_kernel void @image_sample_a16_d_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, half %s) {
3610 ; CHECK-LABEL: @image_sample_a16_d_1d(
3611 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3612 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3613 ; CHECK-NEXT:    ret void
3615   %dsdh32 = fpext half %dsdh to float
3616   %dsdv32 = fpext half %dsdv to float
3617   %s32 = fpext half %s to float
3618   %res = call <4 x float> @llvm.amdgcn.image.sample.d.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3619   store <4 x float> %res, ptr addrspace(1) %out
3620   ret void
3623 define amdgpu_kernel void @image_sample_a16_d_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t) {
3624 ; CHECK-LABEL: @image_sample_a16_d_2d(
3625 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3626 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3627 ; CHECK-NEXT:    ret void
3629   %dsdh32 = fpext half %dsdh to float
3630   %dtdh32 = fpext half %dtdh to float
3631   %dsdv32 = fpext half %dsdv to float
3632   %dtdv32 = fpext half %dtdv to float
3633   %s32 = fpext half %s to float
3634   %t32 = fpext half %t to float
3635   %res = call <4 x float> @llvm.amdgcn.image.sample.d.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3636   store <4 x float> %res, ptr addrspace(1) %out
3637   ret void
3640 define amdgpu_kernel void @image_sample_a16_d_3d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %drdh, half %dsdv, half %dtdv, half %drdv, half %s, half %t, half %r) {
3641 ; CHECK-LABEL: @image_sample_a16_d_3d(
3642 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.3d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DRDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[DRDV:%.*]], half [[S:%.*]], half [[T:%.*]], half [[R:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3643 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3644 ; CHECK-NEXT:    ret void
3646   %dsdh32 = fpext half %dsdh to float
3647   %dtdh32 = fpext half %dtdh to float
3648   %drdh32 = fpext half %drdh to float
3649   %dsdv32 = fpext half %dsdv to float
3650   %dtdv32 = fpext half %dtdv to float
3651   %drdv32 = fpext half %drdv to float
3652   %s32 = fpext half %s to float
3653   %t32 = fpext half %t to float
3654   %r32 = fpext half %r to float
3655   %res = call <4 x float> @llvm.amdgcn.image.sample.d.3d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %drdh32, float %dsdv32, float %dtdv32, float %drdv32, float %s32, float %t32, float %r32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3656   store <4 x float> %res, ptr addrspace(1) %out
3657   ret void
3660 define amdgpu_kernel void @image_sample_a16_c_d_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, half %s) {
3661 ; CHECK-LABEL: @image_sample_a16_c_d_1d(
3662 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3663 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3664 ; CHECK-NEXT:    ret void
3666   %dsdh32 = fpext half %dsdh to float
3667   %dsdv32 = fpext half %dsdv to float
3668   %s32 = fpext half %s to float
3669   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3670   store <4 x float> %res, ptr addrspace(1) %out
3671   ret void
3674 define amdgpu_kernel void @image_sample_a16_c_d_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t) {
3675 ; CHECK-LABEL: @image_sample_a16_c_d_2d(
3676 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3677 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3678 ; CHECK-NEXT:    ret void
3680   %dsdh32 = fpext half %dsdh to float
3681   %dtdh32 = fpext half %dtdh to float
3682   %dsdv32 = fpext half %dsdv to float
3683   %dtdv32 = fpext half %dtdv to float
3684   %s32 = fpext half %s to float
3685   %t32 = fpext half %t to float
3686   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3687   store <4 x float> %res, ptr addrspace(1) %out
3688   ret void
3691 define amdgpu_kernel void @image_sample_a16_d_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, half %s, half %clamp) {
3692 ; CHECK-LABEL: @image_sample_a16_d_cl_1d(
3693 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.cl.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3694 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3695 ; CHECK-NEXT:    ret void
3697   %dsdh32 = fpext half %dsdh to float
3698   %dsdv32 = fpext half %dsdv to float
3699   %s32 = fpext half %s to float
3700   %clamp32 = fpext half %clamp to float
3701   %res = call <4 x float> @llvm.amdgcn.image.sample.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3702   store <4 x float> %res, ptr addrspace(1) %out
3703   ret void
3706 define amdgpu_kernel void @image_sample_a16_d_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t, half %clamp) {
3707 ; CHECK-LABEL: @image_sample_a16_d_cl_2d(
3708 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.cl.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3709 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3710 ; CHECK-NEXT:    ret void
3712   %dsdh32 = fpext half %dsdh to float
3713   %dtdh32 = fpext half %dtdh to float
3714   %dsdv32 = fpext half %dsdv to float
3715   %dtdv32 = fpext half %dtdv to float
3716   %s32 = fpext half %s to float
3717   %t32 = fpext half %t to float
3718   %clamp32 = fpext half %clamp to float
3719   %res = call <4 x float> @llvm.amdgcn.image.sample.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3720   store <4 x float> %res, ptr addrspace(1) %out
3721   ret void
3724 define amdgpu_kernel void @image_sample_a16_c_d_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, half %s, half %clamp) {
3725 ; CHECK-LABEL: @image_sample_a16_c_d_cl_1d(
3726 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3727 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3728 ; CHECK-NEXT:    ret void
3730   %dsdh32 = fpext half %dsdh to float
3731   %dsdv32 = fpext half %dsdv to float
3732   %s32 = fpext half %s to float
3733   %clamp32 = fpext half %clamp to float
3734   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3735   store <4 x float> %res, ptr addrspace(1) %out
3736   ret void
3739 define amdgpu_kernel void @image_sample_a16_c_d_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t, half %clamp) {
3740 ; CHECK-LABEL: @image_sample_a16_c_d_cl_2d(
3741 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3742 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3743 ; CHECK-NEXT:    ret void
3745   %dsdh32 = fpext half %dsdh to float
3746   %dtdh32 = fpext half %dtdh to float
3747   %dsdv32 = fpext half %dsdv to float
3748   %dtdv32 = fpext half %dtdv to float
3749   %s32 = fpext half %s to float
3750   %t32 = fpext half %t to float
3751   %clamp32 = fpext half %clamp to float
3752   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3753   store <4 x float> %res, ptr addrspace(1) %out
3754   ret void
3757 define amdgpu_kernel void @image_sample_a16_cd_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, half %s) {
3758 ; CHECK-LABEL: @image_sample_a16_cd_1d(
3759 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3760 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3761 ; CHECK-NEXT:    ret void
3763   %dsdh32 = fpext half %dsdh to float
3764   %dsdv32 = fpext half %dsdv to float
3765   %s32 = fpext half %s to float
3766   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3767   store <4 x float> %res, ptr addrspace(1) %out
3768   ret void
3771 define amdgpu_kernel void @image_sample_a16_cd_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t) {
3772 ; CHECK-LABEL: @image_sample_a16_cd_2d(
3773 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3774 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3775 ; CHECK-NEXT:    ret void
3777   %dsdh32 = fpext half %dsdh to float
3778   %dtdh32 = fpext half %dtdh to float
3779   %dsdv32 = fpext half %dsdv to float
3780   %dtdv32 = fpext half %dtdv to float
3781   %s32 = fpext half %s to float
3782   %t32 = fpext half %t to float
3783   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3784   store <4 x float> %res, ptr addrspace(1) %out
3785   ret void
3788 define amdgpu_kernel void @image_sample_a16_c_cd_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, half %s) {
3789 ; CHECK-LABEL: @image_sample_a16_c_cd_1d(
3790 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3791 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3792 ; CHECK-NEXT:    ret void
3794   %dsdh32 = fpext half %dsdh to float
3795   %dsdv32 = fpext half %dsdv to float
3796   %s32 = fpext half %s to float
3797   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3798   store <4 x float> %res, ptr addrspace(1) %out
3799   ret void
3802 define amdgpu_kernel void @image_sample_a16_c_cd_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t) {
3803 ; CHECK-LABEL: @image_sample_a16_c_cd_2d(
3804 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3805 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3806 ; CHECK-NEXT:    ret void
3808   %dsdh32 = fpext half %dsdh to float
3809   %dtdh32 = fpext half %dtdh to float
3810   %dsdv32 = fpext half %dsdv to float
3811   %dtdv32 = fpext half %dtdv to float
3812   %s32 = fpext half %s to float
3813   %t32 = fpext half %t to float
3814   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3815   store <4 x float> %res, ptr addrspace(1) %out
3816   ret void
3819 define amdgpu_kernel void @image_sample_a16_cd_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, half %s, half %clamp) {
3820 ; CHECK-LABEL: @image_sample_a16_cd_cl_1d(
3821 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3822 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3823 ; CHECK-NEXT:    ret void
3825   %dsdh32 = fpext half %dsdh to float
3826   %dsdv32 = fpext half %dsdv to float
3827   %s32 = fpext half %s to float
3828   %clamp32 = fpext half %clamp to float
3829   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3830   store <4 x float> %res, ptr addrspace(1) %out
3831   ret void
3834 define amdgpu_kernel void @image_sample_a16_cd_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t, half %clamp) {
3835 ; CHECK-LABEL: @image_sample_a16_cd_cl_2d(
3836 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3837 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3838 ; CHECK-NEXT:    ret void
3840   %dsdh32 = fpext half %dsdh to float
3841   %dtdh32 = fpext half %dtdh to float
3842   %dsdv32 = fpext half %dsdv to float
3843   %dtdv32 = fpext half %dtdv to float
3844   %s32 = fpext half %s to float
3845   %t32 = fpext half %t to float
3846   %clamp32 = fpext half %clamp to float
3847   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3848   store <4 x float> %res, ptr addrspace(1) %out
3849   ret void
3852 define amdgpu_kernel void @image_sample_a16_c_cd_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, half %s, half %clamp) {
3853 ; CHECK-LABEL: @image_sample_a16_c_cd_cl_1d(
3854 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.1d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], half [[S:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3855 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3856 ; CHECK-NEXT:    ret void
3858   %dsdh32 = fpext half %dsdh to float
3859   %dsdv32 = fpext half %dsdv to float
3860   %s32 = fpext half %s to float
3861   %clamp32 = fpext half %clamp to float
3862   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3863   store <4 x float> %res, ptr addrspace(1) %out
3864   ret void
3867 define amdgpu_kernel void @image_sample_a16_c_cd_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t, half %clamp) {
3868 ; CHECK-LABEL: @image_sample_a16_c_cd_cl_2d(
3869 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.2d.v4f32.f16.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], half [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3870 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3871 ; CHECK-NEXT:    ret void
3873   %dsdh32 = fpext half %dsdh to float
3874   %dtdh32 = fpext half %dtdh to float
3875   %dsdv32 = fpext half %dsdv to float
3876   %dtdv32 = fpext half %dtdv to float
3877   %s32 = fpext half %s to float
3878   %t32 = fpext half %t to float
3879   %clamp32 = fpext half %clamp to float
3880   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, float %clamp32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3881   store <4 x float> %res, ptr addrspace(1) %out
3882   ret void
3885 define amdgpu_kernel void @image_sample_a16_l_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %lod) {
3886 ; CHECK-LABEL: @image_sample_a16_l_1d(
3887 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3888 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3889 ; CHECK-NEXT:    ret void
3891   %s32 = fpext half %s to float
3892   %lod32 = fpext half %lod to float
3893   %res = call <4 x float> @llvm.amdgcn.image.sample.l.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %lod32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3894   store <4 x float> %res, ptr addrspace(1) %out
3895   ret void
3898 define amdgpu_kernel void @image_sample_a16_l_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %lod) {
3899 ; CHECK-LABEL: @image_sample_a16_l_2d(
3900 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.2d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3901 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3902 ; CHECK-NEXT:    ret void
3904   %s32 = fpext half %s to float
3905   %t32 = fpext half %t to float
3906   %lod32 = fpext half %lod to float
3907   %res = call <4 x float> @llvm.amdgcn.image.sample.l.2d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %lod32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3908   store <4 x float> %res, ptr addrspace(1) %out
3909   ret void
3912 define amdgpu_kernel void @image_sample_a16_c_l_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %lod) {
3913 ; CHECK-LABEL: @image_sample_a16_c_l_1d(
3914 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.l.1d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3915 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3916 ; CHECK-NEXT:    ret void
3918   %s32 = fpext half %s to float
3919   %lod32 = fpext half %lod to float
3920   %res = call <4 x float> @llvm.amdgcn.image.sample.c.l.1d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, float %lod32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3921   store <4 x float> %res, ptr addrspace(1) %out
3922   ret void
3925 define amdgpu_kernel void @image_sample_a16_c_l_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t, half %lod) {
3926 ; CHECK-LABEL: @image_sample_a16_c_l_2d(
3927 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.l.2d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[T:%.*]], half [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3928 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3929 ; CHECK-NEXT:    ret void
3931   %s32 = fpext half %s to float
3932   %t32 = fpext half %t to float
3933   %lod32 = fpext half %lod to float
3934   %res = call <4 x float> @llvm.amdgcn.image.sample.c.l.2d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, float %t32, float %lod32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3935   store <4 x float> %res, ptr addrspace(1) %out
3936   ret void
3939 define amdgpu_kernel void @image_sample_a16_lz_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s) {
3940 ; CHECK-LABEL: @image_sample_a16_lz_1d(
3941 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3942 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3943 ; CHECK-NEXT:    ret void
3945   %s32 = fpext half %s to float
3946   %res = call <4 x float> @llvm.amdgcn.image.sample.lz.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3947   store <4 x float> %res, ptr addrspace(1) %out
3948   ret void
3951 define amdgpu_kernel void @image_sample_a16_lz_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t) {
3952 ; CHECK-LABEL: @image_sample_a16_lz_2d(
3953 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.2d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3954 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3955 ; CHECK-NEXT:    ret void
3957   %s32 = fpext half %s to float
3958   %t32 = fpext half %t to float
3959   %res = call <4 x float> @llvm.amdgcn.image.sample.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3960   store <4 x float> %res, ptr addrspace(1) %out
3961   ret void
3964 define amdgpu_kernel void @image_sample_a16_c_lz_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s) {
3965 ; CHECK-LABEL: @image_sample_a16_c_lz_1d(
3966 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.1d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3967 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3968 ; CHECK-NEXT:    ret void
3970   %s32 = fpext half %s to float
3971   %res = call <4 x float> @llvm.amdgcn.image.sample.c.lz.1d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3972   store <4 x float> %res, ptr addrspace(1) %out
3973   ret void
3976 define amdgpu_kernel void @image_sample_a16_c_lz_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t) {
3977 ; CHECK-LABEL: @image_sample_a16_c_lz_2d(
3978 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.2d.v4f32.f16.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3979 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
3980 ; CHECK-NEXT:    ret void
3982   %s32 = fpext half %s to float
3983   %t32 = fpext half %t to float
3984   %res = call <4 x float> @llvm.amdgcn.image.sample.c.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
3985   store <4 x float> %res, ptr addrspace(1) %out
3986   ret void
3989 define amdgpu_kernel void @image_sample_a16_c_d_o_2darray_V1(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t, half %slice) {
3990 ; CHECK-LABEL: @image_sample_a16_c_d_o_2darray_V1(
3991 ; CHECK-NEXT:    [[RES:%.*]] = call float @llvm.amdgcn.image.sample.c.d.o.2darray.f32.f16.f16.v8i32.v4i32(i32 4, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], half [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
3992 ; CHECK-NEXT:    store float [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
3993 ; CHECK-NEXT:    ret void
3995   %dsdh32 = fpext half %dsdh to float
3996   %dtdh32 = fpext half %dtdh to float
3997   %dsdv32 = fpext half %dsdv to float
3998   %dtdv32 = fpext half %dtdv to float
3999   %s32 = fpext half %s to float
4000   %t32 = fpext half %t to float
4001   %slice32 = fpext half %slice to float
4002   %res = call float @llvm.amdgcn.image.sample.c.d.o.2darray.f32.f32.f32.v8i32.v4i32(i32 4, i32 %offset, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4003   store float %res, ptr addrspace(1) %out
4004   ret void
4007 define amdgpu_kernel void @image_sample_a16_c_d_o_2darray_V2(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %t, half %slice) {
4008 ; CHECK-LABEL: @image_sample_a16_c_d_o_2darray_V2(
4009 ; CHECK-NEXT:    [[RES:%.*]] = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f16.f16.v8i32.v4i32(i32 6, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half [[T:%.*]], half [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4010 ; CHECK-NEXT:    store <2 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 8
4011 ; CHECK-NEXT:    ret void
4013   %dsdh32 = fpext half %dsdh to float
4014   %dtdh32 = fpext half %dtdh to float
4015   %dsdv32 = fpext half %dsdv to float
4016   %dtdv32 = fpext half %dtdv to float
4017   %s32 = fpext half %s to float
4018   %t32 = fpext half %t to float
4019   %slice32 = fpext half %slice to float
4020   %res = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f32.f32.v8i32.v4i32(i32 6, i32 %offset, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float %t32, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4021   store <2 x float> %res, ptr addrspace(1) %out
4022   ret void
4025 define amdgpu_kernel void @image_sample_a16_c_d_o_2darray_const(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %slice) {
4026 ; CHECK-LABEL: @image_sample_a16_c_d_o_2darray_const(
4027 ; CHECK-NEXT:    [[RES:%.*]] = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f16.f16.v8i32.v4i32(i32 6, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[S:%.*]], half 0xH3400, half [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4028 ; CHECK-NEXT:    store <2 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 8
4029 ; CHECK-NEXT:    ret void
4031   %dsdh32 = fpext half %dsdh to float
4032   %dtdh32 = fpext half %dtdh to float
4033   %dsdv32 = fpext half %dsdv to float
4034   %dtdv32 = fpext half %dtdv to float
4035   %s32 = fpext half %s to float
4036   %slice32 = fpext half %slice to float
4037   %res = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f32.f32.v8i32.v4i32(i32 6, i32 %offset, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float 0.25, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4038   store <2 x float> %res, ptr addrspace(1) %out
4039   ret void
4042 define amdgpu_kernel void @image_sample_a16_c_d_o_2darray_const_noopt(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, half %s, half %slice) {
4043 ; CHECK-LABEL: @image_sample_a16_c_d_o_2darray_const_noopt(
4044 ; CHECK-NEXT:    [[S32:%.*]] = fpext half [[S:%.*]] to float
4045 ; CHECK-NEXT:    [[SLICE32:%.*]] = fpext half [[SLICE:%.*]] to float
4046 ; CHECK-NEXT:    [[RES:%.*]] = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f16.f32.v8i32.v4i32(i32 6, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S32]], float 1.000000e+10, float [[SLICE32]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4047 ; CHECK-NEXT:    store <2 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 8
4048 ; CHECK-NEXT:    ret void
4050   %dsdh32 = fpext half %dsdh to float
4051   %dtdh32 = fpext half %dtdh to float
4052   %dsdv32 = fpext half %dsdv to float
4053   %dtdv32 = fpext half %dtdv to float
4054   %s32 = fpext half %s to float
4055   %slice32 = fpext half %slice to float
4056   %res = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f32.f32.v8i32.v4i32(i32 6, i32 %offset, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s32, float 1.0e+10, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4057   store <2 x float> %res, ptr addrspace(1) %out
4058   ret void
4061 define amdgpu_kernel void @image_load_a16_mip_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i16 %s) {
4062 ; CHECK-LABEL: @image_load_a16_mip_1d(
4063 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.load.1d.v4f32.i16.v8i32(i32 15, i16 [[S:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4064 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4065 ; CHECK-NEXT:    ret void
4067   %s32 = zext i16 %s to i32
4068   %res = call <4 x float> @llvm.amdgcn.image.load.mip.1d.v4f32.i32.v8i32(i32 15, i32 %s32, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4069   store <4 x float> %res, ptr addrspace(1) %out
4070   ret void
4073 define amdgpu_kernel void @image_load_a16_mip_1d_noopt(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i16 %s) {
4074 ; CHECK-LABEL: @image_load_a16_mip_1d_noopt(
4075 ; CHECK-NEXT:    [[S32:%.*]] = sext i16 [[S:%.*]] to i32
4076 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.load.1d.v4f32.i32.v8i32(i32 15, i32 [[S32]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4077 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4078 ; CHECK-NEXT:    ret void
4080   %s32 = sext i16 %s to i32
4081   %res = call <4 x float> @llvm.amdgcn.image.load.mip.1d.v4f32.i32.v8i32(i32 15, i32 %s32, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4082   store <4 x float> %res, ptr addrspace(1) %out
4083   ret void
4086 define amdgpu_kernel void @image_load_a16_mip_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i16 %s, i16 %t) {
4087 ; CHECK-LABEL: @image_load_a16_mip_2d(
4088 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.load.2d.v4f32.i16.v8i32(i32 15, i16 [[S:%.*]], i16 [[T:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4089 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4090 ; CHECK-NEXT:    ret void
4092   %s32 = zext i16 %s to i32
4093   %t32 = zext i16 %t to i32
4094   %res = call <4 x float> @llvm.amdgcn.image.load.mip.2d.v4f32.i32.v8i32(i32 15, i32 %s32, i32 %t32, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4095   store <4 x float> %res, ptr addrspace(1) %out
4096   ret void
4099 define amdgpu_kernel void @image_load_a16_mip_2d_const(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i16 %s) {
4100 ; CHECK-LABEL: @image_load_a16_mip_2d_const(
4101 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.load.2d.v4f32.i16.v8i32(i32 15, i16 [[S:%.*]], i16 -1, <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4102 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4103 ; CHECK-NEXT:    ret void
4105   %s32 = zext i16 %s to i32
4106   %res = call <4 x float> @llvm.amdgcn.image.load.mip.2d.v4f32.i32.v8i32(i32 15, i32 %s32, i32 65535, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4107   store <4 x float> %res, ptr addrspace(1) %out
4108   ret void
4111 define amdgpu_kernel void @image_load_a16_mip_2d_const_noopt(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i16 %s) {
4112 ; CHECK-LABEL: @image_load_a16_mip_2d_const_noopt(
4113 ; CHECK-NEXT:    [[S32:%.*]] = zext i16 [[S:%.*]] to i32
4114 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.load.2d.v4f32.i32.v8i32(i32 15, i32 [[S32]], i32 65536, <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4115 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4116 ; CHECK-NEXT:    ret void
4118   %s32 = zext i16 %s to i32
4119   %res = call <4 x float> @llvm.amdgcn.image.load.mip.2d.v4f32.i32.v8i32(i32 15, i32 %s32, i32 65536, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4120   store <4 x float> %res, ptr addrspace(1) %out
4121   ret void
4124 ; --------------------------------------------------------------------
4125 ; llvm.amdgcn.image.sample g16
4126 ; --------------------------------------------------------------------
4128 define amdgpu_kernel void @image_sample_g16_d_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, float %s) {
4129 ; CHECK-LABEL: @image_sample_g16_d_1d(
4130 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4131 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4132 ; CHECK-NEXT:    ret void
4134   %dsdh32 = fpext half %dsdh to float
4135   %dsdv32 = fpext half %dsdv to float
4136   %res = call <4 x float> @llvm.amdgcn.image.sample.d.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4137   store <4 x float> %res, ptr addrspace(1) %out
4138   ret void
4141 define amdgpu_kernel void @image_sample_g16_d_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t) {
4142 ; CHECK-LABEL: @image_sample_g16_d_2d(
4143 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4144 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4145 ; CHECK-NEXT:    ret void
4147   %dsdh32 = fpext half %dsdh to float
4148   %dtdh32 = fpext half %dtdh to float
4149   %dsdv32 = fpext half %dsdv to float
4150   %dtdv32 = fpext half %dtdv to float
4151   %res = call <4 x float> @llvm.amdgcn.image.sample.d.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4152   store <4 x float> %res, ptr addrspace(1) %out
4153   ret void
4156 define amdgpu_kernel void @image_sample_g16_d_3d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %drdh, half %dsdv, half %dtdv, half %drdv, float %s, float %t, float %r) {
4157 ; CHECK-LABEL: @image_sample_g16_d_3d(
4158 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.3d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DRDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], half [[DRDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[R:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4159 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4160 ; CHECK-NEXT:    ret void
4162   %dsdh32 = fpext half %dsdh to float
4163   %dtdh32 = fpext half %dtdh to float
4164   %drdh32 = fpext half %drdh to float
4165   %dsdv32 = fpext half %dsdv to float
4166   %dtdv32 = fpext half %dtdv to float
4167   %drdv32 = fpext half %drdv to float
4168   %res = call <4 x float> @llvm.amdgcn.image.sample.d.3d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %drdh32, float %dsdv32, float %dtdv32, float %drdv32, float %s, float %t, float %r, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4169   store <4 x float> %res, ptr addrspace(1) %out
4170   ret void
4173 define amdgpu_kernel void @image_sample_g16_c_d_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, float %s) {
4174 ; CHECK-LABEL: @image_sample_g16_c_d_1d(
4175 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4176 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4177 ; CHECK-NEXT:    ret void
4179   %dsdh32 = fpext half %dsdh to float
4180   %dsdv32 = fpext half %dsdv to float
4181   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4182   store <4 x float> %res, ptr addrspace(1) %out
4183   ret void
4186 define amdgpu_kernel void @image_sample_g16_c_d_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t) {
4187 ; CHECK-LABEL: @image_sample_g16_c_d_2d(
4188 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4189 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4190 ; CHECK-NEXT:    ret void
4192   %dsdh32 = fpext half %dsdh to float
4193   %dtdh32 = fpext half %dtdh to float
4194   %dsdv32 = fpext half %dsdv to float
4195   %dtdv32 = fpext half %dtdv to float
4196   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4197   store <4 x float> %res, ptr addrspace(1) %out
4198   ret void
4201 define amdgpu_kernel void @image_sample_g16_d_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, float %s, float %clamp) {
4202 ; CHECK-LABEL: @image_sample_g16_d_cl_1d(
4203 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.cl.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4204 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4205 ; CHECK-NEXT:    ret void
4207   %dsdh32 = fpext half %dsdh to float
4208   %dsdv32 = fpext half %dsdv to float
4209   %res = call <4 x float> @llvm.amdgcn.image.sample.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4210   store <4 x float> %res, ptr addrspace(1) %out
4211   ret void
4214 define amdgpu_kernel void @image_sample_g16_d_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t, float %clamp) {
4215 ; CHECK-LABEL: @image_sample_g16_d_cl_2d(
4216 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.cl.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4217 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4218 ; CHECK-NEXT:    ret void
4220   %dsdh32 = fpext half %dsdh to float
4221   %dtdh32 = fpext half %dtdh to float
4222   %dsdv32 = fpext half %dsdv to float
4223   %dtdv32 = fpext half %dtdv to float
4224   %res = call <4 x float> @llvm.amdgcn.image.sample.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4225   store <4 x float> %res, ptr addrspace(1) %out
4226   ret void
4229 define amdgpu_kernel void @image_sample_g16_c_d_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, float %s, float %clamp) {
4230 ; CHECK-LABEL: @image_sample_g16_c_d_cl_1d(
4231 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4232 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4233 ; CHECK-NEXT:    ret void
4235   %dsdh32 = fpext half %dsdh to float
4236   %dsdv32 = fpext half %dsdv to float
4237   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4238   store <4 x float> %res, ptr addrspace(1) %out
4239   ret void
4242 define amdgpu_kernel void @image_sample_g16_c_d_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t, float %clamp) {
4243 ; CHECK-LABEL: @image_sample_g16_c_d_cl_2d(
4244 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4245 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4246 ; CHECK-NEXT:    ret void
4248   %dsdh32 = fpext half %dsdh to float
4249   %dtdh32 = fpext half %dtdh to float
4250   %dsdv32 = fpext half %dsdv to float
4251   %dtdv32 = fpext half %dtdv to float
4252   %res = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4253   store <4 x float> %res, ptr addrspace(1) %out
4254   ret void
4257 define amdgpu_kernel void @image_sample_g16_cd_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, float %s) {
4258 ; CHECK-LABEL: @image_sample_g16_cd_1d(
4259 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4260 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4261 ; CHECK-NEXT:    ret void
4263   %dsdh32 = fpext half %dsdh to float
4264   %dsdv32 = fpext half %dsdv to float
4265   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4266   store <4 x float> %res, ptr addrspace(1) %out
4267   ret void
4270 define amdgpu_kernel void @image_sample_g16_cd_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t) {
4271 ; CHECK-LABEL: @image_sample_g16_cd_2d(
4272 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4273 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4274 ; CHECK-NEXT:    ret void
4276   %dsdh32 = fpext half %dsdh to float
4277   %dtdh32 = fpext half %dtdh to float
4278   %dsdv32 = fpext half %dsdv to float
4279   %dtdv32 = fpext half %dtdv to float
4280   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4281   store <4 x float> %res, ptr addrspace(1) %out
4282   ret void
4285 define amdgpu_kernel void @image_sample_g16_c_cd_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, float %s) {
4286 ; CHECK-LABEL: @image_sample_g16_c_cd_1d(
4287 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4288 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4289 ; CHECK-NEXT:    ret void
4291   %dsdh32 = fpext half %dsdh to float
4292   %dsdv32 = fpext half %dsdv to float
4293   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4294   store <4 x float> %res, ptr addrspace(1) %out
4295   ret void
4298 define amdgpu_kernel void @image_sample_g16_c_cd_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t) {
4299 ; CHECK-LABEL: @image_sample_g16_c_cd_2d(
4300 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4301 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4302 ; CHECK-NEXT:    ret void
4304   %dsdh32 = fpext half %dsdh to float
4305   %dtdh32 = fpext half %dtdh to float
4306   %dsdv32 = fpext half %dsdv to float
4307   %dtdv32 = fpext half %dtdv to float
4308   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4309   store <4 x float> %res, ptr addrspace(1) %out
4310   ret void
4313 define amdgpu_kernel void @image_sample_g16_cd_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dsdv, float %s, float %clamp) {
4314 ; CHECK-LABEL: @image_sample_g16_cd_cl_1d(
4315 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4316 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4317 ; CHECK-NEXT:    ret void
4319   %dsdh32 = fpext half %dsdh to float
4320   %dsdv32 = fpext half %dsdv to float
4321   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dsdv32, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4322   store <4 x float> %res, ptr addrspace(1) %out
4323   ret void
4326 define amdgpu_kernel void @image_sample_g16_cd_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t, float %clamp) {
4327 ; CHECK-LABEL: @image_sample_g16_cd_cl_2d(
4328 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4329 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4330 ; CHECK-NEXT:    ret void
4332   %dsdh32 = fpext half %dsdh to float
4333   %dtdh32 = fpext half %dtdh to float
4334   %dsdv32 = fpext half %dsdv to float
4335   %dtdv32 = fpext half %dtdv to float
4336   %res = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4337   store <4 x float> %res, ptr addrspace(1) %out
4338   ret void
4341 define amdgpu_kernel void @image_sample_g16_c_cd_cl_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dsdv, float %s, float %clamp) {
4342 ; CHECK-LABEL: @image_sample_g16_c_cd_cl_1d(
4343 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.1d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4344 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4345 ; CHECK-NEXT:    ret void
4347   %dsdh32 = fpext half %dsdh to float
4348   %dsdv32 = fpext half %dsdv to float
4349   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dsdv32, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4350   store <4 x float> %res, ptr addrspace(1) %out
4351   ret void
4354 define amdgpu_kernel void @image_sample_g16_c_cd_cl_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t, float %clamp) {
4355 ; CHECK-LABEL: @image_sample_g16_c_cd_cl_2d(
4356 ; CHECK-NEXT:    [[RES:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.2d.v4f32.f16.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4357 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4358 ; CHECK-NEXT:    ret void
4360   %dsdh32 = fpext half %dsdh to float
4361   %dtdh32 = fpext half %dtdh to float
4362   %dsdv32 = fpext half %dsdv to float
4363   %dtdv32 = fpext half %dtdv to float
4364   %res = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4365   store <4 x float> %res, ptr addrspace(1) %out
4366   ret void
4369 define amdgpu_kernel void @image_sample_g16_c_d_o_2darray_V1(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t, float %slice) {
4370 ; CHECK-LABEL: @image_sample_g16_c_d_o_2darray_V1(
4371 ; CHECK-NEXT:    [[RES:%.*]] = call float @llvm.amdgcn.image.sample.c.d.o.2darray.f32.f16.f32.v8i32.v4i32(i32 4, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4372 ; CHECK-NEXT:    store float [[RES]], ptr addrspace(1) [[OUT:%.*]], align 4
4373 ; CHECK-NEXT:    ret void
4375   %dsdh32 = fpext half %dsdh to float
4376   %dtdh32 = fpext half %dtdh to float
4377   %dsdv32 = fpext half %dsdv to float
4378   %dtdv32 = fpext half %dtdv to float
4379   %res = call float @llvm.amdgcn.image.sample.c.d.o.2darray.f32.f32.f32.v8i32.v4i32(i32 4, i32 %offset, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, float %slice, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4380   store float %res, ptr addrspace(1) %out
4381   ret void
4384 define amdgpu_kernel void @image_sample_g16_c_d_o_2darray_V2(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, half %dsdh, half %dtdh, half %dsdv, half %dtdv, float %s, float %t, float %slice) {
4385 ; CHECK-LABEL: @image_sample_g16_c_d_o_2darray_V2(
4386 ; CHECK-NEXT:    [[RES:%.*]] = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f16.f32.v8i32.v4i32(i32 6, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], half [[DSDH:%.*]], half [[DTDH:%.*]], half [[DSDV:%.*]], half [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4387 ; CHECK-NEXT:    store <2 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 8
4388 ; CHECK-NEXT:    ret void
4390   %dsdh32 = fpext half %dsdh to float
4391   %dtdh32 = fpext half %dtdh to float
4392   %dsdv32 = fpext half %dsdv to float
4393   %dtdv32 = fpext half %dtdv to float
4394   %res = call <2 x float> @llvm.amdgcn.image.sample.c.d.o.2darray.v2f32.f32.f32.v8i32.v4i32(i32 6, i32 %offset, float %zcompare, float %dsdh32, float %dtdh32, float %dsdv32, float %dtdv32, float %s, float %t, float %slice, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4395   store <2 x float> %res, ptr addrspace(1) %out
4396   ret void
4399 ; --------------------------------------------------------------------
4400 ; llvm.amdgcn.image.sample a16 preserve fast-math flags
4401 ; --------------------------------------------------------------------
4403 define amdgpu_kernel void @image_sample_a16_1d_nnan(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s) {
4404 ; CHECK-LABEL: @image_sample_a16_1d_nnan(
4405 ; CHECK-NEXT:    [[RES:%.*]] = call nnan <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4406 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4407 ; CHECK-NEXT:    ret void
4409   %s32 = fpext half %s to float
4410   %res = call nnan <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4411   store <4 x float> %res, ptr addrspace(1) %out
4412   ret void
4415 define amdgpu_kernel void @image_sample_a16_1d_nnan_ninf_nsz(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s) {
4416 ; CHECK-LABEL: @image_sample_a16_1d_nnan_ninf_nsz(
4417 ; CHECK-NEXT:    [[RES:%.*]] = call nnan ninf nsz <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4418 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4419 ; CHECK-NEXT:    ret void
4421   %s32 = fpext half %s to float
4422   %res = call nnan ninf nsz <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4423   store <4 x float> %res, ptr addrspace(1) %out
4424   ret void
4427 define amdgpu_kernel void @image_sample_a16_1d_fast(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s) {
4428 ; CHECK-LABEL: @image_sample_a16_1d_fast(
4429 ; CHECK-NEXT:    [[RES:%.*]] = call fast <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4430 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4431 ; CHECK-NEXT:    ret void
4433   %s32 = fpext half %s to float
4434   %res = call fast <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4435   store <4 x float> %res, ptr addrspace(1) %out
4436   ret void
4439 define amdgpu_kernel void @image_sample_a16_2d_nnan(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t) {
4440 ; CHECK-LABEL: @image_sample_a16_2d_nnan(
4441 ; CHECK-NEXT:    [[RES:%.*]] = call nnan <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4442 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4443 ; CHECK-NEXT:    ret void
4445   %s32 = fpext half %s to float
4446   %t32 = fpext half %t to float
4447   %res = call nnan <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4448   store <4 x float> %res, ptr addrspace(1) %out
4449   ret void
4452 define amdgpu_kernel void @image_sample_a16_3d_nnan(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %r) {
4453 ; CHECK-LABEL: @image_sample_a16_3d_nnan(
4454 ; CHECK-NEXT:    [[RES:%.*]] = call nnan <4 x float> @llvm.amdgcn.image.sample.3d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[R:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4455 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4456 ; CHECK-NEXT:    ret void
4458   %s32 = fpext half %s to float
4459   %t32 = fpext half %t to float
4460   %r32 = fpext half %r to float
4461   %res = call nnan <4 x float> @llvm.amdgcn.image.sample.3d.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %r32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4462   store <4 x float> %res, ptr addrspace(1) %out
4463   ret void
4466 define amdgpu_kernel void @image_sample_a16_cube_nnan(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %face) {
4468 ; CHECK-LABEL: @image_sample_a16_cube_nnan(
4469 ; CHECK-NEXT:    [[RES:%.*]] = call nnan <4 x float> @llvm.amdgcn.image.sample.cube.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[FACE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4470 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4471 ; CHECK-NEXT:    ret void
4473   %s32 = fpext half %s to float
4474   %t32 = fpext half %t to float
4475   %face32 = fpext half %face to float
4476   %res = call nnan <4 x float> @llvm.amdgcn.image.sample.cube.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %face32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4477   store <4 x float> %res, ptr addrspace(1) %out
4478   ret void
4481 define amdgpu_kernel void @image_sample_a16_1darray_nnan(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %slice) {
4482 ; CHECK-LABEL: @image_sample_a16_1darray_nnan(
4483 ; CHECK-NEXT:    [[RES:%.*]] = call nnan <4 x float> @llvm.amdgcn.image.sample.1darray.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4484 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4485 ; CHECK-NEXT:    ret void
4487   %s32 = fpext half %s to float
4488   %slice32 = fpext half %slice to float
4489   %res = call nnan <4 x float> @llvm.amdgcn.image.sample.1darray.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4490   store <4 x float> %res, ptr addrspace(1) %out
4491   ret void
4494 define amdgpu_kernel void @image_sample_a16_2darray_nnan(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %slice) {
4495 ; CHECK-LABEL: @image_sample_a16_2darray_nnan(
4496 ; CHECK-NEXT:    [[RES:%.*]] = call nnan <4 x float> @llvm.amdgcn.image.sample.2darray.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], half [[T:%.*]], half [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4497 ; CHECK-NEXT:    store <4 x float> [[RES]], ptr addrspace(1) [[OUT:%.*]], align 16
4498 ; CHECK-NEXT:    ret void
4500   %s32 = fpext half %s to float
4501   %t32 = fpext half %t to float
4502   %slice32 = fpext half %slice to float
4503   %res = call nnan <4 x float> @llvm.amdgcn.image.sample.2darray.v4f32.f32.v8i32.v4i32(i32 15, float %s32, float %t32, float %slice32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4504   store <4 x float> %res, ptr addrspace(1) %out
4505   ret void
4508 ; --------------------------------------------------------------------
4509 ; llvm.amdgcn.image.sample l to lz
4510 ; --------------------------------------------------------------------
4512 declare <4 x float> @llvm.amdgcn.image.sample.l.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4513 declare <4 x float> @llvm.amdgcn.image.sample.l.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4514 declare <4 x float> @llvm.amdgcn.image.sample.c.l.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4515 declare <4 x float> @llvm.amdgcn.image.sample.c.l.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4517 declare <4 x float> @llvm.amdgcn.image.gather4.l.2d.v4f32.f32.v8i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4518 declare <4 x float> @llvm.amdgcn.image.gather4.c.l.2d.v4f32.f32.v8i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4519 declare <4 x float> @llvm.amdgcn.image.gather4.l.o.2d.v4f32.f32.v8i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4520 declare <4 x float> @llvm.amdgcn.image.gather4.c.l.o.2d.v4f32.f32.v8i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4521 declare <4 x float> @llvm.amdgcn.image.gather4.c.l.o.2darray.v4f32.f32.v8i32(i32, i32, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4523 define amdgpu_kernel void @sample_l_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %lod) {
4524 ; CHECK-LABEL: @sample_l_1d(
4525 ; CHECK-NEXT:  main_body:
4526 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4527 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4528 ; CHECK-NEXT:    ret void
4530 main_body:
4531   %v = call <4 x float> @llvm.amdgcn.image.sample.l.1d.v4f32.f32.v8i32.v4i32(i32 15, float %s, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4532   store <4 x float> %v, ptr addrspace(1) %out
4533   ret void
4536 define amdgpu_kernel void @sample_l_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t, float %lod) {
4537 ; CHECK-LABEL: @sample_l_2d(
4538 ; CHECK-NEXT:  main_body:
4539 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4540 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4541 ; CHECK-NEXT:    ret void
4543 main_body:
4544   %v = call <4 x float> @llvm.amdgcn.image.sample.l.2d.v4f32.f32.v8i32.v4i32(i32 15, float %s, float %t, float -0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4545   store <4 x float> %v, ptr addrspace(1) %out
4546   ret void
4549 define amdgpu_kernel void @sample_c_l_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %lod) {
4550 ; CHECK-LABEL: @sample_c_l_1d(
4551 ; CHECK-NEXT:  main_body:
4552 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4553 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4554 ; CHECK-NEXT:    ret void
4556 main_body:
4557   %v = call <4 x float> @llvm.amdgcn.image.sample.c.l.1d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s, float -2.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4558   store <4 x float> %v, ptr addrspace(1) %out
4559   ret void
4562 define amdgpu_kernel void @sample_c_l_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t, float %lod) {
4563 ; CHECK-LABEL: @sample_c_l_2d(
4564 ; CHECK-NEXT:  main_body:
4565 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4566 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4567 ; CHECK-NEXT:    ret void
4569 main_body:
4570   %v = call <4 x float> @llvm.amdgcn.image.sample.c.l.2d.v4f32.f32.v8i32.v4i32(i32 15, float %zcompare, float %s, float %t, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4571   store <4 x float> %v, ptr addrspace(1) %out
4572   ret void
4575 define amdgpu_kernel void @sample_l_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %s, float %lod) {
4576 ; CHECK-LABEL: @sample_l_o_1d(
4577 ; CHECK-NEXT:  main_body:
4578 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4579 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4580 ; CHECK-NEXT:    ret void
4582 main_body:
4583   %v = call <4 x float> @llvm.amdgcn.image.sample.l.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float %s, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4584   store <4 x float> %v, ptr addrspace(1) %out
4585   ret void
4588 define amdgpu_kernel void @sample_l_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %s, float %t, float %lod) {
4589 ; CHECK-LABEL: @sample_l_o_2d(
4590 ; CHECK-NEXT:  main_body:
4591 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4592 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4593 ; CHECK-NEXT:    ret void
4595 main_body:
4596   %v = call <4 x float> @llvm.amdgcn.image.sample.l.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float %s, float %t, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4597   store <4 x float> %v, ptr addrspace(1) %out
4598   ret void
4601 define amdgpu_kernel void @sample_c_l_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, float %s, float %lod) {
4602 ; CHECK-LABEL: @sample_c_l_o_1d(
4603 ; CHECK-NEXT:  main_body:
4604 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4605 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4606 ; CHECK-NEXT:    ret void
4608 main_body:
4609   %v = call <4 x float> @llvm.amdgcn.image.sample.c.l.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float %zcompare, float %s, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4610   store <4 x float> %v, ptr addrspace(1) %out
4611   ret void
4614 define amdgpu_kernel void @sample_c_l_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, float %s, float %t, float %lod) {
4615 ; CHECK-LABEL: @sample_c_l_o_2d(
4616 ; CHECK-NEXT:  main_body:
4617 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4618 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4619 ; CHECK-NEXT:    ret void
4621 main_body:
4622   %v = call <4 x float> @llvm.amdgcn.image.sample.c.l.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float %zcompare, float %s, float %t, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4623   store <4 x float> %v, ptr addrspace(1) %out
4624   ret void
4627 define amdgpu_kernel void @gather4_l_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t, float %lod) {
4628 ; CHECK-LABEL: @gather4_l_2d(
4629 ; CHECK-NEXT:  main_body:
4630 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4631 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4632 ; CHECK-NEXT:    ret void
4634 main_body:
4635   %v = call <4 x float> @llvm.amdgcn.image.gather4.l.2d.v4f32.f32.v8i32(i32 15, float %s, float %t, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4636   store <4 x float> %v, ptr addrspace(1) %out
4637   ret void
4640 define amdgpu_kernel void @gather4_c_l_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t, float %lod) {
4641 ; CHECK-LABEL: @gather4_c_l_2d(
4642 ; CHECK-NEXT:  main_body:
4643 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.c.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4644 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4645 ; CHECK-NEXT:    ret void
4647 main_body:
4648   %v = call <4 x float> @llvm.amdgcn.image.gather4.c.l.2d.v4f32.f32.v8i32(i32 15, float %zcompare, float %s, float %t, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4649   store <4 x float> %v, ptr addrspace(1) %out
4650   ret void
4653 define amdgpu_kernel void @gather4_l_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %s, float %t, float %lod) {
4654 ; CHECK-LABEL: @gather4_l_o_2d(
4655 ; CHECK-NEXT:  main_body:
4656 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.lz.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4657 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4658 ; CHECK-NEXT:    ret void
4660 main_body:
4661   %v = call <4 x float> @llvm.amdgcn.image.gather4.l.o.2d.v4f32.f32.v8i32(i32 15, i32 %offset, float %s, float %t, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4662   store <4 x float> %v, ptr addrspace(1) %out
4663   ret void
4666 define amdgpu_kernel void @gather4_c_l_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, float %s, float %t, float %lod) {
4667 ; CHECK-LABEL: @gather4_c_l_o_2d(
4668 ; CHECK-NEXT:  main_body:
4669 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.c.lz.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4670 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4671 ; CHECK-NEXT:    ret void
4673 main_body:
4674   %v = call <4 x float> @llvm.amdgcn.image.gather4.c.l.o.2d.v4f32.f32.v8i32(i32 15, i32 %offset, float %zcompare, float %s, float %t, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4675   store <4 x float> %v, ptr addrspace(1) %out
4676   ret void
4679 define amdgpu_kernel void @gather4_c_l_o_2darray(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, float %s, float %t, float %slice, float %lod) {
4680 ; CHECK-LABEL: @gather4_c_l_o_2darray(
4681 ; CHECK-NEXT:  main_body:
4682 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.c.lz.o.2darray.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], float [[SLICE:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4683 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4684 ; CHECK-NEXT:    ret void
4686 main_body:
4687   %v = call <4 x float> @llvm.amdgcn.image.gather4.c.l.o.2darray.v4f32.f32.v8i32(i32 15, i32 %offset, float %zcompare, float %s, float %t, float %slice, float 0.0, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4688   store <4 x float> %v, ptr addrspace(1) %out
4689   ret void
4692 ; --------------------------------------------------------------------
4693 ; llvm.amdgcn.image.sample mipmap zero
4694 ; --------------------------------------------------------------------
4696 define amdgpu_kernel void @load_mip_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i32 %s) {
4697 ; CHECK-LABEL: @load_mip_1d(
4698 ; CHECK-NEXT:  main_body:
4699 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.load.1d.v4f32.i32.v8i32(i32 15, i32 [[S:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4700 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4701 ; CHECK-NEXT:    ret void
4703 main_body:
4704   %v = call <4 x float> @llvm.amdgcn.image.load.mip.1d.v4f32.i32.v8i32(i32 15, i32 %s, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4705   store <4 x float> %v, ptr addrspace(1) %out
4706   ret void
4709 define amdgpu_kernel void @load_mip_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i32 %s, i32 %t) {
4710 ; CHECK-LABEL: @load_mip_2d(
4711 ; CHECK-NEXT:  main_body:
4712 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.load.2d.v4f32.i32.v8i32(i32 15, i32 [[S:%.*]], i32 [[T:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4713 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4714 ; CHECK-NEXT:    ret void
4716 main_body:
4717   %v = call <4 x float> @llvm.amdgcn.image.load.mip.2d.v4f32.i32.v8i32(i32 15, i32 %s, i32 %t, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4718   store <4 x float> %v, ptr addrspace(1) %out
4719   ret void
4722 define amdgpu_kernel void @load_mip_3d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i32 %s, i32 %t, i32 %u) {
4723 ; CHECK-LABEL: @load_mip_3d(
4724 ; CHECK-NEXT:  main_body:
4725 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.load.3d.v4f32.i32.v8i32(i32 15, i32 [[S:%.*]], i32 [[T:%.*]], i32 [[U:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4726 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4727 ; CHECK-NEXT:    ret void
4729 main_body:
4730   %v = call <4 x float> @llvm.amdgcn.image.load.mip.3d.v4f32.i32.v8i32(i32 15, i32 %s, i32 %t, i32 %u, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4731   store <4 x float> %v, ptr addrspace(1) %out
4732   ret void
4735 define amdgpu_kernel void @load_mip_1darray(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i32 %s, i32 %t) {
4736 ; CHECK-LABEL: @load_mip_1darray(
4737 ; CHECK-NEXT:  main_body:
4738 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.load.1darray.v4f32.i32.v8i32(i32 15, i32 [[S:%.*]], i32 [[T:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4739 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4740 ; CHECK-NEXT:    ret void
4742 main_body:
4743   %v = call <4 x float> @llvm.amdgcn.image.load.mip.1darray.v4f32.i32.v8i32(i32 15, i32 %s, i32 %t, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4744   store <4 x float> %v, ptr addrspace(1) %out
4745   ret void
4748 define amdgpu_kernel void @load_mip_2darray(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i32 %s, i32 %t, i32 %u) {
4749 ; CHECK-LABEL: @load_mip_2darray(
4750 ; CHECK-NEXT:  main_body:
4751 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.load.2darray.v4f32.i32.v8i32(i32 15, i32 [[S:%.*]], i32 [[T:%.*]], i32 [[U:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4752 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4753 ; CHECK-NEXT:    ret void
4755 main_body:
4756   %v = call <4 x float> @llvm.amdgcn.image.load.mip.2darray.v4f32.i32.v8i32(i32 15, i32 %s, i32 %t, i32 %u, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4757   store <4 x float> %v, ptr addrspace(1) %out
4758   ret void
4761 define amdgpu_kernel void @load_mip_cube(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, i32 %s, i32 %t, i32 %u) {
4762 ; CHECK-LABEL: @load_mip_cube(
4763 ; CHECK-NEXT:  main_body:
4764 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.load.cube.v4f32.i32.v8i32(i32 15, i32 [[S:%.*]], i32 [[T:%.*]], i32 [[U:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4765 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4766 ; CHECK-NEXT:    ret void
4768 main_body:
4769   %v = call <4 x float> @llvm.amdgcn.image.load.mip.cube.v4f32.i32.v8i32(i32 15, i32 %s, i32 %t, i32 %u, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4770   store <4 x float> %v, ptr addrspace(1) %out
4771   ret void
4775 define amdgpu_kernel void @store_mip_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x float> %vdata, i32 %s) {
4776 ; CHECK-LABEL: @store_mip_1d(
4777 ; CHECK-NEXT:  main_body:
4778 ; CHECK-NEXT:    call void @llvm.amdgcn.image.store.1d.v4f32.i32.v8i32(<4 x float> [[VDATA:%.*]], i32 15, i32 [[S:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4779 ; CHECK-NEXT:    ret void
4781 main_body:
4782   call void @llvm.amdgcn.image.store.mip.1d.v4f32.i32(<4 x float> %vdata, i32 15, i32 %s, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4783   ret void
4786 define amdgpu_kernel void @store_mip_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x float> %vdata, i32 %s, i32 %t) {
4787 ; CHECK-LABEL: @store_mip_2d(
4788 ; CHECK-NEXT:  main_body:
4789 ; CHECK-NEXT:    call void @llvm.amdgcn.image.store.2d.v4f32.i32.v8i32(<4 x float> [[VDATA:%.*]], i32 15, i32 [[S:%.*]], i32 [[T:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4790 ; CHECK-NEXT:    ret void
4792 main_body:
4793   call void @llvm.amdgcn.image.store.mip.2d.v4f32.i32(<4 x float> %vdata, i32 15, i32 %s, i32 %t, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4794   ret void
4797 define amdgpu_kernel void @store_mip_3d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x float> %vdata, i32 %s, i32 %t, i32 %u) {
4798 ; CHECK-LABEL: @store_mip_3d(
4799 ; CHECK-NEXT:  main_body:
4800 ; CHECK-NEXT:    call void @llvm.amdgcn.image.store.3d.v4f32.i32.v8i32(<4 x float> [[VDATA:%.*]], i32 15, i32 [[S:%.*]], i32 [[T:%.*]], i32 [[U:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4801 ; CHECK-NEXT:    ret void
4803 main_body:
4804   call void @llvm.amdgcn.image.store.mip.3d.v4f32.i32(<4 x float> %vdata, i32 15, i32 %s, i32 %t, i32 %u, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4805   ret void
4808 define amdgpu_kernel void @store_mip_1darray(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x float> %vdata, i32 %s, i32 %t) {
4809 ; CHECK-LABEL: @store_mip_1darray(
4810 ; CHECK-NEXT:  main_body:
4811 ; CHECK-NEXT:    call void @llvm.amdgcn.image.store.1darray.v4f32.i32.v8i32(<4 x float> [[VDATA:%.*]], i32 15, i32 [[S:%.*]], i32 [[T:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4812 ; CHECK-NEXT:    ret void
4814 main_body:
4815   call void @llvm.amdgcn.image.store.mip.1darray.v4f32.i32(<4 x float> %vdata, i32 15, i32 %s, i32 %t, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4816   ret void
4819 define amdgpu_kernel void @store_mip_2darray(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x float> %vdata, i32 %s, i32 %t, i32 %u) {
4820 ; CHECK-LABEL: @store_mip_2darray(
4821 ; CHECK-NEXT:  main_body:
4822 ; CHECK-NEXT:    call void @llvm.amdgcn.image.store.2darray.v4f32.i32.v8i32(<4 x float> [[VDATA:%.*]], i32 15, i32 [[S:%.*]], i32 [[T:%.*]], i32 [[U:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4823 ; CHECK-NEXT:    ret void
4825 main_body:
4826   call void @llvm.amdgcn.image.store.mip.2darray.v4f32.i32(<4 x float> %vdata, i32 15, i32 %s, i32 %t, i32 %u, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4827   ret void
4830 define amdgpu_kernel void @store_mip_cube(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x float> %vdata, i32 %s, i32 %t, i32 %u) {
4831 ; CHECK-LABEL: @store_mip_cube(
4832 ; CHECK-NEXT:  main_body:
4833 ; CHECK-NEXT:    call void @llvm.amdgcn.image.store.cube.v4f32.i32.v8i32(<4 x float> [[VDATA:%.*]], i32 15, i32 [[S:%.*]], i32 [[T:%.*]], i32 [[U:%.*]], <8 x i32> [[RSRC:%.*]], i32 0, i32 0)
4834 ; CHECK-NEXT:    ret void
4836 main_body:
4837   call void @llvm.amdgcn.image.store.mip.cube.v4f32.i32(<4 x float> %vdata, i32 15, i32 %s, i32 %t, i32 %u, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
4838   ret void
4841 declare <4 x float> @llvm.amdgcn.image.load.mip.1d.v4f32.i32.v8i32(i32, i32, i32, <8 x i32>, i32, i32) #1
4842 declare <4 x float> @llvm.amdgcn.image.load.mip.2d.v4f32.i32.v8i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #1
4843 declare <4 x float> @llvm.amdgcn.image.load.mip.3d.v4f32.i32.v8i32(i32, i32, i32, i32, i32, <8 x i32>, i32, i32) #1
4844 declare <4 x float> @llvm.amdgcn.image.load.mip.1darray.v4f32.i32.v8i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #1
4845 declare <4 x float> @llvm.amdgcn.image.load.mip.2darray.v4f32.i32.v8i32(i32, i32, i32, i32, i32, <8 x i32>, i32, i32) #1
4846 declare <4 x float> @llvm.amdgcn.image.load.mip.cube.v4f32.i32.v8i32(i32, i32, i32, i32, i32, <8 x i32>, i32, i32) #1
4849 declare void @llvm.amdgcn.image.store.mip.1d.v4f32.i32.v8i32(<4 x float>, i32, i32, i32, <8 x i32>, i32, i32) #0
4850 declare void @llvm.amdgcn.image.store.mip.2d.v4f32.i32.v8i32(<4 x float>, i32, i32, i32, i32, <8 x i32>, i32, i32) #0
4851 declare void @llvm.amdgcn.image.store.mip.3d.v4f32.i32.v8i32(<4 x float>, i32, i32, i32, i32, i32, <8 x i32>, i32, i32) #0
4852 declare void @llvm.amdgcn.image.store.mip.cube.v4f32.i32.v8i32(<4 x float>, i32, i32, i32, i32, i32, <8 x i32>, i32, i32) #0
4853 declare void @llvm.amdgcn.image.store.mip.1darray.v4f32.i32.v8i32(<4 x float>, i32, i32, i32, i32, <8 x i32>, i32, i32) #0
4854 declare void @llvm.amdgcn.image.store.mip.2darray.v4f32.i32.v8i32(<4 x float>, i32, i32, i32, i32, i32, <8 x i32>, i32, i32) #0
4856 ; --------------------------------------------------------------------
4857 ; llvm.amdgcn.image.sample bias zero
4858 ; --------------------------------------------------------------------
4860 declare <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.v8i32.v4i32(i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4861 declare <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4862 declare <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f32.v8i32.v4i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4863 declare <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f32.v8i32.v4i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4864 declare <4 x float> @llvm.amdgcn.image.sample.b.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4865 declare <4 x float> @llvm.amdgcn.image.sample.b.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4866 declare <4 x float> @llvm.amdgcn.image.sample.c.b.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4867 declare <4 x float> @llvm.amdgcn.image.sample.c.b.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4868 declare <4 x float> @llvm.amdgcn.image.sample.c.b.o.2d.v4f32.f16.v8i32.v4i32(i32, i32, half, float, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4870 declare <4 x float> @llvm.amdgcn.image.gather4.b.2d.v4f32.f32.v8i32(i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4871 declare <4 x float> @llvm.amdgcn.image.gather4.c.b.2d.v4f32.f32.v8i32(i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4872 declare <4 x float> @llvm.amdgcn.image.gather4.b.o.2d.v4f32.f32.v8i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4873 declare <4 x float> @llvm.amdgcn.image.gather4.c.b.o.2d.v4f32.f32.v8i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
4875 define amdgpu_kernel void @sample_b_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s) {
4876 ; CHECK-LABEL: @sample_b_1d(
4877 ; CHECK-NEXT:  main_body:
4878 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4879 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4880 ; CHECK-NEXT:    ret void
4882 main_body:
4883   %v = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.v8i32.v4i32(i32 15, float 0.0, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4884   store <4 x float> %v, ptr addrspace(1) %out
4885   ret void
4888 define amdgpu_kernel void @sample_b_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t) {
4889 ; CHECK-LABEL: @sample_b_2d(
4890 ; CHECK-NEXT:  main_body:
4891 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4892 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4893 ; CHECK-NEXT:    ret void
4895 main_body:
4896   %v = call <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f32.v8i32.v4i32(i32 15, float -0.0, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4897   store <4 x float> %v, ptr addrspace(1) %out
4898   ret void
4901 define amdgpu_kernel void @sample_c_b_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s) {
4902 ; CHECK-LABEL: @sample_c_b_1d(
4903 ; CHECK-NEXT:  main_body:
4904 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4905 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4906 ; CHECK-NEXT:    ret void
4908 main_body:
4909   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f32.v8i32.v4i32(i32 15, float -0.0, float %zcompare, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4910   store <4 x float> %v, ptr addrspace(1) %out
4911   ret void
4914 define amdgpu_kernel void @sample_c_b_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t) {
4915 ; CHECK-LABEL: @sample_c_b_2d(
4916 ; CHECK-NEXT:  main_body:
4917 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4918 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4919 ; CHECK-NEXT:    ret void
4921 main_body:
4922   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f32.v8i32.v4i32(i32 15, float 0.0, float %zcompare, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4923   store <4 x float> %v, ptr addrspace(1) %out
4924   ret void
4927 define amdgpu_kernel void @sample_b_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %s) {
4928 ; CHECK-LABEL: @sample_b_o_1d(
4929 ; CHECK-NEXT:  main_body:
4930 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4931 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4932 ; CHECK-NEXT:    ret void
4934 main_body:
4935   %v = call <4 x float> @llvm.amdgcn.image.sample.b.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float 0.0, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4936   store <4 x float> %v, ptr addrspace(1) %out
4937   ret void
4940 define amdgpu_kernel void @sample_b_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %s, float %t) {
4941 ; CHECK-LABEL: @sample_b_o_2d(
4942 ; CHECK-NEXT:  main_body:
4943 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4944 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4945 ; CHECK-NEXT:    ret void
4947 main_body:
4948   %v = call <4 x float> @llvm.amdgcn.image.sample.b.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float 0.0, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4949   store <4 x float> %v, ptr addrspace(1) %out
4950   ret void
4953 define amdgpu_kernel void @sample_c_b_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, float %s) {
4954 ; CHECK-LABEL: @sample_c_b_o_1d(
4955 ; CHECK-NEXT:  main_body:
4956 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4957 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4958 ; CHECK-NEXT:    ret void
4960 main_body:
4961   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float 0.0, float %zcompare, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4962   store <4 x float> %v, ptr addrspace(1) %out
4963   ret void
4966 define amdgpu_kernel void @sample_c_b_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, float %s, float %t) {
4967 ; CHECK-LABEL: @sample_c_b_o_2d(
4968 ; CHECK-NEXT:  main_body:
4969 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4970 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4971 ; CHECK-NEXT:    ret void
4973 main_body:
4974   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 %offset, float 0.0, float %zcompare, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4975   store <4 x float> %v, ptr addrspace(1) %out
4976   ret void
4979 define amdgpu_kernel void @gather4_b_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t) {
4980 ; CHECK-LABEL: @gather4_b_2d(
4981 ; CHECK-NEXT:  main_body:
4982 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4983 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4984 ; CHECK-NEXT:    ret void
4986 main_body:
4987   %v = call <4 x float> @llvm.amdgcn.image.gather4.b.2d.v4f32.f32.v8i32(i32 15, float 0.0, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
4988   store <4 x float> %v, ptr addrspace(1) %out
4989   ret void
4992 define amdgpu_kernel void @gather4_c_b_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t) {
4993 ; CHECK-LABEL: @gather4_c_b_2d(
4994 ; CHECK-NEXT:  main_body:
4995 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.c.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
4996 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
4997 ; CHECK-NEXT:    ret void
4999 main_body:
5000   %v = call <4 x float> @llvm.amdgcn.image.gather4.c.b.2d.v4f32.f32.v8i32(i32 15,  float 0.0, float %zcompare,float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5001   store <4 x float> %v, ptr addrspace(1) %out
5002   ret void
5005 define amdgpu_kernel void @gather4_b_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %s, float %t) {
5006 ; CHECK-LABEL: @gather4_b_o_2d(
5007 ; CHECK-NEXT:  main_body:
5008 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5009 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5010 ; CHECK-NEXT:    ret void
5012 main_body:
5013   %v = call <4 x float> @llvm.amdgcn.image.gather4.b.o.2d.v4f32.f32.v8i32(i32 15, i32 %offset, float 0.0, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5014   store <4 x float> %v, ptr addrspace(1) %out
5015   ret void
5018 define amdgpu_kernel void @gather4_c_b_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, float %s, float %t) {
5019 ; CHECK-LABEL: @gather4_c_b_o_2d(
5020 ; CHECK-NEXT:  main_body:
5021 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.c.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5022 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5023 ; CHECK-NEXT:    ret void
5025 main_body:
5026   %v = call <4 x float> @llvm.amdgcn.image.gather4.c.b.o.2d.v4f32.f32.v8i32(i32 15, i32 %offset,  float 0.0, float %zcompare,float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5027   store <4 x float> %v, ptr addrspace(1) %out
5028   ret void
5031 define amdgpu_kernel void @sample_c_b_o_a16_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, i32 %offset, float %zcompare, half %s, half %t) {
5032 ; CHECK-LABEL: @sample_c_b_o_a16_2d(
5033 ; CHECK-NEXT:  main_body:
5034 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.o.2d.v4f32.f16.v8i32.v4i32(i32 15, i32 [[OFFSET:%.*]], float [[ZCOMPARE:%.*]], half [[S:%.*]], half [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5035 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5036 ; CHECK-NEXT:    ret void
5038 main_body:
5039   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.o.2d.v4f32.f16.v8i32.v4i32(i32 15, i32 %offset, half 0.0, float %zcompare, half %s, half %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5040   store <4 x float> %v, ptr addrspace(1) %out
5041   ret void
5044 ; Check that bias is not optimized away if > 0
5045 define amdgpu_kernel void @sample_b_1d_pos(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s) {
5046 ; CHECK-LABEL: @sample_b_1d_pos(
5047 ; CHECK-NEXT:  main_body:
5048 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float 1.000000e+00, float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5049 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5050 ; CHECK-NEXT:    ret void
5052 main_body:
5053   %v = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.v8i32.v4i32(i32 15, float 1.0, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5054   store <4 x float> %v, ptr addrspace(1) %out
5055   ret void
5058 ; Check that bias is not optimized away if < 0
5059 define amdgpu_kernel void @sample_b_1d_neg(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s) {
5060 ; CHECK-LABEL: @sample_b_1d_neg(
5061 ; CHECK-NEXT:  main_body:
5062 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float -1.000000e+00, float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5063 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5064 ; CHECK-NEXT:    ret void
5066 main_body:
5067   %v = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.v8i32.v4i32(i32 15, float -1.0, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5068   store <4 x float> %v, ptr addrspace(1) %out
5069   ret void
5072 ; Zero bias + A16
5073 define amdgpu_kernel void @sample_b_1d_a16(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s) {
5074 ; CHECK-LABEL: @sample_b_1d_a16(
5075 ; CHECK-NEXT:  main_body:
5076 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f16.v8i32.v4i32(i32 15, half [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5077 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5078 ; CHECK-NEXT:    ret void
5080 main_body:
5081   %s32 = fpext half %s to float
5082   %v = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.v8i32.v4i32(i32 15, float -0.0, float %s32, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5083   store <4 x float> %v, ptr addrspace(1) %out
5084   ret void
5087 ; --------------------------------------------------------------------
5088 ; llvm.amdgcn.image.sample offset zero
5089 ; --------------------------------------------------------------------
5091 define amdgpu_kernel void @offset_sample_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s) {
5092 ; CHECK-LABEL: @offset_sample_o_1d(
5093 ; CHECK-NEXT:  main_body:
5094 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5095 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5096 ; CHECK-NEXT:    ret void
5098 main_body:
5099   %v = call <4 x float> @llvm.amdgcn.image.sample.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5100   store <4 x float> %v, ptr addrspace(1) %out
5101   ret void
5104 define amdgpu_kernel void @offset_sample_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t) {
5105 ; CHECK-LABEL: @offset_sample_o_2d(
5106 ; CHECK-NEXT:  main_body:
5107 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5108 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5109 ; CHECK-NEXT:    ret void
5111 main_body:
5112   %v = call <4 x float> @llvm.amdgcn.image.sample.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5113   store <4 x float> %v, ptr addrspace(1) %out
5114   ret void
5117 define amdgpu_kernel void @offset_sample_c_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s) {
5118 ; CHECK-LABEL: @offset_sample_c_o_1d(
5119 ; CHECK-NEXT:  main_body:
5120 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5121 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5122 ; CHECK-NEXT:    ret void
5124 main_body:
5125   %v = call <4 x float> @llvm.amdgcn.image.sample.c.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5126   store <4 x float> %v, ptr addrspace(1) %out
5127   ret void
5130 define amdgpu_kernel void @offset_sample_c_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t) {
5131 ; CHECK-LABEL: @offset_sample_c_o_2d(
5132 ; CHECK-NEXT:  main_body:
5133 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5134 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5135 ; CHECK-NEXT:    ret void
5137 main_body:
5138   %v = call <4 x float> @llvm.amdgcn.image.sample.c.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5139   store <4 x float> %v, ptr addrspace(1) %out
5140   ret void
5143 define amdgpu_kernel void @offset_sample_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %clamp) {
5144 ; CHECK-LABEL: @offset_sample_cl_o_1d(
5145 ; CHECK-NEXT:  main_body:
5146 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cl.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5147 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5148 ; CHECK-NEXT:    ret void
5150 main_body:
5151   %v = call <4 x float> @llvm.amdgcn.image.sample.cl.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5152   store <4 x float> %v, ptr addrspace(1) %out
5153   ret void
5156 define amdgpu_kernel void @offset_sample_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t, float %clamp) {
5157 ; CHECK-LABEL: @offset_sample_cl_o_2d(
5158 ; CHECK-NEXT:  main_body:
5159 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cl.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5160 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5161 ; CHECK-NEXT:    ret void
5163 main_body:
5164   %v = call <4 x float> @llvm.amdgcn.image.sample.cl.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5165   store <4 x float> %v, ptr addrspace(1) %out
5166   ret void
5169 define amdgpu_kernel void @offset_sample_c_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %clamp) {
5170 ; CHECK-LABEL: @offset_sample_c_cl_o_1d(
5171 ; CHECK-NEXT:  main_body:
5172 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cl.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5173 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5174 ; CHECK-NEXT:    ret void
5176 main_body:
5177   %v = call <4 x float> @llvm.amdgcn.image.sample.c.cl.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5178   store <4 x float> %v, ptr addrspace(1) %out
5179   ret void
5182 define amdgpu_kernel void @offset_sample_c_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t, float %clamp) {
5183 ; CHECK-LABEL: @offset_sample_c_cl_o_2d(
5184 ; CHECK-NEXT:  main_body:
5185 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cl.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5186 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5187 ; CHECK-NEXT:    ret void
5189 main_body:
5190   %v = call <4 x float> @llvm.amdgcn.image.sample.c.cl.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5191   store <4 x float> %v, ptr addrspace(1) %out
5192   ret void
5195 define amdgpu_kernel void @offset_sample_b_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %s) {
5196 ; CHECK-LABEL: @offset_sample_b_o_1d(
5197 ; CHECK-NEXT:  main_body:
5198 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5199 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5200 ; CHECK-NEXT:    ret void
5202 main_body:
5203   %v = call <4 x float> @llvm.amdgcn.image.sample.b.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5204   store <4 x float> %v, ptr addrspace(1) %out
5205   ret void
5208 define amdgpu_kernel void @offset_sample_b_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %s, float %t) {
5209 ; CHECK-LABEL: @offset_sample_b_o_2d(
5210 ; CHECK-NEXT:  main_body:
5211 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5212 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5213 ; CHECK-NEXT:    ret void
5215 main_body:
5216   %v = call <4 x float> @llvm.amdgcn.image.sample.b.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5217   store <4 x float> %v, ptr addrspace(1) %out
5218   ret void
5221 define amdgpu_kernel void @offset_sample_c_b_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, float %s) {
5222 ; CHECK-LABEL: @offset_sample_c_b_o_1d(
5223 ; CHECK-NEXT:  main_body:
5224 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5225 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5226 ; CHECK-NEXT:    ret void
5228 main_body:
5229   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %zcompare, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5230   store <4 x float> %v, ptr addrspace(1) %out
5231   ret void
5234 define amdgpu_kernel void @offset_sample_c_b_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, float %s, float %t) {
5235 ; CHECK-LABEL: @offset_sample_c_b_o_2d(
5236 ; CHECK-NEXT:  main_body:
5237 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5238 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5239 ; CHECK-NEXT:    ret void
5241 main_body:
5242   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %zcompare, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5243   store <4 x float> %v, ptr addrspace(1) %out
5244   ret void
5247 define amdgpu_kernel void @offset_sample_b_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %s, float %clamp) {
5248 ; CHECK-LABEL: @offset_sample_b_cl_o_1d(
5249 ; CHECK-NEXT:  main_body:
5250 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5251 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5252 ; CHECK-NEXT:    ret void
5254 main_body:
5255   %v = call <4 x float> @llvm.amdgcn.image.sample.b.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5256   store <4 x float> %v, ptr addrspace(1) %out
5257   ret void
5260 define amdgpu_kernel void @offset_sample_b_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %s, float %t, float %clamp) {
5261 ; CHECK-LABEL: @offset_sample_b_cl_o_2d(
5262 ; CHECK-NEXT:  main_body:
5263 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5264 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5265 ; CHECK-NEXT:    ret void
5267 main_body:
5268   %v = call <4 x float> @llvm.amdgcn.image.sample.b.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5269   store <4 x float> %v, ptr addrspace(1) %out
5270   ret void
5273 define amdgpu_kernel void @offset_sample_c_b_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, float %s, float %clamp) {
5274 ; CHECK-LABEL: @offset_sample_c_b_cl_o_1d(
5275 ; CHECK-NEXT:  main_body:
5276 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5277 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5278 ; CHECK-NEXT:    ret void
5280 main_body:
5281   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %zcompare, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5282   store <4 x float> %v, ptr addrspace(1) %out
5283   ret void
5286 define amdgpu_kernel void @offset_sample_c_b_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %bias, float %zcompare, float %s, float %t, float %clamp) {
5287 ; CHECK-LABEL: @offset_sample_c_b_cl_o_2d(
5288 ; CHECK-NEXT:  main_body:
5289 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[BIAS:%.*]], float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5290 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5291 ; CHECK-NEXT:    ret void
5293 main_body:
5294   %v = call <4 x float> @llvm.amdgcn.image.sample.c.b.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %bias, float %zcompare, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5295   store <4 x float> %v, ptr addrspace(1) %out
5296   ret void
5299 define amdgpu_kernel void @offset_sample_d_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dsdv, float %s) {
5300 ; CHECK-LABEL: @offset_sample_d_o_1d(
5301 ; CHECK-NEXT:  main_body:
5302 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5303 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5304 ; CHECK-NEXT:    ret void
5306 main_body:
5307   %v = call <4 x float> @llvm.amdgcn.image.sample.d.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dsdv, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5308   store <4 x float> %v, ptr addrspace(1) %out
5309   ret void
5312 define amdgpu_kernel void @offset_sample_d_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t) {
5313 ; CHECK-LABEL: @offset_sample_d_o_2d(
5314 ; CHECK-NEXT:  main_body:
5315 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5316 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5317 ; CHECK-NEXT:    ret void
5319 main_body:
5320   %v = call <4 x float> @llvm.amdgcn.image.sample.d.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5321   store <4 x float> %v, ptr addrspace(1) %out
5322   ret void
5325 define amdgpu_kernel void @offset_sample_c_d_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dsdv, float %s) {
5326 ; CHECK-LABEL: @offset_sample_c_d_o_1d(
5327 ; CHECK-NEXT:  main_body:
5328 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5329 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5330 ; CHECK-NEXT:    ret void
5332 main_body:
5333   %v = call <4 x float> @llvm.amdgcn.image.sample.c.d.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dsdv, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5334   store <4 x float> %v, ptr addrspace(1) %out
5335   ret void
5338 define amdgpu_kernel void @offset_sample_c_d_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t) {
5339 ; CHECK-LABEL: @offset_sample_c_d_o_2d(
5340 ; CHECK-NEXT:  main_body:
5341 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5342 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5343 ; CHECK-NEXT:    ret void
5345 main_body:
5346   %v = call <4 x float> @llvm.amdgcn.image.sample.c.d.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5347   store <4 x float> %v, ptr addrspace(1) %out
5348   ret void
5351 define amdgpu_kernel void @offset_sample_d_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dsdv, float %s, float %clamp) {
5352 ; CHECK-LABEL: @offset_sample_d_cl_o_1d(
5353 ; CHECK-NEXT:  main_body:
5354 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5355 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5356 ; CHECK-NEXT:    ret void
5358 main_body:
5359   %v = call <4 x float> @llvm.amdgcn.image.sample.d.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dsdv, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5360   store <4 x float> %v, ptr addrspace(1) %out
5361   ret void
5364 define amdgpu_kernel void @offset_sample_d_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp) {
5365 ; CHECK-LABEL: @offset_sample_d_cl_o_2d(
5366 ; CHECK-NEXT:  main_body:
5367 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5368 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5369 ; CHECK-NEXT:    ret void
5371 main_body:
5372   %v = call <4 x float> @llvm.amdgcn.image.sample.d.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5373   store <4 x float> %v, ptr addrspace(1) %out
5374   ret void
5377 define amdgpu_kernel void @offset_sample_c_d_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dsdv, float %s, float %clamp) {
5378 ; CHECK-LABEL: @offset_sample_c_d_cl_o_1d(
5379 ; CHECK-NEXT:  main_body:
5380 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5381 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5382 ; CHECK-NEXT:    ret void
5384 main_body:
5385   %v = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dsdv, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5386   store <4 x float> %v, ptr addrspace(1) %out
5387   ret void
5390 define amdgpu_kernel void @offset_sample_c_d_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp) {
5391 ; CHECK-LABEL: @offset_sample_c_d_cl_o_2d(
5392 ; CHECK-NEXT:  main_body:
5393 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5394 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5395 ; CHECK-NEXT:    ret void
5397 main_body:
5398   %v = call <4 x float> @llvm.amdgcn.image.sample.c.d.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5399   store <4 x float> %v, ptr addrspace(1) %out
5400   ret void
5403 define amdgpu_kernel void @offset_sample_cd_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dsdv, float %s) {
5404 ; CHECK-LABEL: @offset_sample_cd_o_1d(
5405 ; CHECK-NEXT:  main_body:
5406 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5407 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5408 ; CHECK-NEXT:    ret void
5410 main_body:
5411   %v = call <4 x float> @llvm.amdgcn.image.sample.cd.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dsdv, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5412   store <4 x float> %v, ptr addrspace(1) %out
5413   ret void
5416 define amdgpu_kernel void @offset_sample_cd_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t) {
5417 ; CHECK-LABEL: @offset_sample_cd_o_2d(
5418 ; CHECK-NEXT:  main_body:
5419 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5420 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5421 ; CHECK-NEXT:    ret void
5423 main_body:
5424   %v = call <4 x float> @llvm.amdgcn.image.sample.cd.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5425   store <4 x float> %v, ptr addrspace(1) %out
5426   ret void
5429 define amdgpu_kernel void @offset_sample_c_cd_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dsdv, float %s) {
5430 ; CHECK-LABEL: @offset_sample_c_cd_o_1d(
5431 ; CHECK-NEXT:  main_body:
5432 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5433 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5434 ; CHECK-NEXT:    ret void
5436 main_body:
5437   %v = call <4 x float> @llvm.amdgcn.image.sample.c.cd.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dsdv, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5438   store <4 x float> %v, ptr addrspace(1) %out
5439   ret void
5442 define amdgpu_kernel void @offset_sample_c_cd_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t) {
5443 ; CHECK-LABEL: @offset_sample_c_cd_o_2d(
5444 ; CHECK-NEXT:  main_body:
5445 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5446 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5447 ; CHECK-NEXT:    ret void
5449 main_body:
5450   %v = call <4 x float> @llvm.amdgcn.image.sample.c.cd.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5451   store <4 x float> %v, ptr addrspace(1) %out
5452   ret void
5455 define amdgpu_kernel void @offset_sample_cd_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dsdv, float %s, float %clamp) {
5456 ; CHECK-LABEL: @offset_sample_cd_cl_o_1d(
5457 ; CHECK-NEXT:  main_body:
5458 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5459 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5460 ; CHECK-NEXT:    ret void
5462 main_body:
5463   %v = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dsdv, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5464   store <4 x float> %v, ptr addrspace(1) %out
5465   ret void
5468 define amdgpu_kernel void @offset_sample_cd_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp) {
5469 ; CHECK-LABEL: @offset_sample_cd_cl_o_2d(
5470 ; CHECK-NEXT:  main_body:
5471 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5472 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5473 ; CHECK-NEXT:    ret void
5475 main_body:
5476   %v = call <4 x float> @llvm.amdgcn.image.sample.cd.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5477   store <4 x float> %v, ptr addrspace(1) %out
5478   ret void
5481 define amdgpu_kernel void @offset_sample_c_cd_cl_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dsdv, float %s, float %clamp) {
5482 ; CHECK-LABEL: @offset_sample_c_cd_cl_o_1d(
5483 ; CHECK-NEXT:  main_body:
5484 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DSDV:%.*]], float [[S:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5485 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5486 ; CHECK-NEXT:    ret void
5488 main_body:
5489   %v = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dsdv, float %s, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5490   store <4 x float> %v, ptr addrspace(1) %out
5491   ret void
5494 define amdgpu_kernel void @offset_sample_c_cd_cl_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp) {
5495 ; CHECK-LABEL: @offset_sample_c_cd_cl_o_2d(
5496 ; CHECK-NEXT:  main_body:
5497 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[DSDH:%.*]], float [[DTDH:%.*]], float [[DSDV:%.*]], float [[DTDV:%.*]], float [[S:%.*]], float [[T:%.*]], float [[CLAMP:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5498 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5499 ; CHECK-NEXT:    ret void
5501 main_body:
5502   %v = call <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %dsdh, float %dtdh, float %dsdv, float %dtdv, float %s, float %t, float %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5503   store <4 x float> %v, ptr addrspace(1) %out
5504   ret void
5507 define amdgpu_kernel void @offset_sample_l_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %lod) {
5508 ; CHECK-LABEL: @offset_sample_l_o_1d(
5509 ; CHECK-NEXT:  main_body:
5510 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5511 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5512 ; CHECK-NEXT:    ret void
5514 main_body:
5515   %v = call <4 x float> @llvm.amdgcn.image.sample.l.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, float %lod, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5516   store <4 x float> %v, ptr addrspace(1) %out
5517   ret void
5520 define amdgpu_kernel void @offset_sample_l_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t, float %lod) {
5521 ; CHECK-LABEL: @offset_sample_l_o_2d(
5522 ; CHECK-NEXT:  main_body:
5523 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], float [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5524 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5525 ; CHECK-NEXT:    ret void
5527 main_body:
5528   %v = call <4 x float> @llvm.amdgcn.image.sample.l.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, float %t, float %lod, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5529   store <4 x float> %v, ptr addrspace(1) %out
5530   ret void
5533 define amdgpu_kernel void @offset_sample_c_l_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %lod) {
5534 ; CHECK-LABEL: @offset_sample_c_l_o_1d(
5535 ; CHECK-NEXT:  main_body:
5536 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.l.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5537 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5538 ; CHECK-NEXT:    ret void
5540 main_body:
5541   %v = call <4 x float> @llvm.amdgcn.image.sample.c.l.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, float %lod, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5542   store <4 x float> %v, ptr addrspace(1) %out
5543   ret void
5546 define amdgpu_kernel void @offset_sample_c_l_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t, float %lod) {
5547 ; CHECK-LABEL: @offset_sample_c_l_o_2d(
5548 ; CHECK-NEXT:  main_body:
5549 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.l.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], float [[LOD:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5550 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5551 ; CHECK-NEXT:    ret void
5553 main_body:
5554   %v = call <4 x float> @llvm.amdgcn.image.sample.c.l.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, float %t, float %lod, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5555   store <4 x float> %v, ptr addrspace(1) %out
5556   ret void
5559 define amdgpu_kernel void @offset_sample_lz_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s) {
5560 ; CHECK-LABEL: @offset_sample_lz_o_1d(
5561 ; CHECK-NEXT:  main_body:
5562 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5563 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5564 ; CHECK-NEXT:    ret void
5566 main_body:
5567   %v = call <4 x float> @llvm.amdgcn.image.sample.lz.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5568   store <4 x float> %v, ptr addrspace(1) %out
5569   ret void
5572 define amdgpu_kernel void @offset_sample_lz_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %s, float %t) {
5573 ; CHECK-LABEL: @offset_sample_lz_o_2d(
5574 ; CHECK-NEXT:  main_body:
5575 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5576 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5577 ; CHECK-NEXT:    ret void
5579 main_body:
5580   %v = call <4 x float> @llvm.amdgcn.image.sample.lz.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5581   store <4 x float> %v, ptr addrspace(1) %out
5582   ret void
5585 define amdgpu_kernel void @offset_sample_c_lz_o_1d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s) {
5586 ; CHECK-LABEL: @offset_sample_c_lz_o_1d(
5587 ; CHECK-NEXT:  main_body:
5588 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.1d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5589 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5590 ; CHECK-NEXT:    ret void
5592 main_body:
5593   %v = call <4 x float> @llvm.amdgcn.image.sample.c.lz.o.1d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5594   store <4 x float> %v, ptr addrspace(1) %out
5595   ret void
5598 define amdgpu_kernel void @offset_sample_c_lz_o_2d(ptr addrspace(1) %out, <8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, float %s, float %t) {
5599 ; CHECK-LABEL: @offset_sample_c_lz_o_2d(
5600 ; CHECK-NEXT:  main_body:
5601 ; CHECK-NEXT:    [[V:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.c.lz.2d.v4f32.f32.v8i32.v4i32(i32 15, float [[ZCOMPARE:%.*]], float [[S:%.*]], float [[T:%.*]], <8 x i32> [[RSRC:%.*]], <4 x i32> [[SAMP:%.*]], i1 false, i32 0, i32 0)
5602 ; CHECK-NEXT:    store <4 x float> [[V]], ptr addrspace(1) [[OUT:%.*]], align 16
5603 ; CHECK-NEXT:    ret void
5605 main_body:
5606   %v = call <4 x float> @llvm.amdgcn.image.sample.c.lz.o.2d.v4f32.f32.v8i32.v4i32(i32 15, i32 0, float %zcompare, float %s, float %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)
5607   store <4 x float> %v, ptr addrspace(1) %out
5608   ret void
5611 declare <4 x float> @llvm.amdgcn.image.sample.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5612 declare <4 x float> @llvm.amdgcn.image.sample.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5613 declare <4 x float> @llvm.amdgcn.image.sample.c.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5614 declare <4 x float> @llvm.amdgcn.image.sample.c.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5615 declare <4 x float> @llvm.amdgcn.image.sample.cl.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5616 declare <4 x float> @llvm.amdgcn.image.sample.cl.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5617 declare <4 x float> @llvm.amdgcn.image.sample.c.cl.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5618 declare <4 x float> @llvm.amdgcn.image.sample.c.cl.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5620 declare <4 x float> @llvm.amdgcn.image.sample.b.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5621 declare <4 x float> @llvm.amdgcn.image.sample.b.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5622 declare <4 x float> @llvm.amdgcn.image.sample.c.b.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5623 declare <4 x float> @llvm.amdgcn.image.sample.c.b.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5624 declare <4 x float> @llvm.amdgcn.image.sample.b.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5625 declare <4 x float> @llvm.amdgcn.image.sample.b.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5626 declare <4 x float> @llvm.amdgcn.image.sample.c.b.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5627 declare <4 x float> @llvm.amdgcn.image.sample.c.b.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5629 declare <4 x float> @llvm.amdgcn.image.sample.d.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5630 declare <4 x float> @llvm.amdgcn.image.sample.d.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5631 declare <4 x float> @llvm.amdgcn.image.sample.c.d.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5632 declare <4 x float> @llvm.amdgcn.image.sample.c.d.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5633 declare <4 x float> @llvm.amdgcn.image.sample.d.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5634 declare <4 x float> @llvm.amdgcn.image.sample.d.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5635 declare <4 x float> @llvm.amdgcn.image.sample.c.d.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5636 declare <4 x float> @llvm.amdgcn.image.sample.c.d.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5638 declare <4 x float> @llvm.amdgcn.image.sample.cd.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5639 declare <4 x float> @llvm.amdgcn.image.sample.cd.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5640 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5641 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5642 declare <4 x float> @llvm.amdgcn.image.sample.cd.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5643 declare <4 x float> @llvm.amdgcn.image.sample.cd.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5644 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.o.1d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5645 declare <4 x float> @llvm.amdgcn.image.sample.c.cd.cl.o.2d.v4f32.f32.f32.v8i32.v4i32(i32, i32, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5647 declare <4 x float> @llvm.amdgcn.image.sample.lz.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5648 declare <4 x float> @llvm.amdgcn.image.sample.lz.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5649 declare <4 x float> @llvm.amdgcn.image.sample.c.lz.o.1d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5650 declare <4 x float> @llvm.amdgcn.image.sample.c.lz.o.2d.v4f32.f32.v8i32.v4i32(i32, i32, float, float, float, <8 x i32>, <4 x i32>, i1, i32, i32) #1
5652 ; --------------------------------------------------------------------
5653 ; llvm.amdgcn.is.shared
5654 ; --------------------------------------------------------------------
5656 declare i1 @llvm.amdgcn.is.shared(ptr) nounwind readnone
5658 define i1 @test_is_shared_null() nounwind {
5659 ; CHECK-LABEL: @test_is_shared_null(
5660 ; CHECK-NEXT:    ret i1 false
5662   %val = call i1 @llvm.amdgcn.is.shared(ptr null)
5663   ret i1 %val
5666 define i1 @test_is_shared_undef() nounwind {
5667 ; CHECK-LABEL: @test_is_shared_undef(
5668 ; CHECK-NEXT:    ret i1 undef
5670   %val = call i1 @llvm.amdgcn.is.shared(ptr undef)
5671   ret i1 %val
5674 ; --------------------------------------------------------------------
5675 ; llvm.amdgcn.is.private
5676 ; --------------------------------------------------------------------
5678 declare i1 @llvm.amdgcn.is.private(ptr) nounwind readnone
5680 define i1 @test_is_private_null() nounwind {
5681 ; CHECK-LABEL: @test_is_private_null(
5682 ; CHECK-NEXT:    ret i1 false
5684   %val = call i1 @llvm.amdgcn.is.private(ptr null)
5685   ret i1 %val
5688 define i1 @test_is_private_undef() nounwind {
5689 ; CHECK-LABEL: @test_is_private_undef(
5690 ; CHECK-NEXT:    ret i1 undef
5692   %val = call i1 @llvm.amdgcn.is.private(ptr undef)
5693   ret i1 %val
5696 ; --------------------------------------------------------------------
5697 ; llvm.amdgcn.trig.preop
5698 ; --------------------------------------------------------------------
5700 declare double @llvm.amdgcn.trig.preop.f64(double, i32)
5701 declare float @llvm.amdgcn.trig.preop.f32(float, i32)
5703 define double @trig_preop_constfold_variable_undef_arg(i32 %arg) {
5704 ; CHECK-LABEL: @trig_preop_constfold_variable_undef_arg(
5705 ; CHECK-NEXT:    ret double 0x7FF8000000000000
5707   %val = call double @llvm.amdgcn.trig.preop.f64(double undef, i32 %arg)
5708   ret double %val
5711 define double @trig_preop_constfold_variable_poison_arg(i32 %arg) {
5712 ; CHECK-LABEL: @trig_preop_constfold_variable_poison_arg(
5713 ; CHECK-NEXT:    ret double poison
5715   %val = call double @llvm.amdgcn.trig.preop.f64(double poison, i32 %arg)
5716   ret double %val
5719 define double @trig_preop_constfold_variable_arg_undef(double %arg) {
5720 ; CHECK-LABEL: @trig_preop_constfold_variable_arg_undef(
5721 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.trig.preop.f64(double [[ARG:%.*]], i32 undef)
5722 ; CHECK-NEXT:    ret double [[VAL]]
5724   %val = call double @llvm.amdgcn.trig.preop.f64(double %arg, i32 undef)
5725   ret double %val
5728 define double @trig_preop_constfold_variable_arg_poison(double %arg) {
5729 ; CHECK-LABEL: @trig_preop_constfold_variable_arg_poison(
5730 ; CHECK-NEXT:    ret double poison
5732   %val = call double @llvm.amdgcn.trig.preop.f64(double %arg, i32 poison)
5733   ret double %val
5736 define double @trig_preop_constfold_variable_int(i32 %arg) {
5737 ; CHECK-LABEL: @trig_preop_constfold_variable_int(
5738 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 [[ARG:%.*]])
5739 ; CHECK-NEXT:    ret double [[VAL]]
5741   %val = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 %arg)
5742   ret double %val
5745 define double @trig_preop_qnan(i32 %arg) {
5746 ; CHECK-LABEL: @trig_preop_qnan(
5747 ; CHECK-NEXT:    ret double 0x7FF8000000000000
5749   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7FF8000000000000, i32 %arg)
5750   ret double %val
5753 define double @trig_preop_snan(i32 %arg) {
5754 ; CHECK-LABEL: @trig_preop_snan(
5755 ; CHECK-NEXT:    ret double 0x7FF8000000000001
5757   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7FF0000000000001, i32 %arg)
5758   ret double %val
5761 define double @trig_preop_inf_0() {
5762 ; CHECK-LABEL: @trig_preop_inf_0(
5763 ; CHECK-NEXT:    ret double 0xB43DD63F5F2F8BD
5765   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7FF0000000000000, i32 0)
5766   ret double %val
5769 define double @trig_preop_ninf_0() {
5770 ; CHECK-LABEL: @trig_preop_ninf_0(
5771 ; CHECK-NEXT:    ret double 0xB43DD63F5F2F8BD
5773   %val = call double @llvm.amdgcn.trig.preop.f64(double 0xFFF0000000000000, i32 0)
5774   ret double %val
5777 define double @trig_preop_variable_fp(double %arg) {
5778 ; CHECK-LABEL: @trig_preop_variable_fp(
5779 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.trig.preop.f64(double [[ARG:%.*]], i32 5)
5780 ; CHECK-NEXT:    ret double [[VAL]]
5782   %val = call double @llvm.amdgcn.trig.preop.f64(double %arg, i32 5)
5783   ret double %val
5786 define double @trig_preop_variable_args(double %arg0, i32 %arg1) {
5787 ; CHECK-LABEL: @trig_preop_variable_args(
5788 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.trig.preop.f64(double [[ARG0:%.*]], i32 [[ARG1:%.*]])
5789 ; CHECK-NEXT:    ret double [[VAL]]
5791   %val = call double @llvm.amdgcn.trig.preop.f64(double %arg0, i32 %arg1)
5792   ret double %val
5795 define double @trig_preop_constfold() {
5796 ; CHECK-LABEL: @trig_preop_constfold(
5797 ; CHECK-NEXT:    ret double 0x394A6EE06DB14ACC
5799   %val = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 2)
5800   ret double %val
5803 ; src1[4:0] <= 21 for segment to be inbound with this exponent of src0.
5804 define double @trig_preop_constfold_outbound_segment() {
5805 ; CHECK-LABEL: @trig_preop_constfold_outbound_segment(
5806 ; CHECK-NEXT:    ret double 0.000000e+00
5808   %val = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 22)
5809   ret double %val
5812 ; Only use src1[4:0], so segment is actually 31 for -1.
5813 define double @trig_preop_constfold_neg1_segment() {
5814 ; CHECK-LABEL: @trig_preop_constfold_neg1_segment(
5815 ; CHECK-NEXT:    ret double 0.000000e+00
5817   %val = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 -1)
5818   ret double %val
5821 ; Only use src1[4:0], so segment is actually 0 for -32.
5822 define double @trig_preop_constfold_neg32_segment() {
5823 ; CHECK-LABEL: @trig_preop_constfold_neg32_segment(
5824 ; CHECK-NEXT:    ret double 0x3FE45F306DC9C882
5826   %val = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 -32)
5827   ret double %val
5830 define double @trig_preop_constfold_strictfp() strictfp {
5831 ; CHECK-LABEL: @trig_preop_constfold_strictfp(
5832 ; CHECK-NEXT:    [[VAL:%.*]] = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 5) #[[ATTR16]]
5833 ; CHECK-NEXT:    ret double [[VAL]]
5835   %val = call double @llvm.amdgcn.trig.preop.f64(double 3.454350e+02, i32 5) strictfp
5836   ret double %val
5839 define double @trig_preop_constfold_exponent0_mantissa0__segment0() {
5840 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissa0__segment0(
5841 ; CHECK-NEXT:    ret double 0x3FE45F306DC9C882
5843   %val = call double @llvm.amdgcn.trig.preop.f64(double 0.0, i32 0)
5844   ret double %val
5847 define double @trig_preop_constfold_exponent0_mantissa1__segment0() {
5848 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissa1__segment0(
5849 ; CHECK-NEXT:    ret double 0x3FE45F306DC9C882
5851   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x000FFFFFFFFFFFFF, i32 0)
5852   ret double %val
5855 define double @trig_preop_constfold_exponent0_mantissaX__segment0() {
5856 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissaX__segment0(
5857 ; CHECK-NEXT:    ret double 0x3FE45F306DC9C882
5859   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x0004A7F09D5F47D4, i32 0)
5860   ret double %val
5863 define double @trig_preop_constfold_exponent0_mantissa0__segment2() {
5864 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissa0__segment2(
5865 ; CHECK-NEXT:    ret double 0x394A6EE06DB14ACC
5867   %val = call double @llvm.amdgcn.trig.preop.f64(double 0.0, i32 2)
5868   ret double %val
5871 define double @trig_preop_constfold_exponent0_mantissa1__segment2() {
5872 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissa1__segment2(
5873 ; CHECK-NEXT:    ret double 0x394A6EE06DB14ACC
5875   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x000FFFFFFFFFFFFF, i32 2)
5876   ret double %val
5879 define double @trig_preop_constfold_exponent0_mantissaX__segment2() {
5880 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissaX__segment2(
5881 ; CHECK-NEXT:    ret double 0x394A6EE06DB14ACC
5883   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x00094A6EE06DB14A, i32 2)
5884   ret double %val
5887 ; src1[4:0] <= 21 for segment to be inbound with this exponent of src0.
5888 define double @trig_preop_constfold_exponent0_mantissa0__outbound_segment() {
5889 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissa0__outbound_segment(
5890 ; CHECK-NEXT:    ret double 0.000000e+00
5892   %val = call double @llvm.amdgcn.trig.preop.f64(double 0.0, i32 22)
5893   ret double %val
5896 ; src1[4:0] <= 21 for segment to be inbound with this exponent of src0.
5897 define double @trig_preop_constfold_exponent0_mantissa1__outbound_segment() {
5898 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissa1__outbound_segment(
5899 ; CHECK-NEXT:    ret double 0.000000e+00
5901   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x000FFFFFFFFFFFFF, i32 22)
5902   ret double %val
5905 ; src1[4:0] <= 21 for segment to be inbound with this exponent of src0.
5906 define double @trig_preop_constfold_exponent0_mantissaX__outbound_segment() {
5907 ; CHECK-LABEL: @trig_preop_constfold_exponent0_mantissaX__outbound_segment(
5908 ; CHECK-NEXT:    ret double 0.000000e+00
5910   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x000A6EE06DB14ACC, i32 22)
5911   ret double %val
5914 ; 1607 = 1077 + 10 * 53
5915 define double @trig_preop_constfold_exponent1607_mantissa0__segment0() {
5916 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissa0__segment0(
5917 ; CHECK-NEXT:    ret double 0x1EC8135A2FBF209C
5919   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x6470000000000000, i32 0)
5920   ret double %val
5923 ; 1607 = 1077 + 10 * 53
5924 define double @trig_preop_constfold_exponent1607_mantissa1__segment1() {
5925 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissa1__segment1(
5926 ; CHECK-NEXT:    ret double 0x1EC8135A2FBF209C
5928   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x647FFFFFFFFFFFFF, i32 0)
5929   ret double %val
5932 ; 1607 = 1077 + 10 * 53
5933 define double @trig_preop_constfold_exponent1607_mantissaX__segment1() {
5934 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissaX__segment1(
5935 ; CHECK-NEXT:    ret double 0x1EC8135A2FBF209C
5937   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x6471B791D6398353, i32 0)
5938   ret double %val
5941 ; 1607 = 1077 + 10 * 53
5942 define double @trig_preop_constfold_exponent1607_mantissa0__segment2() {
5943 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissa0__segment2(
5944 ; CHECK-NEXT:    ret double 0x181272117E2EF7E4
5946   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x6470000000000000, i32 2)
5947   ret double %val
5950 ; 1607 = 1077 + 10 * 53
5951 define double @trig_preop_constfold_exponent1607_mantissa1__segment2() {
5952 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissa1__segment2(
5953 ; CHECK-NEXT:    ret double 0x181272117E2EF7E4
5955   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x647FFFFFFFFFFFFF, i32 2)
5956   ret double %val
5959 ; 1607 = 1077 + 10 * 53
5960 define double @trig_preop_constfold_exponent1607_mantissaX__segment2() {
5961 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissaX__segment2(
5962 ; CHECK-NEXT:    ret double 0x181272117E2EF7E4
5964   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x647272117E2EF7E4, i32 2)
5965   ret double %val
5968 ; src1[4:0] <= 11 for segment to be inbound with this exponent of src0.
5969 define double @trig_preop_constfold_exponent1607_mantissa0__outbound_segment() {
5970 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissa0__outbound_segment(
5971 ; CHECK-NEXT:    ret double 0.000000e+00
5973   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x6470000000000000, i32 12)
5974   ret double %val
5977 ; src1[4:0] <= 11 for segment to be inbound with this exponent of src0.
5978 define double @trig_preop_constfold_exponent1607_mantissa1__outbound_segment() {
5979 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissa1__outbound_segment(
5980 ; CHECK-NEXT:    ret double 0.000000e+00
5982   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x647FFFFFFFFFFFFF, i32 12)
5983   ret double %val
5986 ; src1[4:0] <= 11 for segment to be inbound with this exponent of src0.
5987 define double @trig_preop_constfold_exponent1607_mantissaX__outbound_segment() {
5988 ; CHECK-LABEL: @trig_preop_constfold_exponent1607_mantissaX__outbound_segment(
5989 ; CHECK-NEXT:    ret double 0.000000e+00
5991   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x647181272117E2EF, i32 12)
5992   ret double %val
5995 define double @trig_preop_constfold_exponent1968_mantissa0__segment0() {
5996 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissa0__segment0(
5997 ; CHECK-NEXT:    ret double 0x10374F463F669E5F
5999   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B00000000000000, i32 0)
6000   ret double %val
6003 define double @trig_preop_constfold_exponent1968_mantissa1__segment0() {
6004 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissa1__segment0(
6005 ; CHECK-NEXT:    ret double 0x10374F463F669E5F
6007   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B0FFFFFFFFFFFFF, i32 0)
6008   ret double %val
6011 define double @trig_preop_constfold_exponent1968_mantissax__segment0() {
6012 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissax__segment0(
6013 ; CHECK-NEXT:    ret double 0x10374F463F669E5F
6015   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B074F463F669E5F, i32 0)
6016   ret double %val
6019 define double @trig_preop_constfold_exponent1968_mantissa0__segment2() {
6020 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissa0__segment2(
6021 ; CHECK-NEXT:    ret double 0x98F2F8BD9E839CE
6023   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B00000000000000, i32 2)
6024   ret double %val
6027 define double @trig_preop_constfold_exponent1968_mantissa1__segment2() {
6028 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissa1__segment2(
6029 ; CHECK-NEXT:    ret double 0x98F2F8BD9E839CE
6031   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B0FFFFFFFFFFFFF, i32 2)
6032   ret double %val
6035 define double @trig_preop_constfold_exponent1968_mantissaX__segment2() {
6036 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissaX__segment2(
6037 ; CHECK-NEXT:    ret double 0x98F2F8BD9E839CE
6039   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B0A2F8BD9E839CE, i32 2)
6040   ret double %val
6043 ; src1[4:0] <= 4 for segment to be inbound with this exponent of src0.
6044 define double @trig_preop_constfold_exponent1968_mantissa0__outbound_segment() {
6045 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissa0__outbound_segment(
6046 ; CHECK-NEXT:    ret double 0.000000e+00
6048   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B00000000000000, i32 5)
6049   ret double %val
6052 ; src1[4:0] <= 4 for segment to be inbound with this exponent of src0.
6053 define double @trig_preop_constfold_exponent1968_mantissa1__outbound_segment() {
6054 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissa1__outbound_segment(
6055 ; CHECK-NEXT:    ret double 0.000000e+00
6057   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B0FFFFFFFFFFFFF, i32 5)
6058   ret double %val
6061 ; src1[4:0] <= 4 for segment to be inbound with this exponent of src0.
6062 define double @trig_preop_constfold_exponent1968_mantissaX__outbound_segment() {
6063 ; CHECK-LABEL: @trig_preop_constfold_exponent1968_mantissaX__outbound_segment(
6064 ; CHECK-NEXT:    ret double 0.000000e+00
6066   %val = call double @llvm.amdgcn.trig.preop.f64(double 0x7B0A98F2F8BD9E83, i32 5)
6067   ret double %val
6070 ; --------------------------------------------------------------------
6071 ; llvm.amdgcn.log
6072 ; --------------------------------------------------------------------
6074 declare float @llvm.amdgcn.log.f32(float) nounwind readnone
6075 declare half @llvm.amdgcn.log.f16(half) nounwind readnone
6077 define float @test_constant_fold_log_f32_undef() {
6078 ; CHECK-LABEL: @test_constant_fold_log_f32_undef(
6079 ; CHECK-NEXT:    ret float 0x7FF8000000000000
6081   %val = call float @llvm.amdgcn.log.f32(float undef)
6082   ret float %val
6085 define float @test_constant_fold_log_f32_poison() {
6086 ; CHECK-LABEL: @test_constant_fold_log_f32_poison(
6087 ; CHECK-NEXT:    ret float poison
6089   %val = call float @llvm.amdgcn.log.f32(float poison)
6090   ret float %val
6093 define float @test_constant_fold_log_f32_p0() {
6094 ; CHECK-LABEL: @test_constant_fold_log_f32_p0(
6095 ; CHECK-NEXT:    ret float 0xFFF0000000000000
6097   %val = call float @llvm.amdgcn.log.f32(float 0.0)
6098   ret float %val
6101 define float @test_constant_fold_log_f32_n0() {
6102 ; CHECK-LABEL: @test_constant_fold_log_f32_n0(
6103 ; CHECK-NEXT:    ret float 0xFFF0000000000000
6105   %val = call float @llvm.amdgcn.log.f32(float -0.0)
6106   ret float %val
6109 define float @test_constant_fold_log_f32_subnormal() {
6110 ; CHECK-LABEL: @test_constant_fold_log_f32_subnormal(
6111 ; CHECK-NEXT:    ret float 0xFFF0000000000000
6113   %val = call float @llvm.amdgcn.log.f32(float 0x380FFFFFC0000000)
6114   ret float %val
6117 define float @test_constant_fold_log_f32_negsubnormal() {
6118 ; CHECK-LABEL: @test_constant_fold_log_f32_negsubnormal(
6119 ; CHECK-NEXT:    ret float 0xFFF0000000000000
6121   %val = call float @llvm.amdgcn.log.f32(float 0xB80FFFFFC0000000)
6122   ret float %val
6125 define float @test_constant_fold_log_f32_pinf() {
6126 ; CHECK-LABEL: @test_constant_fold_log_f32_pinf(
6127 ; CHECK-NEXT:    ret float 0x7FF0000000000000
6129   %val = call float @llvm.amdgcn.log.f32(float 0x7FF0000000000000)
6130   ret float %val
6133 define float @test_constant_fold_log_f32_ninf() {
6134 ; CHECK-LABEL: @test_constant_fold_log_f32_ninf(
6135 ; CHECK-NEXT:    ret float 0x7FF8000000000000
6137   %val = call float @llvm.amdgcn.log.f32(float 0xFFF0000000000000)
6138   ret float %val
6141 define float @test_constant_fold_log_f32_p1() {
6142 ; CHECK-LABEL: @test_constant_fold_log_f32_p1(
6143 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.log.f32(float 1.000000e+00)
6144 ; CHECK-NEXT:    ret float [[VAL]]
6146   %val = call float @llvm.amdgcn.log.f32(float 1.0)
6147   ret float %val
6150 define float @test_constant_fold_log_f32_p10() {
6151 ; CHECK-LABEL: @test_constant_fold_log_f32_p10(
6152 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.log.f32(float 1.000000e+01)
6153 ; CHECK-NEXT:    ret float [[VAL]]
6155   %val = call float @llvm.amdgcn.log.f32(float 10.0)
6156   ret float %val
6159 define float @test_constant_fold_log_f32_neg10() {
6160 ; CHECK-LABEL: @test_constant_fold_log_f32_neg10(
6161 ; CHECK-NEXT:    ret float 0x7FF8000000000000
6163   %val = call float @llvm.amdgcn.log.f32(float -10.0)
6164   ret float %val
6167 define float @test_constant_fold_log_f32_qnan() {
6168 ; CHECK-LABEL: @test_constant_fold_log_f32_qnan(
6169 ; CHECK-NEXT:    ret float 0x7FF8000000000000
6171   %val = call float @llvm.amdgcn.log.f32(float 0x7FF8000000000000)
6172   ret float %val
6175 define float @test_constant_fold_log_f32_snan() {
6176 ; CHECK-LABEL: @test_constant_fold_log_f32_snan(
6177 ; CHECK-NEXT:    ret float 0x7FF8000020000000
6179   %val = call float @llvm.amdgcn.log.f32(float 0x7FF0000020000000)
6180   ret float %val
6183 define half @test_constant_fold_log_f16_p0() {
6184 ; CHECK-LABEL: @test_constant_fold_log_f16_p0(
6185 ; CHECK-NEXT:    ret half 0xHFC00
6187   %val = call half @llvm.amdgcn.log.f16(half 0.0)
6188   ret half %val
6191 define half @test_constant_fold_log_f16_neg10() {
6192 ; CHECK-LABEL: @test_constant_fold_log_f16_neg10(
6193 ; CHECK-NEXT:    ret half 0xH7E00
6195   %val = call half @llvm.amdgcn.log.f16(half -10.0)
6196   ret half %val
6199 define float @test_constant_fold_log_f32_qnan_strictfp() strictfp {
6200 ; CHECK-LABEL: @test_constant_fold_log_f32_qnan_strictfp(
6201 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.log.f32(float 0x7FF8000000000000) #[[ATTR16]]
6202 ; CHECK-NEXT:    ret float [[VAL]]
6204   %val = call float @llvm.amdgcn.log.f32(float 0x7FF8000000000000) strictfp
6205   ret float %val
6208 define float @test_constant_fold_log_f32_0_strictfp() strictfp {
6209 ; CHECK-LABEL: @test_constant_fold_log_f32_0_strictfp(
6210 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.log.f32(float 0.000000e+00) #[[ATTR16]]
6211 ; CHECK-NEXT:    ret float [[VAL]]
6213   %val = call float @llvm.amdgcn.log.f32(float 0.0) strictfp
6214   ret float %val
6217 define float @test_constant_fold_log_f32_neg0_strictfp() strictfp {
6218 ; CHECK-LABEL: @test_constant_fold_log_f32_neg0_strictfp(
6219 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.log.f32(float -0.000000e+00) #[[ATTR16]]
6220 ; CHECK-NEXT:    ret float [[VAL]]
6222   %val = call float @llvm.amdgcn.log.f32(float -0.0) strictfp
6223   ret float %val
6226 define float @test_constant_fold_log_f32_neg_strictfp() strictfp {
6227 ; CHECK-LABEL: @test_constant_fold_log_f32_neg_strictfp(
6228 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.log.f32(float -1.000000e+01) #[[ATTR16]]
6229 ; CHECK-NEXT:    ret float [[VAL]]
6231   %val = call float @llvm.amdgcn.log.f32(float -10.0) strictfp
6232   ret float %val
6235 define float @test_constant_fold_log_f32_pinf_strictfp() strictfp {
6236 ; CHECK-LABEL: @test_constant_fold_log_f32_pinf_strictfp(
6237 ; CHECK-NEXT:    ret float 0x7FF0000000000000
6239   %val = call float @llvm.amdgcn.log.f32(float 0x7FF0000000000000) strictfp
6240   ret float %val
6243 define float @test_constant_fold_log_f32_ninf_strictfp() strictfp {
6244 ; CHECK-LABEL: @test_constant_fold_log_f32_ninf_strictfp(
6245 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.log.f32(float 0xFFF0000000000000) #[[ATTR16]]
6246 ; CHECK-NEXT:    ret float [[VAL]]
6248   %val = call float @llvm.amdgcn.log.f32(float 0xFFF0000000000000) strictfp
6249   ret float %val
6252 define half @test_constant_fold_log_f16_denorm() {
6253 ; CHECK-LABEL: @test_constant_fold_log_f16_denorm(
6254 ; CHECK-NEXT:    [[VAL:%.*]] = call half @llvm.amdgcn.log.f16(half 0xH03FF)
6255 ; CHECK-NEXT:    ret half [[VAL]]
6257   %val = call half @llvm.amdgcn.log.f16(half 0xH03ff)
6258   ret half %val
6261 define half @test_constant_fold_log_f16_neg_denorm() {
6262 ; CHECK-LABEL: @test_constant_fold_log_f16_neg_denorm(
6263 ; CHECK-NEXT:    ret half 0xH7E00
6265   %val = call half @llvm.amdgcn.log.f16(half 0xH83ff)
6266   ret half %val
6269 ; --------------------------------------------------------------------
6270 ; llvm.amdgcn.exp2
6271 ; --------------------------------------------------------------------
6273 declare float @llvm.amdgcn.exp2.f32(float) nounwind readnone
6274 declare half @llvm.amdgcn.exp2.f16(half) nounwind readnone
6276 define float @test_constant_fold_exp2_f32_undef() {
6277 ; CHECK-LABEL: @test_constant_fold_exp2_f32_undef(
6278 ; CHECK-NEXT:    ret float 0x7FF8000000000000
6280   %val = call float @llvm.amdgcn.exp2.f32(float undef)
6281   ret float %val
6284 define float @test_constant_fold_exp2_f32_poison() {
6285 ; CHECK-LABEL: @test_constant_fold_exp2_f32_poison(
6286 ; CHECK-NEXT:    ret float poison
6288   %val = call float @llvm.amdgcn.exp2.f32(float poison)
6289   ret float %val
6292 define float @test_constant_fold_exp2_f32_p0() {
6293 ; CHECK-LABEL: @test_constant_fold_exp2_f32_p0(
6294 ; CHECK-NEXT:    ret float 1.000000e+00
6296   %val = call float @llvm.amdgcn.exp2.f32(float 0.0)
6297   ret float %val
6300 define float @test_constant_fold_exp2_f32_n0() {
6301 ; CHECK-LABEL: @test_constant_fold_exp2_f32_n0(
6302 ; CHECK-NEXT:    ret float 1.000000e+00
6304   %val = call float @llvm.amdgcn.exp2.f32(float -0.0)
6305   ret float %val
6308 define float @test_constant_fold_exp2_f32_p1() {
6309 ; CHECK-LABEL: @test_constant_fold_exp2_f32_p1(
6310 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 1.000000e+00)
6311 ; CHECK-NEXT:    ret float [[VAL]]
6313   %val = call float @llvm.amdgcn.exp2.f32(float 1.0)
6314   ret float %val
6317 define float @test_constant_fold_exp2_f32_n1() {
6318 ; CHECK-LABEL: @test_constant_fold_exp2_f32_n1(
6319 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -1.000000e+00)
6320 ; CHECK-NEXT:    ret float [[VAL]]
6322   %val = call float @llvm.amdgcn.exp2.f32(float -1.0)
6323   ret float %val
6326 define float @test_constant_fold_exp2_f32_p2() {
6327 ; CHECK-LABEL: @test_constant_fold_exp2_f32_p2(
6328 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 2.000000e+00)
6329 ; CHECK-NEXT:    ret float [[VAL]]
6331   %val = call float @llvm.amdgcn.exp2.f32(float 2.0)
6332   ret float %val
6335 define float @test_constant_fold_exp2_f32_n2() {
6336 ; CHECK-LABEL: @test_constant_fold_exp2_f32_n2(
6337 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -2.000000e+00)
6338 ; CHECK-NEXT:    ret float [[VAL]]
6340   %val = call float @llvm.amdgcn.exp2.f32(float -2.0)
6341   ret float %val
6344 define float @test_constant_fold_exp2_f32_p4() {
6345 ; CHECK-LABEL: @test_constant_fold_exp2_f32_p4(
6346 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 4.000000e+00)
6347 ; CHECK-NEXT:    ret float [[VAL]]
6349   %val = call float @llvm.amdgcn.exp2.f32(float 4.0)
6350   ret float %val
6353 define float @test_constant_fold_exp2_f32_n4() {
6354 ; CHECK-LABEL: @test_constant_fold_exp2_f32_n4(
6355 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -4.000000e+00)
6356 ; CHECK-NEXT:    ret float [[VAL]]
6358   %val = call float @llvm.amdgcn.exp2.f32(float -4.0)
6359   ret float %val
6362 define float @test_constant_fold_exp2_f32_subnormal() {
6363 ; CHECK-LABEL: @test_constant_fold_exp2_f32_subnormal(
6364 ; CHECK-NEXT:    ret float 1.000000e+00
6366   %val = call float @llvm.amdgcn.exp2.f32(float 0x380FFFFFC0000000)
6367   ret float %val
6370 define float @test_constant_fold_exp2_f32_negsubnormal() {
6371 ; CHECK-LABEL: @test_constant_fold_exp2_f32_negsubnormal(
6372 ; CHECK-NEXT:    ret float 1.000000e+00
6374   %val = call float @llvm.amdgcn.exp2.f32(float 0xB80FFFFFC0000000)
6375   ret float %val
6378 define float @test_constant_fold_exp2_f32_pinf() {
6379 ; CHECK-LABEL: @test_constant_fold_exp2_f32_pinf(
6380 ; CHECK-NEXT:    ret float 0x7FF0000000000000
6382   %val = call float @llvm.amdgcn.exp2.f32(float 0x7FF0000000000000)
6383   ret float %val
6386 define float @test_constant_fold_exp2_f32_ninf() {
6387 ; CHECK-LABEL: @test_constant_fold_exp2_f32_ninf(
6388 ; CHECK-NEXT:    ret float 0.000000e+00
6390   %val = call float @llvm.amdgcn.exp2.f32(float 0xFFF0000000000000)
6391   ret float %val
6394 define float @test_constant_fold_exp2_f32_p10() {
6395 ; CHECK-LABEL: @test_constant_fold_exp2_f32_p10(
6396 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 1.000000e+01)
6397 ; CHECK-NEXT:    ret float [[VAL]]
6399   %val = call float @llvm.amdgcn.exp2.f32(float 10.0)
6400   ret float %val
6403 define float @test_constant_fold_exp2_f32_neg10() {
6404 ; CHECK-LABEL: @test_constant_fold_exp2_f32_neg10(
6405 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -1.000000e+01)
6406 ; CHECK-NEXT:    ret float [[VAL]]
6408   %val = call float @llvm.amdgcn.exp2.f32(float -10.0)
6409   ret float %val
6412 define float @test_constant_fold_exp2_f32_qnan() {
6413 ; CHECK-LABEL: @test_constant_fold_exp2_f32_qnan(
6414 ; CHECK-NEXT:    ret float 0x7FF8000000000000
6416   %val = call float @llvm.amdgcn.exp2.f32(float 0x7FF8000000000000)
6417   ret float %val
6420 define float @test_constant_fold_exp2_f32_snan() {
6421 ; CHECK-LABEL: @test_constant_fold_exp2_f32_snan(
6422 ; CHECK-NEXT:    ret float 0x7FF8000020000000
6424   %val = call float @llvm.amdgcn.exp2.f32(float 0x7FF0000020000000)
6425   ret float %val
6428 define half @test_constant_fold_exp2_f16_p0() {
6429 ; CHECK-LABEL: @test_constant_fold_exp2_f16_p0(
6430 ; CHECK-NEXT:    ret half 0xH3C00
6432   %val = call half @llvm.amdgcn.exp2.f16(half 0.0)
6433   ret half %val
6436 define half @test_constant_fold_exp2_f16_neg10() {
6437 ; CHECK-LABEL: @test_constant_fold_exp2_f16_neg10(
6438 ; CHECK-NEXT:    [[VAL:%.*]] = call half @llvm.amdgcn.exp2.f16(half 0xHC900)
6439 ; CHECK-NEXT:    ret half [[VAL]]
6441   %val = call half @llvm.amdgcn.exp2.f16(half -10.0)
6442   ret half %val
6445 define float @test_constant_fold_exp2_f32_qnan_strictfp() strictfp {
6446 ; CHECK-LABEL: @test_constant_fold_exp2_f32_qnan_strictfp(
6447 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 0x7FF8000000000000) #[[ATTR16]]
6448 ; CHECK-NEXT:    ret float [[VAL]]
6450   %val = call float @llvm.amdgcn.exp2.f32(float 0x7FF8000000000000) strictfp
6451   ret float %val
6454 define float @test_constant_fold_exp2_f32_0_strictfp() strictfp {
6455 ; CHECK-LABEL: @test_constant_fold_exp2_f32_0_strictfp(
6456 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 0.000000e+00) #[[ATTR16]]
6457 ; CHECK-NEXT:    ret float [[VAL]]
6459   %val = call float @llvm.amdgcn.exp2.f32(float 0.0) strictfp
6460   ret float %val
6463 define float @test_constant_fold_exp2_f32_neg0_strictfp() strictfp {
6464 ; CHECK-LABEL: @test_constant_fold_exp2_f32_neg0_strictfp(
6465 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -0.000000e+00) #[[ATTR16]]
6466 ; CHECK-NEXT:    ret float [[VAL]]
6468   %val = call float @llvm.amdgcn.exp2.f32(float -0.0) strictfp
6469   ret float %val
6472 define float @test_constant_fold_exp2_f32_1_strictfp() strictfp {
6473 ; CHECK-LABEL: @test_constant_fold_exp2_f32_1_strictfp(
6474 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 1.000000e+00) #[[ATTR16]]
6475 ; CHECK-NEXT:    ret float [[VAL]]
6477   %val = call float @llvm.amdgcn.exp2.f32(float 1.0) strictfp
6478   ret float %val
6481 define float @test_constant_fold_exp2_f32_neg1_strictfp() strictfp {
6482 ; CHECK-LABEL: @test_constant_fold_exp2_f32_neg1_strictfp(
6483 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -1.000000e+00) #[[ATTR16]]
6484 ; CHECK-NEXT:    ret float [[VAL]]
6486   %val = call float @llvm.amdgcn.exp2.f32(float -1.0) strictfp
6487   ret float %val
6490 define float @test_constant_fold_exp2_f32_2_strictfp() strictfp {
6491 ; CHECK-LABEL: @test_constant_fold_exp2_f32_2_strictfp(
6492 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float 2.000000e+00) #[[ATTR16]]
6493 ; CHECK-NEXT:    ret float [[VAL]]
6495   %val = call float @llvm.amdgcn.exp2.f32(float 2.0) strictfp
6496   ret float %val
6499 define float @test_constant_fold_exp2_f32_neg2_strictfp() strictfp {
6500 ; CHECK-LABEL: @test_constant_fold_exp2_f32_neg2_strictfp(
6501 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -2.000000e+00) #[[ATTR16]]
6502 ; CHECK-NEXT:    ret float [[VAL]]
6504   %val = call float @llvm.amdgcn.exp2.f32(float -2.0) strictfp
6505   ret float %val
6508 define float @test_constant_fold_exp2_f32_neg_strictfp() strictfp {
6509 ; CHECK-LABEL: @test_constant_fold_exp2_f32_neg_strictfp(
6510 ; CHECK-NEXT:    [[VAL:%.*]] = call float @llvm.amdgcn.exp2.f32(float -1.000000e+01) #[[ATTR16]]
6511 ; CHECK-NEXT:    ret float [[VAL]]
6513   %val = call float @llvm.amdgcn.exp2.f32(float -10.0) strictfp
6514   ret float %val
6517 define float @test_constant_fold_exp2_f32_pinf_strictfp() strictfp {
6518 ; CHECK-LABEL: @test_constant_fold_exp2_f32_pinf_strictfp(
6519 ; CHECK-NEXT:    ret float 0x7FF0000000000000
6521   %val = call float @llvm.amdgcn.exp2.f32(float 0x7FF0000000000000) strictfp
6522   ret float %val
6525 define float @test_constant_fold_exp2_f32_ninf_strictfp() strictfp {
6526 ; CHECK-LABEL: @test_constant_fold_exp2_f32_ninf_strictfp(
6527 ; CHECK-NEXT:    ret float 0.000000e+00
6529   %val = call float @llvm.amdgcn.exp2.f32(float 0xFFF0000000000000) strictfp
6530   ret float %val
6533 define half @test_constant_fold_exp2_f16_denorm() {
6534 ; CHECK-LABEL: @test_constant_fold_exp2_f16_denorm(
6535 ; CHECK-NEXT:    [[VAL:%.*]] = call half @llvm.amdgcn.exp2.f16(half 0xH03FF)
6536 ; CHECK-NEXT:    ret half [[VAL]]
6538   %val = call half @llvm.amdgcn.exp2.f16(half 0xH03ff)
6539   ret half %val
6542 define half @test_constant_fold_exp2_f16_neg_denorm() {
6543 ; CHECK-LABEL: @test_constant_fold_exp2_f16_neg_denorm(
6544 ; CHECK-NEXT:    [[VAL:%.*]] = call half @llvm.amdgcn.exp2.f16(half 0xH83FF)
6545 ; CHECK-NEXT:    ret half [[VAL]]
6547   %val = call half @llvm.amdgcn.exp2.f16(half 0xH83ff)
6548   ret half %val
6551 ; --------------------------------------------------------------------
6552 ; llvm.amdgcn.prng
6553 ; --------------------------------------------------------------------
6554 declare i32 @llvm.amdgcn.prng.b32(i32)
6555 define i32 @prng_undef_i32() {
6556 ; CHECK-LABEL: @prng_undef_i32(
6557 ; CHECK-NEXT:    ret i32 undef
6558   %prng = call i32 @llvm.amdgcn.prng.b32(i32 undef)
6559   ret i32 %prng
6562 define i32 @prng_poison_i32() {
6563 ; CHECK-LABEL: @prng_poison_i32(
6564 ; CHECK-NEXT:    ret i32 poison
6565   %prng = call i32 @llvm.amdgcn.prng.b32(i32 poison)
6566   ret i32 %prng