blob: 0213acdc18ea250e0a1837d8bc4ed360b6a13bf9 [file] [log] [blame]
Matt Arsenaultf639c322016-01-28 20:53:42 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=NOSNAN -check-prefix=GCN %s
2; RUN: llc -march=amdgcn -mattr=+fp-exceptions -verify-machineinstrs < %s | FileCheck -check-prefix=SNAN -check-prefix=GCN %s
3
Matt Arsenaultf4110712017-01-18 02:10:08 +00004; GCN-LABEL: {{^}}v_test_nnan_input_fmed3_r_i_i_f32:
5; GCN: v_add_f32_e32 [[ADD:v[0-9]+]], 1.0, v{{[0-9]+}}
6; GCN: v_med3_f32 v{{[0-9]+}}, [[ADD]], 2.0, 4.0
7define void @v_test_nnan_input_fmed3_r_i_i_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 {
8 %tid = call i32 @llvm.amdgcn.workitem.id.x()
9 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
10 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
11 %a = load float, float addrspace(1)* %gep0
12 %a.add = fadd nnan float %a, 1.0
13 %max = call float @llvm.maxnum.f32(float %a.add, float 2.0)
14 %med = call float @llvm.minnum.f32(float %max, float 4.0)
15
16 store float %med, float addrspace(1)* %outgep
17 ret void
18}
19
Matt Arsenaultf639c322016-01-28 20:53:42 +000020; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_f32:
21; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0
22
23; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}}
24; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}}
25define void @v_test_fmed3_r_i_i_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 {
Matt Arsenault45f82162016-07-11 23:35:48 +000026 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenaultf639c322016-01-28 20:53:42 +000027 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
28 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
29 %a = load float, float addrspace(1)* %gep0
30
31 %max = call float @llvm.maxnum.f32(float %a, float 2.0)
32 %med = call float @llvm.minnum.f32(float %max, float 4.0)
33
34 store float %med, float addrspace(1)* %outgep
35 ret void
36}
37
38; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_commute0_f32:
39; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0
40
41; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}}
42; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}}
43define void @v_test_fmed3_r_i_i_commute0_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 {
Matt Arsenault45f82162016-07-11 23:35:48 +000044 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenaultf639c322016-01-28 20:53:42 +000045 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
46 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
47 %a = load float, float addrspace(1)* %gep0
48
49 %max = call float @llvm.maxnum.f32(float 2.0, float %a)
50 %med = call float @llvm.minnum.f32(float 4.0, float %max)
51
52 store float %med, float addrspace(1)* %outgep
53 ret void
54}
55
56; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_commute1_f32:
57; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0
58
59; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}}
60; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}}
61define void @v_test_fmed3_r_i_i_commute1_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 {
Matt Arsenault45f82162016-07-11 23:35:48 +000062 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenaultf639c322016-01-28 20:53:42 +000063 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
64 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
65 %a = load float, float addrspace(1)* %gep0
66
67 %max = call float @llvm.maxnum.f32(float %a, float 2.0)
68 %med = call float @llvm.minnum.f32(float 4.0, float %max)
69
70 store float %med, float addrspace(1)* %outgep
71 ret void
72}
73
74; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_constant_order_f32:
75; GCN: v_max_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}}
76; GCN: v_min_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}}
77define void @v_test_fmed3_r_i_i_constant_order_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 {
Matt Arsenault45f82162016-07-11 23:35:48 +000078 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenaultf639c322016-01-28 20:53:42 +000079 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
80 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
81 %a = load float, float addrspace(1)* %gep0
82
83 %max = call float @llvm.maxnum.f32(float %a, float 4.0)
84 %med = call float @llvm.minnum.f32(float %max, float 2.0)
85
86 store float %med, float addrspace(1)* %outgep
87 ret void
88}
89
90
91; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_multi_use_f32:
92; GCN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}}
93; GCN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}}
94define void @v_test_fmed3_r_i_i_multi_use_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 {
Matt Arsenault45f82162016-07-11 23:35:48 +000095 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenaultf639c322016-01-28 20:53:42 +000096 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
97 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
98 %a = load float, float addrspace(1)* %gep0
99
100 %max = call float @llvm.maxnum.f32(float %a, float 2.0)
101 %med = call float @llvm.minnum.f32(float %max, float 4.0)
102
103 store volatile float %med, float addrspace(1)* %outgep
104 store volatile float %max, float addrspace(1)* %outgep
105 ret void
106}
107
108; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_f64:
Matt Arsenault3d1c1de2016-04-14 21:58:24 +0000109; GCN: v_max_f64 {{v\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}}, 2.0
110; GCN: v_min_f64 {{v\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}}, 4.0
Matt Arsenaultf639c322016-01-28 20:53:42 +0000111define void @v_test_fmed3_r_i_i_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #1 {
Matt Arsenault45f82162016-07-11 23:35:48 +0000112 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenaultf639c322016-01-28 20:53:42 +0000113 %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid
114 %outgep = getelementptr double, double addrspace(1)* %out, i32 %tid
115 %a = load double, double addrspace(1)* %gep0
116
117 %max = call double @llvm.maxnum.f64(double %a, double 2.0)
118 %med = call double @llvm.minnum.f64(double %max, double 4.0)
119
120 store double %med, double addrspace(1)* %outgep
121 ret void
122}
123
124; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_no_nans_f32:
125; GCN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0
126define void @v_test_fmed3_r_i_i_no_nans_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
Matt Arsenault45f82162016-07-11 23:35:48 +0000127 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenaultf639c322016-01-28 20:53:42 +0000128 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
129 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
130 %a = load float, float addrspace(1)* %gep0
131
132 %max = call float @llvm.maxnum.f32(float %a, float 2.0)
133 %med = call float @llvm.minnum.f32(float %max, float 4.0)
134
135 store float %med, float addrspace(1)* %outgep
136 ret void
137}
138
Matt Arsenault5b39b342016-01-28 20:53:48 +0000139; GCN-LABEL: {{^}}v_test_legacy_fmed3_r_i_i_f32:
140; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0
141
142; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}}
143; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}}
144define void @v_test_legacy_fmed3_r_i_i_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 {
Matt Arsenault45f82162016-07-11 23:35:48 +0000145 %tid = call i32 @llvm.amdgcn.workitem.id.x()
Matt Arsenault5b39b342016-01-28 20:53:48 +0000146 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
147 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
148 %a = load float, float addrspace(1)* %gep0
149
150 ; fmax_legacy
151 %cmp0 = fcmp ule float %a, 2.0
152 %max = select i1 %cmp0, float 2.0, float %a
153
154 ; fmin_legacy
155 %cmp1 = fcmp uge float %max, 4.0
156 %med = select i1 %cmp1, float 4.0, float %max
157
158 store float %med, float addrspace(1)* %outgep
159 ret void
160}
161
Matt Arsenaultf84e5d92017-01-31 03:07:46 +0000162; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat0_srcmod0:
163; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
164; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
165; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
166; GCN: v_med3_f32 v{{[0-9]+}}, -[[A]], [[B]], [[C]]
167define void @v_test_global_nnans_med3_f32_pat0_srcmod0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
168 %tid = call i32 @llvm.amdgcn.workitem.id.x()
169 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
170 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
171 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
172 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
173 %a = load volatile float, float addrspace(1)* %gep0
174 %b = load volatile float, float addrspace(1)* %gep1
175 %c = load volatile float, float addrspace(1)* %gep2
176 %a.fneg = fsub float -0.0, %a
177 %tmp0 = call float @llvm.minnum.f32(float %a.fneg, float %b)
178 %tmp1 = call float @llvm.maxnum.f32(float %a.fneg, float %b)
179 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
180 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
181 store float %med3, float addrspace(1)* %outgep
182 ret void
183}
184
185; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat0_srcmod1:
186; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
187; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
188; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
189; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], -[[B]], [[C]]
190define void @v_test_global_nnans_med3_f32_pat0_srcmod1(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
191 %tid = call i32 @llvm.amdgcn.workitem.id.x()
192 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
193 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
194 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
195 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
196 %a = load volatile float, float addrspace(1)* %gep0
197 %b = load volatile float, float addrspace(1)* %gep1
198 %c = load volatile float, float addrspace(1)* %gep2
199 %b.fneg = fsub float -0.0, %b
200 %tmp0 = call float @llvm.minnum.f32(float %a, float %b.fneg)
201 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b.fneg)
202 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
203 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
204 store float %med3, float addrspace(1)* %outgep
205 ret void
206}
207
208; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat0_srcmod2:
209; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
210; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
211; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
212; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], -[[C]]
213define void @v_test_global_nnans_med3_f32_pat0_srcmod2(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
214 %tid = call i32 @llvm.amdgcn.workitem.id.x()
215 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
216 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
217 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
218 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
219 %a = load volatile float, float addrspace(1)* %gep0
220 %b = load volatile float, float addrspace(1)* %gep1
221 %c = load volatile float, float addrspace(1)* %gep2
222 %c.fneg = fsub float -0.0, %c
223 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
224 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
225 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c.fneg)
226 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
227 store float %med3, float addrspace(1)* %outgep
228 ret void
229}
230
231; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat0_srcmod012:
232; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
233; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
234; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
235; GCN: v_med3_f32 v{{[0-9]+}}, -[[A]], |[[B]]|, -|[[C]]|
236define void @v_test_global_nnans_med3_f32_pat0_srcmod012(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
237 %tid = call i32 @llvm.amdgcn.workitem.id.x()
238 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
239 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
240 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
241 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
242 %a = load volatile float, float addrspace(1)* %gep0
243 %b = load volatile float, float addrspace(1)* %gep1
244 %c = load volatile float, float addrspace(1)* %gep2
245
246 %a.fneg = fsub float -0.0, %a
247 %b.fabs = call float @llvm.fabs.f32(float %b)
248 %c.fabs = call float @llvm.fabs.f32(float %c)
249 %c.fabs.fneg = fsub float -0.0, %c.fabs
250
251 %tmp0 = call float @llvm.minnum.f32(float %a.fneg, float %b.fabs)
252 %tmp1 = call float @llvm.maxnum.f32(float %a.fneg, float %b.fabs)
253 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c.fabs.fneg)
254 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
255
256 store float %med3, float addrspace(1)* %outgep
257 ret void
258}
259
260; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat0_negabs012:
261; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
262; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
263; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
264; GCN: v_med3_f32 v{{[0-9]+}}, -|[[A]]|, -|[[B]]|, -|[[C]]|
265define void @v_test_global_nnans_med3_f32_pat0_negabs012(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
266 %tid = call i32 @llvm.amdgcn.workitem.id.x()
267 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
268 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
269 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
270 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
271 %a = load volatile float, float addrspace(1)* %gep0
272 %b = load volatile float, float addrspace(1)* %gep1
273 %c = load volatile float, float addrspace(1)* %gep2
274
275 %a.fabs = call float @llvm.fabs.f32(float %a)
276 %a.fabs.fneg = fsub float -0.0, %a.fabs
277 %b.fabs = call float @llvm.fabs.f32(float %b)
278 %b.fabs.fneg = fsub float -0.0, %b.fabs
279 %c.fabs = call float @llvm.fabs.f32(float %c)
280 %c.fabs.fneg = fsub float -0.0, %c.fabs
281
282 %tmp0 = call float @llvm.minnum.f32(float %a.fabs.fneg, float %b.fabs.fneg)
283 %tmp1 = call float @llvm.maxnum.f32(float %a.fabs.fneg, float %b.fabs.fneg)
284 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c.fabs.fneg)
285 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
286
287 store float %med3, float addrspace(1)* %outgep
288 ret void
289}
290
291; GCN-LABEL: {{^}}v_nnan_inputs_med3_f32_pat0:
292; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
293; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
294; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
295; GCN-DAG: v_add_f32_e32 [[A_ADD:v[0-9]+]], 1.0, [[A]]
296; GCN-DAG: v_add_f32_e32 [[B_ADD:v[0-9]+]], 2.0, [[B]]
297; GCN-DAG: v_add_f32_e32 [[C_ADD:v[0-9]+]], 4.0, [[C]]
298; GCN: v_med3_f32 v{{[0-9]+}}, [[A_ADD]], [[B_ADD]], [[C_ADD]]
299define void @v_nnan_inputs_med3_f32_pat0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
300 %tid = call i32 @llvm.amdgcn.workitem.id.x()
301 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
302 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
303 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
304 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
305 %a = load volatile float, float addrspace(1)* %gep0
306 %b = load volatile float, float addrspace(1)* %gep1
307 %c = load volatile float, float addrspace(1)* %gep2
308
309 %a.nnan = fadd nnan float %a, 1.0
310 %b.nnan = fadd nnan float %b, 2.0
311 %c.nnan = fadd nnan float %c, 4.0
312
313 %tmp0 = call float @llvm.minnum.f32(float %a.nnan, float %b.nnan)
314 %tmp1 = call float @llvm.maxnum.f32(float %a.nnan, float %b.nnan)
315 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c.nnan)
316 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
317 store float %med3, float addrspace(1)* %outgep
318 ret void
319}
320
321; 16 combinations
322
323; 0: max(min(x, y), min(max(x, y), z))
324; 1: max(min(x, y), min(max(y, x), z))
325; 2: max(min(x, y), min(z, max(x, y)))
326; 3: max(min(x, y), min(z, max(y, x)))
327; 4: max(min(y, x), min(max(x, y), z))
328; 5: max(min(y, x), min(max(y, x), z))
329; 6: max(min(y, x), min(z, max(x, y)))
330; 7: max(min(y, x), min(z, max(y, x)))
331;
332; + commute outermost max
333
334; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat0:
335; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
336; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
337; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
338; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], [[C]]
339define void @v_test_global_nnans_med3_f32_pat0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
340 %tid = call i32 @llvm.amdgcn.workitem.id.x()
341 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
342 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
343 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
344 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
345 %a = load volatile float, float addrspace(1)* %gep0
346 %b = load volatile float, float addrspace(1)* %gep1
347 %c = load volatile float, float addrspace(1)* %gep2
348 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
349 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
350 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
351 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
352 store float %med3, float addrspace(1)* %outgep
353 ret void
354}
355
356; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat1:
357; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
358; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
359; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
360; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], [[C]]
361define void @v_test_global_nnans_med3_f32_pat1(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
362 %tid = call i32 @llvm.amdgcn.workitem.id.x()
363 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
364 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
365 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
366 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
367 %a = load volatile float, float addrspace(1)* %gep0
368 %b = load volatile float, float addrspace(1)* %gep1
369 %c = load volatile float, float addrspace(1)* %gep2
370 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
371 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
372 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
373 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
374 store float %med3, float addrspace(1)* %outgep
375 ret void
376}
377
378; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat2:
379; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
380; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
381; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
382; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], [[C]]
383define void @v_test_global_nnans_med3_f32_pat2(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
384 %tid = call i32 @llvm.amdgcn.workitem.id.x()
385 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
386 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
387 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
388 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
389 %a = load volatile float, float addrspace(1)* %gep0
390 %b = load volatile float, float addrspace(1)* %gep1
391 %c = load volatile float, float addrspace(1)* %gep2
392 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
393 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
394 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
395 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
396 store float %med3, float addrspace(1)* %outgep
397 ret void
398}
399
400; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat3:
401; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
402; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
403; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
404; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], [[C]]
405define void @v_test_global_nnans_med3_f32_pat3(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
406 %tid = call i32 @llvm.amdgcn.workitem.id.x()
407 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
408 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
409 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
410 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
411 %a = load volatile float, float addrspace(1)* %gep0
412 %b = load volatile float, float addrspace(1)* %gep1
413 %c = load volatile float, float addrspace(1)* %gep2
414 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
415 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
416 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
417 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
418 store float %med3, float addrspace(1)* %outgep
419 ret void
420}
421
422; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat4:
423; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
424; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
425; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
426; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
427define void @v_test_global_nnans_med3_f32_pat4(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
428 %tid = call i32 @llvm.amdgcn.workitem.id.x()
429 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
430 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
431 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
432 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
433 %a = load volatile float, float addrspace(1)* %gep0
434 %b = load volatile float, float addrspace(1)* %gep1
435 %c = load volatile float, float addrspace(1)* %gep2
436 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
437 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
438 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
439 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
440 store float %med3, float addrspace(1)* %outgep
441 ret void
442}
443
444; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat5:
445; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
446; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
447; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
448; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
449define void @v_test_global_nnans_med3_f32_pat5(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
450 %tid = call i32 @llvm.amdgcn.workitem.id.x()
451 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
452 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
453 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
454 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
455 %a = load volatile float, float addrspace(1)* %gep0
456 %b = load volatile float, float addrspace(1)* %gep1
457 %c = load volatile float, float addrspace(1)* %gep2
458 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
459 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
460 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
461 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
462 store float %med3, float addrspace(1)* %outgep
463 ret void
464}
465
466; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat6:
467; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
468; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
469; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
470; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
471define void @v_test_global_nnans_med3_f32_pat6(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
472 %tid = call i32 @llvm.amdgcn.workitem.id.x()
473 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
474 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
475 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
476 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
477 %a = load volatile float, float addrspace(1)* %gep0
478 %b = load volatile float, float addrspace(1)* %gep1
479 %c = load volatile float, float addrspace(1)* %gep2
480 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
481 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
482 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
483 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
484 store float %med3, float addrspace(1)* %outgep
485 ret void
486}
487
488; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat7:
489; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
490; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
491; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
492; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
493define void @v_test_global_nnans_med3_f32_pat7(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
494 %tid = call i32 @llvm.amdgcn.workitem.id.x()
495 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
496 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
497 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
498 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
499 %a = load volatile float, float addrspace(1)* %gep0
500 %b = load volatile float, float addrspace(1)* %gep1
501 %c = load volatile float, float addrspace(1)* %gep2
502 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
503 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
504 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
505 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
506 store float %med3, float addrspace(1)* %outgep
507 ret void
508}
509
510; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat8:
511; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
512; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
513; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
514; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], [[C]]
515define void @v_test_global_nnans_med3_f32_pat8(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
516 %tid = call i32 @llvm.amdgcn.workitem.id.x()
517 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
518 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
519 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
520 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
521 %a = load volatile float, float addrspace(1)* %gep0
522 %b = load volatile float, float addrspace(1)* %gep1
523 %c = load volatile float, float addrspace(1)* %gep2
524 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
525 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
526 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
527 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
528 store float %med3, float addrspace(1)* %outgep
529 ret void
530}
531
532; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat9:
533; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
534; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
535; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
536; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
537define void @v_test_global_nnans_med3_f32_pat9(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
538 %tid = call i32 @llvm.amdgcn.workitem.id.x()
539 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
540 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
541 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
542 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
543 %a = load volatile float, float addrspace(1)* %gep0
544 %b = load volatile float, float addrspace(1)* %gep1
545 %c = load volatile float, float addrspace(1)* %gep2
546 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
547 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
548 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
549 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
550 store float %med3, float addrspace(1)* %outgep
551 ret void
552}
553
554; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat10:
555; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
556; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
557; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
558; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], [[C]]
559define void @v_test_global_nnans_med3_f32_pat10(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
560 %tid = call i32 @llvm.amdgcn.workitem.id.x()
561 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
562 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
563 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
564 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
565 %a = load volatile float, float addrspace(1)* %gep0
566 %b = load volatile float, float addrspace(1)* %gep1
567 %c = load volatile float, float addrspace(1)* %gep2
568 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
569 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
570 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
571 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
572 store float %med3, float addrspace(1)* %outgep
573 ret void
574}
575
576; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat11:
577; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
578; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
579; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
580; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
581define void @v_test_global_nnans_med3_f32_pat11(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
582 %tid = call i32 @llvm.amdgcn.workitem.id.x()
583 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
584 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
585 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
586 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
587 %a = load volatile float, float addrspace(1)* %gep0
588 %b = load volatile float, float addrspace(1)* %gep1
589 %c = load volatile float, float addrspace(1)* %gep2
590 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
591 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
592 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
593 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
594 store float %med3, float addrspace(1)* %outgep
595 ret void
596}
597
598; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat12:
599; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
600; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
601; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
602; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
603define void @v_test_global_nnans_med3_f32_pat12(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
604 %tid = call i32 @llvm.amdgcn.workitem.id.x()
605 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
606 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
607 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
608 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
609 %a = load volatile float, float addrspace(1)* %gep0
610 %b = load volatile float, float addrspace(1)* %gep1
611 %c = load volatile float, float addrspace(1)* %gep2
612 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
613 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
614 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
615 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
616 store float %med3, float addrspace(1)* %outgep
617 ret void
618}
619
620; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat13:
621; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
622; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
623; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
624; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
625define void @v_test_global_nnans_med3_f32_pat13(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
626 %tid = call i32 @llvm.amdgcn.workitem.id.x()
627 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
628 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
629 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
630 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
631 %a = load volatile float, float addrspace(1)* %gep0
632 %b = load volatile float, float addrspace(1)* %gep1
633 %c = load volatile float, float addrspace(1)* %gep2
634 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
635 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
636 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
637 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
638 store float %med3, float addrspace(1)* %outgep
639 ret void
640}
641
642; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat14:
643; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
644; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
645; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
646; GCN: v_med3_f32 v{{[0-9]+}}, [[A]], [[B]], [[C]]
647define void @v_test_global_nnans_med3_f32_pat14(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
648 %tid = call i32 @llvm.amdgcn.workitem.id.x()
649 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
650 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
651 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
652 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
653 %a = load volatile float, float addrspace(1)* %gep0
654 %b = load volatile float, float addrspace(1)* %gep1
655 %c = load volatile float, float addrspace(1)* %gep2
656 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
657 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
658 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
659 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
660 store float %med3, float addrspace(1)* %outgep
661 ret void
662}
663
664; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat15:
665; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
666; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
667; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
668; GCN: v_med3_f32 v{{[0-9]+}}, [[B]], [[A]], [[C]]
669define void @v_test_global_nnans_med3_f32_pat15(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
670 %tid = call i32 @llvm.amdgcn.workitem.id.x()
671 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
672 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
673 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
674 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
675 %a = load volatile float, float addrspace(1)* %gep0
676 %b = load volatile float, float addrspace(1)* %gep1
677 %c = load volatile float, float addrspace(1)* %gep2
678 %tmp0 = call float @llvm.minnum.f32(float %b, float %a)
679 %tmp1 = call float @llvm.maxnum.f32(float %b, float %a)
680 %tmp2 = call float @llvm.minnum.f32(float %c, float %tmp1)
681 %med3 = call float @llvm.maxnum.f32(float %tmp2, float %tmp0)
682 store float %med3, float addrspace(1)* %outgep
683 ret void
684}
685
686; ---------------------------------------------------------------------
687; Negative patterns
688; ---------------------------------------------------------------------
689
690; GCN-LABEL: {{^}}v_test_safe_med3_f32_pat0_multi_use0:
691; GCN: v_min_f32
692; GCN: v_max_f32
693; GCN: v_min_f32
694; GCN: v_max_f32
695define void @v_test_safe_med3_f32_pat0_multi_use0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
696 %tid = call i32 @llvm.amdgcn.workitem.id.x()
697 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
698 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
699 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
700 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
701 %a = load volatile float, float addrspace(1)* %gep0
702 %b = load volatile float, float addrspace(1)* %gep1
703 %c = load volatile float, float addrspace(1)* %gep2
704 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
705 store volatile float %tmp0, float addrspace(1)* undef
706 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
707 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
708 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
709 store float %med3, float addrspace(1)* %outgep
710 ret void
711}
712
713; GCN-LABEL: {{^}}v_test_safe_med3_f32_pat0_multi_use1:
714define void @v_test_safe_med3_f32_pat0_multi_use1(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
715 %tid = call i32 @llvm.amdgcn.workitem.id.x()
716 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
717 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
718 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
719 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
720 %a = load volatile float, float addrspace(1)* %gep0
721 %b = load volatile float, float addrspace(1)* %gep1
722 %c = load volatile float, float addrspace(1)* %gep2
723 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
724 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
725 store volatile float %tmp1, float addrspace(1)* undef
726 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
727 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
728 store float %med3, float addrspace(1)* %outgep
729 ret void
730}
731
732; GCN-LABEL: {{^}}v_test_safe_med3_f32_pat0_multi_use2:
733define void @v_test_safe_med3_f32_pat0_multi_use2(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
734 %tid = call i32 @llvm.amdgcn.workitem.id.x()
735 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
736 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
737 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
738 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
739 %a = load volatile float, float addrspace(1)* %gep0
740 %b = load volatile float, float addrspace(1)* %gep1
741 %c = load volatile float, float addrspace(1)* %gep2
742 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
743 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
744 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
745 store volatile float %tmp2, float addrspace(1)* undef
746 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
747 store float %med3, float addrspace(1)* %outgep
748 ret void
749}
750
751
752; GCN-LABEL: {{^}}v_test_safe_med3_f32_pat0:
753define void @v_test_safe_med3_f32_pat0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
754 %tid = call i32 @llvm.amdgcn.workitem.id.x()
755 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
756 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
757 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
758 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
759 %a = load volatile float, float addrspace(1)* %gep0
760 %b = load volatile float, float addrspace(1)* %gep1
761 %c = load volatile float, float addrspace(1)* %gep2
762 %tmp0 = call float @llvm.minnum.f32(float %a, float %b)
763 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
764 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
765 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
766 store float %med3, float addrspace(1)* %outgep
767 ret void
768}
769
770; GCN-LABEL: {{^}}v_nnan_inputs_missing0_med3_f32_pat0:
771define void @v_nnan_inputs_missing0_med3_f32_pat0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
772 %tid = call i32 @llvm.amdgcn.workitem.id.x()
773 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
774 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
775 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
776 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
777 %a = load volatile float, float addrspace(1)* %gep0
778 %b = load volatile float, float addrspace(1)* %gep1
779 %c = load volatile float, float addrspace(1)* %gep2
780
781 %a.nnan = fadd float %a, 1.0
782 %b.nnan = fadd nnan float %b, 2.0
783 %c.nnan = fadd nnan float %c, 4.0
784
785 %tmp0 = call float @llvm.minnum.f32(float %a.nnan, float %b.nnan)
786 %tmp1 = call float @llvm.maxnum.f32(float %a.nnan, float %b.nnan)
787 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c.nnan)
788 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
789 store float %med3, float addrspace(1)* %outgep
790 ret void
791}
792
793; GCN-LABEL: {{^}}v_nnan_inputs_missing1_med3_f32_pat0:
794define void @v_nnan_inputs_missing1_med3_f32_pat0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
795 %tid = call i32 @llvm.amdgcn.workitem.id.x()
796 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
797 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
798 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
799 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
800 %a = load volatile float, float addrspace(1)* %gep0
801 %b = load volatile float, float addrspace(1)* %gep1
802 %c = load volatile float, float addrspace(1)* %gep2
803
804 %a.nnan = fadd nnan float %a, 1.0
805 %b.nnan = fadd float %b, 2.0
806 %c.nnan = fadd nnan float %c, 4.0
807
808 %tmp0 = call float @llvm.minnum.f32(float %a.nnan, float %b.nnan)
809 %tmp1 = call float @llvm.maxnum.f32(float %a.nnan, float %b.nnan)
810 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c.nnan)
811 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
812 store float %med3, float addrspace(1)* %outgep
813 ret void
814}
815
816; GCN-LABEL: {{^}}v_nnan_inputs_missing2_med3_f32_pat0:
817define void @v_nnan_inputs_missing2_med3_f32_pat0(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #1 {
818 %tid = call i32 @llvm.amdgcn.workitem.id.x()
819 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
820 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
821 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
822 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
823 %a = load volatile float, float addrspace(1)* %gep0
824 %b = load volatile float, float addrspace(1)* %gep1
825 %c = load volatile float, float addrspace(1)* %gep2
826
827 %a.nnan = fadd nnan float %a, 1.0
828 %b.nnan = fadd nnan float %b, 2.0
829 %c.nnan = fadd float %c, 4.0
830
831 %tmp0 = call float @llvm.minnum.f32(float %a.nnan, float %b.nnan)
832 %tmp1 = call float @llvm.maxnum.f32(float %a.nnan, float %b.nnan)
833 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c.nnan)
834 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
835 store float %med3, float addrspace(1)* %outgep
836 ret void
837}
838
839; GCN-LABEL: {{^}}v_test_global_nnans_med3_f32_pat0_srcmod0_mismatch:
840; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
841; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
842; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
843; GCN: v_min_f32
844; GCN: v_max_f32
845; GCN: v_min_f32
846; GCN: v_max_f32
847define void @v_test_global_nnans_med3_f32_pat0_srcmod0_mismatch(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
848 %tid = call i32 @llvm.amdgcn.workitem.id.x()
849 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
850 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
851 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
852 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
853 %a = load volatile float, float addrspace(1)* %gep0
854 %b = load volatile float, float addrspace(1)* %gep1
855 %c = load volatile float, float addrspace(1)* %gep2
856 %a.fneg = fsub float -0.0, %a
857 %tmp0 = call float @llvm.minnum.f32(float %a.fneg, float %b)
858 %tmp1 = call float @llvm.maxnum.f32(float %a, float %b)
859 %tmp2 = call float @llvm.minnum.f32(float %tmp1, float %c)
860 %med3 = call float @llvm.maxnum.f32(float %tmp0, float %tmp2)
861 store float %med3, float addrspace(1)* %outgep
862 ret void
863}
864
865; A simple min and max is not sufficient
866; GCN-LABEL: {{^}}v_test_global_nnans_min_max_f32:
867; GCN: {{buffer_|flat_}}load_dword [[A:v[0-9]+]]
868; GCN: {{buffer_|flat_}}load_dword [[B:v[0-9]+]]
869; GCN: {{buffer_|flat_}}load_dword [[C:v[0-9]+]]
870; GCN: v_max_f32_e32 [[MAX:v[0-9]+]], [[B]], [[A]]
871; GCN: v_min_f32_e32 v{{[0-9]+}}, [[C]], [[MAX]]
872define void @v_test_global_nnans_min_max_f32(float addrspace(1)* %out, float addrspace(1)* %aptr, float addrspace(1)* %bptr, float addrspace(1)* %cptr) #2 {
873 %tid = call i32 @llvm.amdgcn.workitem.id.x()
874 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
875 %gep1 = getelementptr float, float addrspace(1)* %bptr, i32 %tid
876 %gep2 = getelementptr float, float addrspace(1)* %cptr, i32 %tid
877 %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid
878 %a = load volatile float, float addrspace(1)* %gep0
879 %b = load volatile float, float addrspace(1)* %gep1
880 %c = load volatile float, float addrspace(1)* %gep2
881 %max = call float @llvm.maxnum.f32(float %a, float %b)
882 %minmax = call float @llvm.minnum.f32(float %max, float %c)
883 store float %minmax, float addrspace(1)* %outgep
884 ret void
885}
886
887declare i32 @llvm.amdgcn.workitem.id.x() #0
888declare float @llvm.fabs.f32(float) #0
889declare float @llvm.minnum.f32(float, float) #0
890declare float @llvm.maxnum.f32(float, float) #0
891declare double @llvm.minnum.f64(double, double) #0
892declare double @llvm.maxnum.f64(double, double) #0
893
Matt Arsenaultf639c322016-01-28 20:53:42 +0000894attributes #0 = { nounwind readnone }
895attributes #1 = { nounwind "unsafe-fp-math"="false" "no-nans-fp-math"="false" }
896attributes #2 = { nounwind "unsafe-fp-math"="false" "no-nans-fp-math"="true" }