blob: 028766ebd60ea5eec25bc7696946c3a3d96ba29b [file] [log] [blame]
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +00001; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
Matt Arsenault9cd90712016-04-14 01:42:16 +00002
Matt Arsenaultd5d78512017-01-31 17:28:40 +00003declare float @llvm.fabs.f32(float) #0
Matt Arsenault9cd90712016-04-14 01:42:16 +00004declare float @llvm.canonicalize.f32(float) #0
Matt Arsenaultd5d78512017-01-31 17:28:40 +00005declare double @llvm.fabs.f64(double) #0
Matt Arsenault9cd90712016-04-14 01:42:16 +00006declare double @llvm.canonicalize.f64(double) #0
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +00007declare half @llvm.canonicalize.f16(half) #0
8declare i32 @llvm.amdgcn.workitem.id.x() #0
Matt Arsenault9cd90712016-04-14 01:42:16 +00009
10; GCN-LABEL: {{^}}v_test_canonicalize_var_f32:
11; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
12; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000013define amdgpu_kernel void @v_test_canonicalize_var_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +000014 %val = load float, float addrspace(1)* %out
15 %canonicalized = call float @llvm.canonicalize.f32(float %val)
16 store float %canonicalized, float addrspace(1)* %out
17 ret void
18}
19
20; GCN-LABEL: {{^}}s_test_canonicalize_var_f32:
21; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], 1.0, {{s[0-9]+}}
22; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000023define amdgpu_kernel void @s_test_canonicalize_var_f32(float addrspace(1)* %out, float %val) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +000024 %canonicalized = call float @llvm.canonicalize.f32(float %val)
25 store float %canonicalized, float addrspace(1)* %out
26 ret void
27}
28
Matt Arsenaultd5d78512017-01-31 17:28:40 +000029; GCN-LABEL: {{^}}v_test_canonicalize_fabs_var_f32:
30; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], 1.0, |{{v[0-9]+}}|
31; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000032define amdgpu_kernel void @v_test_canonicalize_fabs_var_f32(float addrspace(1)* %out) #1 {
Matt Arsenaultd5d78512017-01-31 17:28:40 +000033 %val = load float, float addrspace(1)* %out
34 %val.fabs = call float @llvm.fabs.f32(float %val)
35 %canonicalized = call float @llvm.canonicalize.f32(float %val.fabs)
36 store float %canonicalized, float addrspace(1)* %out
37 ret void
38}
39
40; GCN-LABEL: {{^}}v_test_canonicalize_fneg_fabs_var_f32:
41; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], 1.0, -|{{v[0-9]+}}|
42; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000043define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f32(float addrspace(1)* %out) #1 {
Matt Arsenaultd5d78512017-01-31 17:28:40 +000044 %val = load float, float addrspace(1)* %out
45 %val.fabs = call float @llvm.fabs.f32(float %val)
46 %val.fabs.fneg = fsub float -0.0, %val.fabs
47 %canonicalized = call float @llvm.canonicalize.f32(float %val.fabs.fneg)
48 store float %canonicalized, float addrspace(1)* %out
49 ret void
50}
51
52; GCN-LABEL: {{^}}v_test_canonicalize_fneg_var_f32:
53; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], 1.0, -{{v[0-9]+}}
54; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000055define amdgpu_kernel void @v_test_canonicalize_fneg_var_f32(float addrspace(1)* %out) #1 {
Matt Arsenaultd5d78512017-01-31 17:28:40 +000056 %val = load float, float addrspace(1)* %out
57 %val.fneg = fsub float -0.0, %val
58 %canonicalized = call float @llvm.canonicalize.f32(float %val.fneg)
59 store float %canonicalized, float addrspace(1)* %out
60 ret void
61}
62
Matt Arsenault9cd90712016-04-14 01:42:16 +000063; GCN-LABEL: {{^}}test_fold_canonicalize_p0_f32:
64; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
65; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000066define amdgpu_kernel void @test_fold_canonicalize_p0_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +000067 %canonicalized = call float @llvm.canonicalize.f32(float 0.0)
68 store float %canonicalized, float addrspace(1)* %out
69 ret void
70}
71
72; GCN-LABEL: {{^}}test_fold_canonicalize_n0_f32:
73; GCN: v_bfrev_b32_e32 [[REG:v[0-9]+]], 1{{$}}
74; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000075define amdgpu_kernel void @test_fold_canonicalize_n0_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +000076 %canonicalized = call float @llvm.canonicalize.f32(float -0.0)
77 store float %canonicalized, float addrspace(1)* %out
78 ret void
79}
80
81; GCN-LABEL: {{^}}test_fold_canonicalize_p1_f32:
82; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 1.0{{$}}
83; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000084define amdgpu_kernel void @test_fold_canonicalize_p1_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +000085 %canonicalized = call float @llvm.canonicalize.f32(float 1.0)
86 store float %canonicalized, float addrspace(1)* %out
87 ret void
88}
89
90; GCN-LABEL: {{^}}test_fold_canonicalize_n1_f32:
91; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], -1.0{{$}}
92; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000093define amdgpu_kernel void @test_fold_canonicalize_n1_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +000094 %canonicalized = call float @llvm.canonicalize.f32(float -1.0)
95 store float %canonicalized, float addrspace(1)* %out
96 ret void
97}
98
99; GCN-LABEL: {{^}}test_fold_canonicalize_literal_f32:
100; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x41800000{{$}}
101; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000102define amdgpu_kernel void @test_fold_canonicalize_literal_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000103 %canonicalized = call float @llvm.canonicalize.f32(float 16.0)
104 store float %canonicalized, float addrspace(1)* %out
105 ret void
106}
107
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000108; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal0_f32:
109; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000110; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000111define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000112 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
113 store float %canonicalized, float addrspace(1)* %out
114 ret void
115}
116
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000117; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal0_f32:
118; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fffff{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000119; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000120define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f32(float addrspace(1)* %out) #3 {
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000121 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
122 store float %canonicalized, float addrspace(1)* %out
123 ret void
124}
125
126; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal1_f32:
127; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
128; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000129define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f32(float addrspace(1)* %out) #1 {
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000130 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))
131 store float %canonicalized, float addrspace(1)* %out
132 ret void
133}
134
135; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal1_f32:
136; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x807fffff{{$}}
137; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000138define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f32(float addrspace(1)* %out) #3 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000139 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))
140 store float %canonicalized, float addrspace(1)* %out
141 ret void
142}
143
144; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_f32:
145; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
146; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000147define amdgpu_kernel void @test_fold_canonicalize_qnan_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000148 %canonicalized = call float @llvm.canonicalize.f32(float 0x7FF8000000000000)
149 store float %canonicalized, float addrspace(1)* %out
150 ret void
151}
152
153; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg1_f32:
154; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
155; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000156define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000157 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -1 to float))
158 store float %canonicalized, float addrspace(1)* %out
159 ret void
160}
161
162; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg2_f32:
163; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
164; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000165define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000166 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -2 to float))
167 store float %canonicalized, float addrspace(1)* %out
168 ret void
169}
170
171; GCN-LABEL: {{^}}test_fold_canonicalize_snan0_value_f32:
172; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
173; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000174define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000175 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2139095041 to float))
176 store float %canonicalized, float addrspace(1)* %out
177 ret void
178}
179
180; GCN-LABEL: {{^}}test_fold_canonicalize_snan1_value_f32:
181; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
182; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000183define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000184 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2143289343 to float))
185 store float %canonicalized, float addrspace(1)* %out
186 ret void
187}
188
189; GCN-LABEL: {{^}}test_fold_canonicalize_snan2_value_f32:
190; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
191; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000192define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000193 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4286578689 to float))
194 store float %canonicalized, float addrspace(1)* %out
195 ret void
196}
197
198; GCN-LABEL: {{^}}test_fold_canonicalize_snan3_value_f32:
199; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
200; GCN: buffer_store_dword [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000201define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f32(float addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000202 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4290772991 to float))
203 store float %canonicalized, float addrspace(1)* %out
204 ret void
205}
206
207; GCN-LABEL: {{^}}v_test_canonicalize_var_f64:
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +0000208; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000209; GCN: buffer_store_dwordx2 [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000210define amdgpu_kernel void @v_test_canonicalize_var_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000211 %val = load double, double addrspace(1)* %out
212 %canonicalized = call double @llvm.canonicalize.f64(double %val)
213 store double %canonicalized, double addrspace(1)* %out
214 ret void
215}
216
217; GCN-LABEL: {{^}}s_test_canonicalize_var_f64:
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +0000218; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000219; GCN: buffer_store_dwordx2 [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000220define amdgpu_kernel void @s_test_canonicalize_var_f64(double addrspace(1)* %out, double %val) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000221 %canonicalized = call double @llvm.canonicalize.f64(double %val)
222 store double %canonicalized, double addrspace(1)* %out
223 ret void
224}
225
Matt Arsenaultd5d78512017-01-31 17:28:40 +0000226; GCN-LABEL: {{^}}v_test_canonicalize_fabs_var_f64:
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +0000227; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], |{{v\[[0-9]+:[0-9]+\]}}|, |{{v\[[0-9]+:[0-9]+\]}}|
Matt Arsenaultd5d78512017-01-31 17:28:40 +0000228; GCN: buffer_store_dwordx2 [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000229define amdgpu_kernel void @v_test_canonicalize_fabs_var_f64(double addrspace(1)* %out) #1 {
Matt Arsenaultd5d78512017-01-31 17:28:40 +0000230 %val = load double, double addrspace(1)* %out
231 %val.fabs = call double @llvm.fabs.f64(double %val)
232 %canonicalized = call double @llvm.canonicalize.f64(double %val.fabs)
233 store double %canonicalized, double addrspace(1)* %out
234 ret void
235}
236
237; GCN-LABEL: {{^}}v_test_canonicalize_fneg_fabs_var_f64:
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +0000238; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]\]]], -|{{v\[[0-9]+:[0-9]+\]}}|, -|{{v\[[0-9]+:[0-9]+\]}}|
Matt Arsenaultd5d78512017-01-31 17:28:40 +0000239; GCN: buffer_store_dwordx2 [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000240define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f64(double addrspace(1)* %out) #1 {
Matt Arsenaultd5d78512017-01-31 17:28:40 +0000241 %val = load double, double addrspace(1)* %out
242 %val.fabs = call double @llvm.fabs.f64(double %val)
243 %val.fabs.fneg = fsub double -0.0, %val.fabs
244 %canonicalized = call double @llvm.canonicalize.f64(double %val.fabs.fneg)
245 store double %canonicalized, double addrspace(1)* %out
246 ret void
247}
248
249; GCN-LABEL: {{^}}v_test_canonicalize_fneg_var_f64:
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +0000250; GCN: v_max_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -{{v\[[0-9]+:[0-9]+\]}}, -{{v\[[0-9]+:[0-9]+\]}}
Matt Arsenaultd5d78512017-01-31 17:28:40 +0000251; GCN: buffer_store_dwordx2 [[REG]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000252define amdgpu_kernel void @v_test_canonicalize_fneg_var_f64(double addrspace(1)* %out) #1 {
Matt Arsenaultd5d78512017-01-31 17:28:40 +0000253 %val = load double, double addrspace(1)* %out
254 %val.fneg = fsub double -0.0, %val
255 %canonicalized = call double @llvm.canonicalize.f64(double %val.fneg)
256 store double %canonicalized, double addrspace(1)* %out
257 ret void
258}
259
Matt Arsenault9cd90712016-04-14 01:42:16 +0000260; GCN-LABEL: {{^}}test_fold_canonicalize_p0_f64:
261; GCN: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
Matt Arsenault2b957b52016-05-02 20:07:26 +0000262; GCN: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000263; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000264define amdgpu_kernel void @test_fold_canonicalize_p0_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000265 %canonicalized = call double @llvm.canonicalize.f64(double 0.0)
266 store double %canonicalized, double addrspace(1)* %out
267 ret void
268}
269
270; GCN-LABEL: {{^}}test_fold_canonicalize_n0_f64:
271; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
272; GCN-DAG: v_bfrev_b32_e32 v[[HI:[0-9]+]], 1{{$}}
273; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000274define amdgpu_kernel void @test_fold_canonicalize_n0_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000275 %canonicalized = call double @llvm.canonicalize.f64(double -0.0)
276 store double %canonicalized, double addrspace(1)* %out
277 ret void
278}
279
280; GCN-LABEL: {{^}}test_fold_canonicalize_p1_f64:
281; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
282; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x3ff00000{{$}}
283; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000284define amdgpu_kernel void @test_fold_canonicalize_p1_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000285 %canonicalized = call double @llvm.canonicalize.f64(double 1.0)
286 store double %canonicalized, double addrspace(1)* %out
287 ret void
288}
289
290; GCN-LABEL: {{^}}test_fold_canonicalize_n1_f64:
291; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
292; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0xbff00000{{$}}
293; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000294define amdgpu_kernel void @test_fold_canonicalize_n1_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000295 %canonicalized = call double @llvm.canonicalize.f64(double -1.0)
296 store double %canonicalized, double addrspace(1)* %out
297 ret void
298}
299
300; GCN-LABEL: {{^}}test_fold_canonicalize_literal_f64:
301; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
302; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x40300000{{$}}
303; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000304define amdgpu_kernel void @test_fold_canonicalize_literal_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000305 %canonicalized = call double @llvm.canonicalize.f64(double 16.0)
306 store double %canonicalized, double addrspace(1)* %out
307 ret void
308}
309
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000310; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal0_f64:
311; GCN: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
312; GCN: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000313; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000314define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f64(double addrspace(1)* %out) #2 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000315 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
316 store double %canonicalized, double addrspace(1)* %out
317 ret void
318}
319
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000320; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal0_f64:
321; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], -1{{$}}
322; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0xfffff{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000323; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000324define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f64(double addrspace(1)* %out) #3 {
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000325 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
326 store double %canonicalized, double addrspace(1)* %out
327 ret void
328}
329
330; GCN-LABEL: {{^}}test_no_denormals_fold_canonicalize_denormal1_f64:
331; GCN: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
332; GCN: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
333; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000334define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f64(double addrspace(1)* %out) #2 {
Matt Arsenaultb2cb5f82016-07-09 07:55:03 +0000335 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))
336 store double %canonicalized, double addrspace(1)* %out
337 ret void
338}
339
340; GCN-LABEL: {{^}}test_denormals_fold_canonicalize_denormal1_f64:
341; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], -1{{$}}
342; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x800fffff{{$}}
343; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000344define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f64(double addrspace(1)* %out) #3 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000345 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))
346 store double %canonicalized, double addrspace(1)* %out
347 ret void
348}
349
350; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_f64:
351; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
352; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
353; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000354define amdgpu_kernel void @test_fold_canonicalize_qnan_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000355 %canonicalized = call double @llvm.canonicalize.f64(double 0x7FF8000000000000)
356 store double %canonicalized, double addrspace(1)* %out
357 ret void
358}
359
360; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg1_f64:
361; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
362; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
363; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000364define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000365 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -1 to double))
366 store double %canonicalized, double addrspace(1)* %out
367 ret void
368}
369
370; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg2_f64:
371; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
372; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
373; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000374define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000375 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -2 to double))
376 store double %canonicalized, double addrspace(1)* %out
377 ret void
378}
379
380; GCN-LABEL: {{^}}test_fold_canonicalize_snan0_value_f64:
381; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
382; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
383; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000384define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000385 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9218868437227405313 to double))
386 store double %canonicalized, double addrspace(1)* %out
387 ret void
388}
389
390; GCN-LABEL: {{^}}test_fold_canonicalize_snan1_value_f64:
391; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
392; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
393; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000394define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000395 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9223372036854775807 to double))
396 store double %canonicalized, double addrspace(1)* %out
397 ret void
398}
399
400; GCN-LABEL: {{^}}test_fold_canonicalize_snan2_value_f64:
401; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
402; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
403; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000404define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000405 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18442240474082181121 to double))
406 store double %canonicalized, double addrspace(1)* %out
407 ret void
408}
409
410; GCN-LABEL: {{^}}test_fold_canonicalize_snan3_value_f64:
411; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
412; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
413; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000414define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f64(double addrspace(1)* %out) #1 {
Matt Arsenault9cd90712016-04-14 01:42:16 +0000415 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18446744073709551615 to double))
416 store double %canonicalized, double addrspace(1)* %out
417 ret void
418}
419
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +0000420; GCN-LABEL: {{^}}test_canonicalize_value_f64_flush:
421; GCN: v_mul_f64 v[{{[0-9:]+}}], 1.0, v[{{[0-9:]+}}]
422define amdgpu_kernel void @test_canonicalize_value_f64_flush(double addrspace(1)* %arg, double addrspace(1)* %out) #4 {
423 %id = tail call i32 @llvm.amdgcn.workitem.id.x()
424 %gep = getelementptr inbounds double, double addrspace(1)* %arg, i32 %id
425 %v = load double, double addrspace(1)* %gep, align 8
426 %canonicalized = tail call double @llvm.canonicalize.f64(double %v)
427 %gep2 = getelementptr inbounds double, double addrspace(1)* %out, i32 %id
428 store double %canonicalized, double addrspace(1)* %gep2, align 8
429 ret void
430}
431
432; GCN-LABEL: {{^}}test_canonicalize_value_f32_flush:
433; GCN: v_mul_f32_e32 {{v[0-9]+}}, 1.0, {{v[0-9]+}}
434define amdgpu_kernel void @test_canonicalize_value_f32_flush(float addrspace(1)* %arg, float addrspace(1)* %out) #4 {
435 %id = tail call i32 @llvm.amdgcn.workitem.id.x()
436 %gep = getelementptr inbounds float, float addrspace(1)* %arg, i32 %id
437 %v = load float, float addrspace(1)* %gep, align 4
438 %canonicalized = tail call float @llvm.canonicalize.f32(float %v)
439 %gep2 = getelementptr inbounds float, float addrspace(1)* %out, i32 %id
440 store float %canonicalized, float addrspace(1)* %gep2, align 4
441 ret void
442}
443
444; GCN-LABEL: {{^}}test_canonicalize_value_f16_flush:
445; GCN: v_mul_f16_e32 {{v[0-9]+}}, 1.0, {{v[0-9]+}}
446define amdgpu_kernel void @test_canonicalize_value_f16_flush(half addrspace(1)* %arg, half addrspace(1)* %out) #4 {
447 %id = tail call i32 @llvm.amdgcn.workitem.id.x()
448 %gep = getelementptr inbounds half, half addrspace(1)* %arg, i32 %id
449 %v = load half, half addrspace(1)* %gep, align 2
450 %canonicalized = tail call half @llvm.canonicalize.f16(half %v)
451 %gep2 = getelementptr inbounds half, half addrspace(1)* %out, i32 %id
452 store half %canonicalized, half addrspace(1)* %gep2, align 2
453 ret void
454}
455
456; GCN-LABEL: {{^}}test_canonicalize_value_f64_denorm:
457; GCN: v_max_f64 v[{{[0-9:]+}}], v[{{[0-9:]+}}], v[{{[0-9:]+}}]
458define amdgpu_kernel void @test_canonicalize_value_f64_denorm(double addrspace(1)* %arg, double addrspace(1)* %out) #5 {
459 %id = tail call i32 @llvm.amdgcn.workitem.id.x()
460 %gep = getelementptr inbounds double, double addrspace(1)* %arg, i32 %id
461 %v = load double, double addrspace(1)* %gep, align 8
462 %canonicalized = tail call double @llvm.canonicalize.f64(double %v)
463 %gep2 = getelementptr inbounds double, double addrspace(1)* %out, i32 %id
464 store double %canonicalized, double addrspace(1)* %gep2, align 8
465 ret void
466}
467
468; GCN-LABEL: {{^}}test_canonicalize_value_f32_denorm:
469; GCN: v_max_f32_e32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
470define amdgpu_kernel void @test_canonicalize_value_f32_denorm(float addrspace(1)* %arg, float addrspace(1)* %out) #5 {
471 %id = tail call i32 @llvm.amdgcn.workitem.id.x()
472 %gep = getelementptr inbounds float, float addrspace(1)* %arg, i32 %id
473 %v = load float, float addrspace(1)* %gep, align 4
474 %canonicalized = tail call float @llvm.canonicalize.f32(float %v)
475 %gep2 = getelementptr inbounds float, float addrspace(1)* %out, i32 %id
476 store float %canonicalized, float addrspace(1)* %gep2, align 4
477 ret void
478}
479
480; GCN-LABEL: {{^}}test_canonicalize_value_f16_denorm:
481; GCN: v_max_f16_e32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
482define amdgpu_kernel void @test_canonicalize_value_f16_denorm(half addrspace(1)* %arg, half addrspace(1)* %out) #5 {
483 %id = tail call i32 @llvm.amdgcn.workitem.id.x()
484 %gep = getelementptr inbounds half, half addrspace(1)* %arg, i32 %id
485 %v = load half, half addrspace(1)* %gep, align 2
486 %canonicalized = tail call half @llvm.canonicalize.f16(half %v)
487 %gep2 = getelementptr inbounds half, half addrspace(1)* %out, i32 %id
488 store half %canonicalized, half addrspace(1)* %gep2, align 2
489 ret void
490}
491
Matt Arsenault9cd90712016-04-14 01:42:16 +0000492attributes #0 = { nounwind readnone }
493attributes #1 = { nounwind }
Matt Arsenaulta6867fd2017-01-23 22:31:03 +0000494attributes #2 = { nounwind "target-features"="-fp32-denormals,-fp64-fp16-denormals" }
495attributes #3 = { nounwind "target-features"="+fp32-denormals,+fp64-fp16-denormals" }
Stanislav Mekhanoshin06cab792017-08-30 03:03:38 +0000496attributes #4 = { nounwind "target-features"="-fp32-denormals,-fp64-fp16-denormals" "target-cpu"="tonga" }
497attributes #5 = { nounwind "target-features"="+fp32-denormals,+fp64-fp16-denormals" "target-cpu"="gfx900" }