1; RUN:  llc -amdgpu-scalarize-global-loads=false -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
2
3declare float @llvm.fabs.f32(float) #0
4declare float @llvm.canonicalize.f32(float) #0
5declare <2 x float> @llvm.canonicalize.v2f32(<2 x float>) #0
6declare <3 x float> @llvm.canonicalize.v3f32(<3 x float>) #0
7declare <4 x float> @llvm.canonicalize.v4f32(<4 x float>) #0
8declare <8 x float> @llvm.canonicalize.v8f32(<8 x float>) #0
9declare double @llvm.fabs.f64(double) #0
10declare double @llvm.canonicalize.f64(double) #0
11declare <2 x double> @llvm.canonicalize.v2f64(<2 x double>) #0
12declare <3 x double> @llvm.canonicalize.v3f64(<3 x double>) #0
13declare <4 x double> @llvm.canonicalize.v4f64(<4 x double>) #0
14declare half @llvm.canonicalize.f16(half) #0
15declare <2 x half> @llvm.canonicalize.v2f16(<2 x half>) #0
16declare i32 @llvm.amdgcn.workitem.id.x() #0
17
18; GCN-LABEL: {{^}}v_test_canonicalize_var_f32:
19; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
20; GCN: buffer_store_dword [[REG]]
21define amdgpu_kernel void @v_test_canonicalize_var_f32(float addrspace(1)* %out) #1 {
22  %val = load float, float addrspace(1)* %out
23  %canonicalized = call float @llvm.canonicalize.f32(float %val)
24  store float %canonicalized, float addrspace(1)* %out
25  ret void
26}
27
28; GCN-LABEL: {{^}}s_test_canonicalize_var_f32:
29; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], 1.0, {{s[0-9]+}}
30; GCN: buffer_store_dword [[REG]]
31define amdgpu_kernel void @s_test_canonicalize_var_f32(float addrspace(1)* %out, float %val) #1 {
32  %canonicalized = call float @llvm.canonicalize.f32(float %val)
33  store float %canonicalized, float addrspace(1)* %out
34  ret void
35}
36
37; GCN-LABEL: {{^}}v_test_canonicalize_fabs_var_f32:
38; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], 1.0, |{{v[0-9]+}}|
39; GCN: buffer_store_dword [[REG]]
40define amdgpu_kernel void @v_test_canonicalize_fabs_var_f32(float addrspace(1)* %out) #1 {
41  %val = load float, float addrspace(1)* %out
42  %val.fabs = call float @llvm.fabs.f32(float %val)
43  %canonicalized = call float @llvm.canonicalize.f32(float %val.fabs)
44  store float %canonicalized, float addrspace(1)* %out
45  ret void
46}
47
48; GCN-LABEL: {{^}}v_test_canonicalize_fneg_fabs_var_f32:
49; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], -1.0, |{{v[0-9]+}}|
50; GCN: buffer_store_dword [[REG]]
51define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f32(float addrspace(1)* %out) #1 {
52  %val = load float, float addrspace(1)* %out
53  %val.fabs = call float @llvm.fabs.f32(float %val)
54  %val.fabs.fneg = fsub float -0.0, %val.fabs
55  %canonicalized = call float @llvm.canonicalize.f32(float %val.fabs.fneg)
56  store float %canonicalized, float addrspace(1)* %out
57  ret void
58}
59
60; GCN-LABEL: {{^}}v_test_canonicalize_fneg_var_f32:
61; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], -1.0, {{v[0-9]+}}
62; GCN: buffer_store_dword [[REG]]
63define amdgpu_kernel void @v_test_canonicalize_fneg_var_f32(float addrspace(1)* %out) #1 {
64  %val = load float, float addrspace(1)* %out
65  %val.fneg = fsub float -0.0, %val
66  %canonicalized = call float @llvm.canonicalize.f32(float %val.fneg)
67  store float %canonicalized, float addrspace(1)* %out
68  ret void
69}
70
71; GCN-LABEL: {{^}}test_fold_canonicalize_undef_f32:
72; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
73; GCN: buffer_store_dword [[REG]]
74define amdgpu_kernel void @test_fold_canonicalize_undef_f32(float addrspace(1)* %out) #1 {
75  %canonicalized = call float @llvm.canonicalize.f32(float undef)
76  store float %canonicalized, float addrspace(1)* %out
77  ret void
78}
79
80; GCN-LABEL: {{^}}test_fold_canonicalize_p0_f32:
81; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
82; GCN: buffer_store_dword [[REG]]
83define amdgpu_kernel void @test_fold_canonicalize_p0_f32(float addrspace(1)* %out) #1 {
84  %canonicalized = call float @llvm.canonicalize.f32(float 0.0)
85  store float %canonicalized, float addrspace(1)* %out
86  ret void
87}
88
89; GCN-LABEL: {{^}}test_fold_canonicalize_n0_f32:
90; GCN: v_bfrev_b32_e32 [[REG:v[0-9]+]], 1{{$}}
91; GCN: buffer_store_dword [[REG]]
92define amdgpu_kernel void @test_fold_canonicalize_n0_f32(float addrspace(1)* %out) #1 {
93  %canonicalized = call float @llvm.canonicalize.f32(float -0.0)
94  store float %canonicalized, float addrspace(1)* %out
95  ret void
96}
97
98; GCN-LABEL: {{^}}test_fold_canonicalize_p1_f32:
99; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 1.0{{$}}
100; GCN: buffer_store_dword [[REG]]
101define amdgpu_kernel void @test_fold_canonicalize_p1_f32(float addrspace(1)* %out) #1 {
102  %canonicalized = call float @llvm.canonicalize.f32(float 1.0)
103  store float %canonicalized, float addrspace(1)* %out
104  ret void
105}
106
107; GCN-LABEL: {{^}}test_fold_canonicalize_n1_f32:
108; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], -1.0{{$}}
109; GCN: buffer_store_dword [[REG]]
110define amdgpu_kernel void @test_fold_canonicalize_n1_f32(float addrspace(1)* %out) #1 {
111  %canonicalized = call float @llvm.canonicalize.f32(float -1.0)
112  store float %canonicalized, float addrspace(1)* %out
113  ret void
114}
115
116; GCN-LABEL: {{^}}test_fold_canonicalize_literal_f32:
117; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x41800000{{$}}
118; GCN: buffer_store_dword [[REG]]
119define amdgpu_kernel void @test_fold_canonicalize_literal_f32(float addrspace(1)* %out) #1 {
120  %canonicalized = call float @llvm.canonicalize.f32(float 16.0)
121  store float %canonicalized, float addrspace(1)* %out
122  ret void
123}
124
125; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal0_f32:
126; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
127; GCN: buffer_store_dword [[REG]]
128define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32(float addrspace(1)* %out) #1 {
129  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
130  store float %canonicalized, float addrspace(1)* %out
131  ret void
132}
133
134; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal0_f32:
135; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fffff{{$}}
136; GCN: buffer_store_dword [[REG]]
137define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f32(float addrspace(1)* %out) #3 {
138  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
139  store float %canonicalized, float addrspace(1)* %out
140  ret void
141}
142
143; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal1_f32:
144; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
145; GCN: buffer_store_dword [[REG]]
146define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f32(float addrspace(1)* %out) #1 {
147  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))
148  store float %canonicalized, float addrspace(1)* %out
149  ret void
150}
151
152; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal1_f32:
153; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x807fffff{{$}}
154; GCN: buffer_store_dword [[REG]]
155define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f32(float addrspace(1)* %out) #3 {
156  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))
157  store float %canonicalized, float addrspace(1)* %out
158  ret void
159}
160
161; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_f32:
162; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
163; GCN: buffer_store_dword [[REG]]
164define amdgpu_kernel void @test_fold_canonicalize_qnan_f32(float addrspace(1)* %out) #1 {
165  %canonicalized = call float @llvm.canonicalize.f32(float 0x7FF8000000000000)
166  store float %canonicalized, float addrspace(1)* %out
167  ret void
168}
169
170; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg1_f32:
171; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
172; GCN: buffer_store_dword [[REG]]
173define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f32(float addrspace(1)* %out) #1 {
174  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -1 to float))
175  store float %canonicalized, float addrspace(1)* %out
176  ret void
177}
178
179; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg2_f32:
180; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
181; GCN: buffer_store_dword [[REG]]
182define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f32(float addrspace(1)* %out) #1 {
183  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -2 to float))
184  store float %canonicalized, float addrspace(1)* %out
185  ret void
186}
187
188; GCN-LABEL: {{^}}test_fold_canonicalize_snan0_value_f32:
189; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
190; GCN: buffer_store_dword [[REG]]
191define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f32(float addrspace(1)* %out) #1 {
192  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2139095041 to float))
193  store float %canonicalized, float addrspace(1)* %out
194  ret void
195}
196
197; GCN-LABEL: {{^}}test_fold_canonicalize_snan1_value_f32:
198; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
199; GCN: buffer_store_dword [[REG]]
200define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f32(float addrspace(1)* %out) #1 {
201  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2143289343 to float))
202  store float %canonicalized, float addrspace(1)* %out
203  ret void
204}
205
206; GCN-LABEL: {{^}}test_fold_canonicalize_snan2_value_f32:
207; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
208; GCN: buffer_store_dword [[REG]]
209define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f32(float addrspace(1)* %out) #1 {
210  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4286578689 to float))
211  store float %canonicalized, float addrspace(1)* %out
212  ret void
213}
214
215; GCN-LABEL: {{^}}test_fold_canonicalize_snan3_value_f32:
216; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
217; GCN: buffer_store_dword [[REG]]
218define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f32(float addrspace(1)* %out) #1 {
219  %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4290772991 to float))
220  store float %canonicalized, float addrspace(1)* %out
221  ret void
222}
223
224; GCN-LABEL: {{^}}v_test_canonicalize_var_f64:
225; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}}
226; GCN: buffer_store_dwordx2 [[REG]]
227define amdgpu_kernel void @v_test_canonicalize_var_f64(double addrspace(1)* %out) #1 {
228  %val = load double, double addrspace(1)* %out
229  %canonicalized = call double @llvm.canonicalize.f64(double %val)
230  store double %canonicalized, double addrspace(1)* %out
231  ret void
232}
233
234; GCN-LABEL: {{^}}s_test_canonicalize_var_f64:
235; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
236; GCN: buffer_store_dwordx2 [[REG]]
237define amdgpu_kernel void @s_test_canonicalize_var_f64(double addrspace(1)* %out, double %val) #1 {
238  %canonicalized = call double @llvm.canonicalize.f64(double %val)
239  store double %canonicalized, double addrspace(1)* %out
240  ret void
241}
242
243; GCN-LABEL: {{^}}v_test_canonicalize_fabs_var_f64:
244; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], |{{v\[[0-9]+:[0-9]+\]}}|, |{{v\[[0-9]+:[0-9]+\]}}|
245; GCN: buffer_store_dwordx2 [[REG]]
246define amdgpu_kernel void @v_test_canonicalize_fabs_var_f64(double addrspace(1)* %out) #1 {
247  %val = load double, double addrspace(1)* %out
248  %val.fabs = call double @llvm.fabs.f64(double %val)
249  %canonicalized = call double @llvm.canonicalize.f64(double %val.fabs)
250  store double %canonicalized, double addrspace(1)* %out
251  ret void
252}
253
254; GCN-LABEL: {{^}}v_test_canonicalize_fneg_fabs_var_f64:
255; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]\]]], -|{{v\[[0-9]+:[0-9]+\]}}|, -|{{v\[[0-9]+:[0-9]+\]}}|
256; GCN: buffer_store_dwordx2 [[REG]]
257define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f64(double addrspace(1)* %out) #1 {
258  %val = load double, double addrspace(1)* %out
259  %val.fabs = call double @llvm.fabs.f64(double %val)
260  %val.fabs.fneg = fsub double -0.0, %val.fabs
261  %canonicalized = call double @llvm.canonicalize.f64(double %val.fabs.fneg)
262  store double %canonicalized, double addrspace(1)* %out
263  ret void
264}
265
266; GCN-LABEL: {{^}}v_test_canonicalize_fneg_var_f64:
267; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -{{v\[[0-9]+:[0-9]+\]}}, -{{v\[[0-9]+:[0-9]+\]}}
268; GCN: buffer_store_dwordx2 [[REG]]
269define amdgpu_kernel void @v_test_canonicalize_fneg_var_f64(double addrspace(1)* %out) #1 {
270  %val = load double, double addrspace(1)* %out
271  %val.fneg = fsub double -0.0, %val
272  %canonicalized = call double @llvm.canonicalize.f64(double %val.fneg)
273  store double %canonicalized, double addrspace(1)* %out
274  ret void
275}
276
277; GCN-LABEL: {{^}}test_fold_canonicalize_p0_f64:
278; GCN: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
279; GCN: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
280; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
281define amdgpu_kernel void @test_fold_canonicalize_p0_f64(double addrspace(1)* %out) #1 {
282  %canonicalized = call double @llvm.canonicalize.f64(double 0.0)
283  store double %canonicalized, double addrspace(1)* %out
284  ret void
285}
286
287; GCN-LABEL: {{^}}test_fold_canonicalize_n0_f64:
288; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
289; GCN-DAG: v_bfrev_b32_e32 v[[HI:[0-9]+]], 1{{$}}
290; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
291define amdgpu_kernel void @test_fold_canonicalize_n0_f64(double addrspace(1)* %out) #1 {
292  %canonicalized = call double @llvm.canonicalize.f64(double -0.0)
293  store double %canonicalized, double addrspace(1)* %out
294  ret void
295}
296
297; GCN-LABEL: {{^}}test_fold_canonicalize_p1_f64:
298; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
299; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x3ff00000{{$}}
300; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
301define amdgpu_kernel void @test_fold_canonicalize_p1_f64(double addrspace(1)* %out) #1 {
302  %canonicalized = call double @llvm.canonicalize.f64(double 1.0)
303  store double %canonicalized, double addrspace(1)* %out
304  ret void
305}
306
307; GCN-LABEL: {{^}}test_fold_canonicalize_n1_f64:
308; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
309; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0xbff00000{{$}}
310; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
311define amdgpu_kernel void @test_fold_canonicalize_n1_f64(double addrspace(1)* %out) #1 {
312  %canonicalized = call double @llvm.canonicalize.f64(double -1.0)
313  store double %canonicalized, double addrspace(1)* %out
314  ret void
315}
316
317; GCN-LABEL: {{^}}test_fold_canonicalize_literal_f64:
318; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
319; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x40300000{{$}}
320; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
321define amdgpu_kernel void @test_fold_canonicalize_literal_f64(double addrspace(1)* %out) #1 {
322  %canonicalized = call double @llvm.canonicalize.f64(double 16.0)
323  store double %canonicalized, double addrspace(1)* %out
324  ret void
325}
326
327; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal0_f64:
328; GCN: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
329; GCN: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
330; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
331define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f64(double addrspace(1)* %out) #2 {
332  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
333  store double %canonicalized, double addrspace(1)* %out
334  ret void
335}
336
337; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal0_f64:
338; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], -1{{$}}
339; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0xfffff{{$}}
340; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
341define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f64(double addrspace(1)* %out) #3 {
342  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
343  store double %canonicalized, double addrspace(1)* %out
344  ret void
345}
346
347; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal1_f64:
348; GCN: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
349; GCN: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
350; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
351define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f64(double addrspace(1)* %out) #2 {
352  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))
353  store double %canonicalized, double addrspace(1)* %out
354  ret void
355}
356
357; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal1_f64:
358; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], -1{{$}}
359; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x800fffff{{$}}
360; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
361define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f64(double addrspace(1)* %out) #3 {
362  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))
363  store double %canonicalized, double addrspace(1)* %out
364  ret void
365}
366
367; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_f64:
368; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
369; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
370; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
371define amdgpu_kernel void @test_fold_canonicalize_qnan_f64(double addrspace(1)* %out) #1 {
372  %canonicalized = call double @llvm.canonicalize.f64(double 0x7FF8000000000000)
373  store double %canonicalized, double addrspace(1)* %out
374  ret void
375}
376
377; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg1_f64:
378; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
379; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
380; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
381define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f64(double addrspace(1)* %out) #1 {
382  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -1 to double))
383  store double %canonicalized, double addrspace(1)* %out
384  ret void
385}
386
387; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg2_f64:
388; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
389; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
390; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
391define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f64(double addrspace(1)* %out) #1 {
392  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -2 to double))
393  store double %canonicalized, double addrspace(1)* %out
394  ret void
395}
396
397; GCN-LABEL: {{^}}test_fold_canonicalize_snan0_value_f64:
398; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
399; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
400; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
401define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f64(double addrspace(1)* %out) #1 {
402  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9218868437227405313 to double))
403  store double %canonicalized, double addrspace(1)* %out
404  ret void
405}
406
407; GCN-LABEL: {{^}}test_fold_canonicalize_snan1_value_f64:
408; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
409; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
410; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
411define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f64(double addrspace(1)* %out) #1 {
412  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9223372036854775807 to double))
413  store double %canonicalized, double addrspace(1)* %out
414  ret void
415}
416
417; GCN-LABEL: {{^}}test_fold_canonicalize_snan2_value_f64:
418; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
419; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
420; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
421define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f64(double addrspace(1)* %out) #1 {
422  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18442240474082181121 to double))
423  store double %canonicalized, double addrspace(1)* %out
424  ret void
425}
426
427; GCN-LABEL: {{^}}test_fold_canonicalize_snan3_value_f64:
428; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
429; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
430; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
431define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f64(double addrspace(1)* %out) #1 {
432  %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18446744073709551615 to double))
433  store double %canonicalized, double addrspace(1)* %out
434  ret void
435}
436
437; GCN-LABEL:  {{^}}test_canonicalize_value_f64_flush:
438; GCN: v_mul_f64 v[{{[0-9:]+}}], 1.0, v[{{[0-9:]+}}]
439define amdgpu_kernel void @test_canonicalize_value_f64_flush(double addrspace(1)* %arg, double addrspace(1)* %out) #4 {
440  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
441  %gep = getelementptr inbounds double, double addrspace(1)* %arg, i32 %id
442  %v = load double, double addrspace(1)* %gep, align 8
443  %canonicalized = tail call double @llvm.canonicalize.f64(double %v)
444  %gep2 = getelementptr inbounds double, double addrspace(1)* %out, i32 %id
445  store double %canonicalized, double addrspace(1)* %gep2, align 8
446  ret void
447}
448
449; GCN-LABEL:  {{^}}test_canonicalize_value_f32_flush:
450; GCN: v_mul_f32_e32 {{v[0-9]+}}, 1.0, {{v[0-9]+}}
451define amdgpu_kernel void @test_canonicalize_value_f32_flush(float addrspace(1)* %arg, float addrspace(1)* %out) #4 {
452  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
453  %gep = getelementptr inbounds float, float addrspace(1)* %arg, i32 %id
454  %v = load float, float addrspace(1)* %gep, align 4
455  %canonicalized = tail call float @llvm.canonicalize.f32(float %v)
456  %gep2 = getelementptr inbounds float, float addrspace(1)* %out, i32 %id
457  store float %canonicalized, float addrspace(1)* %gep2, align 4
458  ret void
459}
460
461; GCN-LABEL:  {{^}}test_canonicalize_value_f16_flush:
462; GCN: v_mul_f16_e32 {{v[0-9]+}}, 1.0, {{v[0-9]+}}
463define amdgpu_kernel void @test_canonicalize_value_f16_flush(half addrspace(1)* %arg, half addrspace(1)* %out) #4 {
464  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
465  %gep = getelementptr inbounds half, half addrspace(1)* %arg, i32 %id
466  %v = load half, half addrspace(1)* %gep, align 2
467  %canonicalized = tail call half @llvm.canonicalize.f16(half %v)
468  %gep2 = getelementptr inbounds half, half addrspace(1)* %out, i32 %id
469  store half %canonicalized, half addrspace(1)* %gep2, align 2
470  ret void
471}
472
473; GCN-LABEL:  {{^}}test_canonicalize_value_v2f16_flush_gfx8:
474; GCN:     v_mov_b32_e32 [[ONE:v[0-9]+]], 0x3c00
475; GCN-DAG: v_mul_f16_sdwa v{{[0-9]+}}, [[ONE]], v{{[0-9]+}} dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
476; GCN-DAG: v_mul_f16_e32 v{{[0-9]+}}, 1.0, v{{[0-9]+}}
477define amdgpu_kernel void @test_canonicalize_value_v2f16_flush_gfx8(<2 x half> addrspace(1)* %arg, <2 x half> addrspace(1)* %out) #4 {
478  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
479  %gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %arg, i32 %id
480  %v = load <2 x half>, <2 x half> addrspace(1)* %gep, align 4
481  %canonicalized = tail call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %v)
482  %gep2 = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i32 %id
483  store <2 x half> %canonicalized, <2 x half> addrspace(1)* %gep2, align 2
484  ret void
485}
486
487; GCN-LABEL:  {{^}}test_canonicalize_value_v2f16_flush_gfx9:
488; GCN-DAG: v_pk_mul_f16 v{{[0-9]+}}, 1.0, v{{[0-9]+}} op_sel_hi:[0,1]{{$}}
489define amdgpu_kernel void @test_canonicalize_value_v2f16_flush_gfx9(<2 x half> addrspace(1)* %arg, <2 x half> addrspace(1)* %out) #6 {
490  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
491  %gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %arg, i32 %id
492  %v = load <2 x half>, <2 x half> addrspace(1)* %gep, align 4
493  %canonicalized = tail call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %v)
494  %gep2 = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i32 %id
495  store <2 x half> %canonicalized, <2 x half> addrspace(1)* %gep2, align 2
496  ret void
497}
498
499; GCN-LABEL:  {{^}}test_canonicalize_value_f64_denorm:
500; GCN: v_max_f64 v[{{[0-9:]+}}], v[{{[0-9:]+}}], v[{{[0-9:]+}}]
501define amdgpu_kernel void @test_canonicalize_value_f64_denorm(double addrspace(1)* %arg, double addrspace(1)* %out) #5 {
502  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
503  %gep = getelementptr inbounds double, double addrspace(1)* %arg, i32 %id
504  %v = load double, double addrspace(1)* %gep, align 8
505  %canonicalized = tail call double @llvm.canonicalize.f64(double %v)
506  %gep2 = getelementptr inbounds double, double addrspace(1)* %out, i32 %id
507  store double %canonicalized, double addrspace(1)* %gep2, align 8
508  ret void
509}
510
511; GCN-LABEL:  {{^}}test_canonicalize_value_f32_denorm:
512; GCN: v_max_f32_e32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
513define amdgpu_kernel void @test_canonicalize_value_f32_denorm(float addrspace(1)* %arg, float addrspace(1)* %out) #5 {
514  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
515  %gep = getelementptr inbounds float, float addrspace(1)* %arg, i32 %id
516  %v = load float, float addrspace(1)* %gep, align 4
517  %canonicalized = tail call float @llvm.canonicalize.f32(float %v)
518  %gep2 = getelementptr inbounds float, float addrspace(1)* %out, i32 %id
519  store float %canonicalized, float addrspace(1)* %gep2, align 4
520  ret void
521}
522
523; GCN-LABEL:  {{^}}test_canonicalize_value_f16_denorm:
524; GCN: v_max_f16_e32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
525define amdgpu_kernel void @test_canonicalize_value_f16_denorm(half addrspace(1)* %arg, half addrspace(1)* %out) #5 {
526  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
527  %gep = getelementptr inbounds half, half addrspace(1)* %arg, i32 %id
528  %v = load half, half addrspace(1)* %gep, align 2
529  %canonicalized = tail call half @llvm.canonicalize.f16(half %v)
530  %gep2 = getelementptr inbounds half, half addrspace(1)* %out, i32 %id
531  store half %canonicalized, half addrspace(1)* %gep2, align 2
532  ret void
533}
534
535; GCN-LABEL:  {{^}}test_canonicalize_value_v2f16_denorm:
536; GCN: v_pk_max_f16 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
537define amdgpu_kernel void @test_canonicalize_value_v2f16_denorm(<2 x half> addrspace(1)* %arg, <2 x half> addrspace(1)* %out) #5 {
538  %id = tail call i32 @llvm.amdgcn.workitem.id.x()
539  %gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %arg, i32 %id
540  %v = load <2 x half>, <2 x half> addrspace(1)* %gep, align 4
541  %canonicalized = tail call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %v)
542  %gep2 = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i32 %id
543  store <2 x half> %canonicalized, <2 x half> addrspace(1)* %gep2, align 2
544  ret void
545}
546
547; GCN-LABEL: {{^}}v_test_canonicalize_var_v2f64:
548; GCN: v_max_f64
549; GCN: v_max_f64
550define amdgpu_kernel void @v_test_canonicalize_var_v2f64(<2 x double> addrspace(1)* %out) #1 {
551  %tid = call i32 @llvm.amdgcn.workitem.id.x()
552  %gep = getelementptr <2 x double>, <2 x double> addrspace(1)* %out, i32 %tid
553  %val = load <2 x double>, <2 x double> addrspace(1)* %gep
554  %canonicalized = call <2 x double> @llvm.canonicalize.v2f64(<2 x double> %val)
555  store <2 x double> %canonicalized, <2 x double> addrspace(1)* %out
556  ret void
557}
558
559; GCN-LABEL: {{^}}v_test_canonicalize_v2f32:
560; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
561; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
562define <2 x float> @v_test_canonicalize_v2f32(<2 x float> %arg) #1 {
563  %canon = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %arg)
564  ret <2 x float> %canon
565}
566
567; GCN-LABEL: {{^}}v_test_canonicalize_v3f32:
568; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
569; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
570; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
571define <3 x float> @v_test_canonicalize_v3f32(<3 x float> %arg) #1 {
572  %canon = call <3 x float> @llvm.canonicalize.v3f32(<3 x float> %arg)
573  ret <3 x float> %canon
574}
575
576; GCN-LABEL: {{^}}v_test_canonicalize_v4f32:
577; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
578; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
579; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
580; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
581define <4 x float> @v_test_canonicalize_v4f32(<4 x float> %arg) #1 {
582  %canon = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %arg)
583  ret <4 x float> %canon
584}
585
586; GCN-LABEL: {{^}}v_test_canonicalize_v8f32:
587; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
588; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
589; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
590; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
591; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
592; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
593; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
594; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
595define <8 x float> @v_test_canonicalize_v8f32(<8 x float> %arg) #1 {
596  %canon = call <8 x float> @llvm.canonicalize.v8f32(<8 x float> %arg)
597  ret <8 x float> %canon
598}
599
600; GCN-LABEL: {{^}}v_test_canonicalize_v2f64:
601; GCN: v_max_f64
602; GCN: v_max_f64
603define <2 x double> @v_test_canonicalize_v2f64(<2 x double> %arg) #1 {
604  %canon = call <2 x double> @llvm.canonicalize.v2f64(<2 x double> %arg)
605  ret <2 x double> %canon
606}
607
608; GCN-LABEL: {{^}}v_test_canonicalize_v3f64:
609; GCN: v_max_f64
610; GCN: v_max_f64
611; GCN: v_max_f64
612define <3 x double> @v_test_canonicalize_v3f64(<3 x double> %arg) #1 {
613  %canon = call <3 x double> @llvm.canonicalize.v3f64(<3 x double> %arg)
614  ret <3 x double> %canon
615}
616
617; GCN-LABEL: {{^}}v_test_canonicalize_v4f64:
618; GCN: v_max_f64
619; GCN: v_max_f64
620; GCN: v_max_f64
621; GCN: v_max_f64
622define <4 x double> @v_test_canonicalize_v4f64(<4 x double> %arg) #1 {
623  %canon = call <4 x double> @llvm.canonicalize.v4f64(<4 x double> %arg)
624  ret <4 x double> %canon
625}
626
627attributes #0 = { nounwind readnone }
628attributes #1 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
629attributes #2 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" }
630attributes #3 = { nounwind "denormal-fp-math"="ieee,ieee" }
631attributes #4 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" "target-cpu"="tonga" }
632attributes #5 = { nounwind "denormal-fp-math"="ieee,ieee" "target-cpu"="gfx900" }
633attributes #6 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" "target-cpu"="gfx900" }
634