1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GCN %s
3
4; Mostly overlaps with fmed3.ll to stress specific cases of
5; isKnownNeverSNaN.
6
7define float @v_test_known_not_snan_fabs_input_fmed3_r_i_i_f32(float %a) #0 {
8; GCN-LABEL: v_test_known_not_snan_fabs_input_fmed3_r_i_i_f32:
9; GCN:       ; %bb.0:
10; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
11; GCN-NEXT:    v_rcp_f32_e32 v0, v0
12; GCN-NEXT:    v_med3_f32 v0, |v0|, 2.0, 4.0
13; GCN-NEXT:    s_setpc_b64 s[30:31]
14  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
15  %known.not.snan = call float @llvm.fabs.f32(float %a.nnan.add)
16  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
17  %med = call float @llvm.minnum.f32(float %max, float 4.0)
18  ret float %med
19}
20
21define float @v_test_known_not_snan_fneg_input_fmed3_r_i_i_f32(float %a) #0 {
22; GCN-LABEL: v_test_known_not_snan_fneg_input_fmed3_r_i_i_f32:
23; GCN:       ; %bb.0:
24; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
25; GCN-NEXT:    v_rcp_f32_e32 v0, v0
26; GCN-NEXT:    v_med3_f32 v0, -v0, 2.0, 4.0
27; GCN-NEXT:    s_setpc_b64 s[30:31]
28  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
29  %known.not.snan = fneg float %a.nnan.add
30  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
31  %med = call float @llvm.minnum.f32(float %max, float 4.0)
32  ret float %med
33}
34
35define float @v_test_known_not_snan_fpext_input_fmed3_r_i_i_f32(half %a) #0 {
36; GCN-LABEL: v_test_known_not_snan_fpext_input_fmed3_r_i_i_f32:
37; GCN:       ; %bb.0:
38; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
39; GCN-NEXT:    v_add_f16_e32 v0, 1.0, v0
40; GCN-NEXT:    v_cvt_f32_f16_e32 v0, v0
41; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
42; GCN-NEXT:    s_setpc_b64 s[30:31]
43  %a.nnan.add = fadd nnan half %a, 1.0
44  %known.not.snan = fpext half %a.nnan.add to float
45  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
46  %med = call float @llvm.minnum.f32(float %max, float 4.0)
47  ret float %med
48}
49
50define float @v_test_known_not_snan_fptrunc_input_fmed3_r_i_i_f32(double %a) #0 {
51; GCN-LABEL: v_test_known_not_snan_fptrunc_input_fmed3_r_i_i_f32:
52; GCN:       ; %bb.0:
53; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
54; GCN-NEXT:    v_add_f64 v[0:1], v[0:1], 1.0
55; GCN-NEXT:    v_cvt_f32_f64_e32 v0, v[0:1]
56; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
57; GCN-NEXT:    s_setpc_b64 s[30:31]
58  %a.nnan.add = fadd nnan double %a, 1.0
59  %known.not.snan = fptrunc double %a.nnan.add to float
60  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
61  %med = call float @llvm.minnum.f32(float %max, float 4.0)
62  ret float %med
63}
64
65define float @v_test_known_not_snan_copysign_input_fmed3_r_i_i_f32(float %a, float %sign) #0 {
66; GCN-LABEL: v_test_known_not_snan_copysign_input_fmed3_r_i_i_f32:
67; GCN:       ; %bb.0:
68; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
69; GCN-NEXT:    v_rcp_f32_e32 v0, v0
70; GCN-NEXT:    s_brev_b32 s4, -2
71; GCN-NEXT:    v_bfi_b32 v0, s4, v0, v1
72; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
73; GCN-NEXT:    s_setpc_b64 s[30:31]
74  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
75  %known.not.snan = call float @llvm.copysign.f32(float %a.nnan.add, float %sign)
76  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
77  %med = call float @llvm.minnum.f32(float %max, float 4.0)
78  ret float %med
79}
80
81; Canonicalize always quiets, so nothing is necessary.
82define float @v_test_known_canonicalize_input_fmed3_r_i_i_f32(float %a) #0 {
83; GCN-LABEL: v_test_known_canonicalize_input_fmed3_r_i_i_f32:
84; GCN:       ; %bb.0:
85; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
86; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v0
87; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
88; GCN-NEXT:    s_setpc_b64 s[30:31]
89  %known.not.snan = call float @llvm.canonicalize.f32(float %a)
90  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
91  %med = call float @llvm.minnum.f32(float %max, float 4.0)
92  ret float %med
93}
94
95define float @v_test_known_not_snan_minnum_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
96; GCN-LABEL: v_test_known_not_snan_minnum_input_fmed3_r_i_i_f32:
97; GCN:       ; %bb.0:
98; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
99; GCN-NEXT:    v_rcp_f32_e32 v0, v0
100; GCN-NEXT:    v_add_f32_e32 v1, 1.0, v1
101; GCN-NEXT:    v_min_f32_e32 v0, v0, v1
102; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
103; GCN-NEXT:    s_setpc_b64 s[30:31]
104  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
105  %b.nnan.add = fadd nnan float %b, 1.0
106  %known.not.snan = call float @llvm.minnum.f32(float %a.nnan.add, float %b.nnan.add)
107  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
108  %med = call float @llvm.minnum.f32(float %max, float 4.0)
109  ret float %med
110}
111
112define float @v_test_known_not_minnum_maybe_nan_src0_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
113; GCN-LABEL: v_test_known_not_minnum_maybe_nan_src0_input_fmed3_r_i_i_f32:
114; GCN:       ; %bb.0:
115; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
116; GCN-NEXT:    v_add_f32_e32 v1, 1.0, v1
117; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v0
118; GCN-NEXT:    v_min_f32_e32 v0, v0, v1
119; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
120; GCN-NEXT:    s_setpc_b64 s[30:31]
121  %b.nsnan = fadd float %b, 1.0
122  %known.not.snan = call float @llvm.minnum.f32(float %a, float %b.nsnan)
123  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
124  %med = call float @llvm.minnum.f32(float %max, float 4.0)
125  ret float %med
126}
127
128define float @v_test_known_not_minnum_maybe_nan_src1_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
129; GCN-LABEL: v_test_known_not_minnum_maybe_nan_src1_input_fmed3_r_i_i_f32:
130; GCN:       ; %bb.0:
131; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
132; GCN-NEXT:    v_add_f32_e32 v0, 1.0, v0
133; GCN-NEXT:    v_mul_f32_e32 v1, 1.0, v1
134; GCN-NEXT:    v_min_f32_e32 v0, v0, v1
135; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
136; GCN-NEXT:    s_setpc_b64 s[30:31]
137  %a.nsnan = fadd float %a, 1.0
138  %known.not.snan = call float @llvm.minnum.f32(float %a.nsnan, float %b)
139  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
140  %med = call float @llvm.minnum.f32(float %max, float 4.0)
141  ret float %med
142}
143
144define float @v_minnum_possible_nan_lhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
145; GCN-LABEL: v_minnum_possible_nan_lhs_input_fmed3_r_i_i_f32:
146; GCN:       ; %bb.0:
147; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
148; GCN-NEXT:    v_add_f32_e32 v1, 1.0, v1
149; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v0
150; GCN-NEXT:    v_min_f32_e32 v0, v0, v1
151; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
152; GCN-NEXT:    s_setpc_b64 s[30:31]
153  %b.nnan.add = fadd nnan float %b, 1.0
154  %known.not.snan = call float @llvm.minnum.f32(float %a, float %b.nnan.add)
155  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
156  %med = call float @llvm.minnum.f32(float %max, float 4.0)
157  ret float %med
158}
159
160define float @v_minnum_possible_nan_rhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
161; GCN-LABEL: v_minnum_possible_nan_rhs_input_fmed3_r_i_i_f32:
162; GCN:       ; %bb.0:
163; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
164; GCN-NEXT:    v_rcp_f32_e32 v0, v0
165; GCN-NEXT:    v_mul_f32_e32 v1, 1.0, v1
166; GCN-NEXT:    v_min_f32_e32 v0, v0, v1
167; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
168; GCN-NEXT:    s_setpc_b64 s[30:31]
169  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
170  %known.not.snan = call float @llvm.minnum.f32(float %a.nnan.add, float %b)
171  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
172  %med = call float @llvm.minnum.f32(float %max, float 4.0)
173  ret float %med
174}
175
176define float @v_test_known_not_snan_maxnum_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
177; GCN-LABEL: v_test_known_not_snan_maxnum_input_fmed3_r_i_i_f32:
178; GCN:       ; %bb.0:
179; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
180; GCN-NEXT:    v_rcp_f32_e32 v0, v0
181; GCN-NEXT:    v_add_f32_e32 v1, 1.0, v1
182; GCN-NEXT:    v_max_f32_e32 v0, v0, v1
183; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
184; GCN-NEXT:    s_setpc_b64 s[30:31]
185  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
186  %b.nnan.add = fadd nnan float %b, 1.0
187  %known.not.snan = call float @llvm.maxnum.f32(float %a.nnan.add, float %b.nnan.add)
188  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
189  %med = call float @llvm.minnum.f32(float %max, float 4.0)
190  ret float %med
191}
192
193define float @v_maxnum_possible_nan_lhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
194; GCN-LABEL: v_maxnum_possible_nan_lhs_input_fmed3_r_i_i_f32:
195; GCN:       ; %bb.0:
196; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
197; GCN-NEXT:    v_add_f32_e32 v1, 1.0, v1
198; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v0
199; GCN-NEXT:    v_max_f32_e32 v0, v0, v1
200; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
201; GCN-NEXT:    s_setpc_b64 s[30:31]
202  %b.nnan.add = fadd nnan float %b, 1.0
203  %known.not.snan = call float @llvm.maxnum.f32(float %a, float %b.nnan.add)
204  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
205  %med = call float @llvm.minnum.f32(float %max, float 4.0)
206  ret float %med
207}
208
209define float @v_maxnum_possible_nan_rhs_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
210; GCN-LABEL: v_maxnum_possible_nan_rhs_input_fmed3_r_i_i_f32:
211; GCN:       ; %bb.0:
212; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
213; GCN-NEXT:    v_rcp_f32_e32 v0, v0
214; GCN-NEXT:    v_mul_f32_e32 v1, 1.0, v1
215; GCN-NEXT:    v_max_f32_e32 v0, v0, v1
216; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
217; GCN-NEXT:    s_setpc_b64 s[30:31]
218  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
219  %known.not.snan = call float @llvm.maxnum.f32(float %a.nnan.add, float %b)
220  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
221  %med = call float @llvm.minnum.f32(float %max, float 4.0)
222  ret float %med
223}
224
225define float @v_test_known_not_snan_select_input_fmed3_r_i_i_f32(float %a, float %b, i32 %c) #0 {
226; GCN-LABEL: v_test_known_not_snan_select_input_fmed3_r_i_i_f32:
227; GCN:       ; %bb.0:
228; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
229; GCN-NEXT:    v_rcp_f32_e32 v0, v0
230; GCN-NEXT:    v_add_f32_e32 v1, 1.0, v1
231; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2
232; GCN-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
233; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
234; GCN-NEXT:    s_setpc_b64 s[30:31]
235  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
236  %b.nnan.add = fadd nnan float %b, 1.0
237  %cmp = icmp eq i32 %c, 0
238  %known.not.snan = select i1 %cmp, float %a.nnan.add, float %b.nnan.add
239  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
240  %med = call float @llvm.minnum.f32(float %max, float 4.0)
241  ret float %med
242}
243
244define float @v_select_possible_nan_lhs_input_fmed3_r_i_i_f32(float %a, float %b, i32 %c) #0 {
245; GCN-LABEL: v_select_possible_nan_lhs_input_fmed3_r_i_i_f32:
246; GCN:       ; %bb.0:
247; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
248; GCN-NEXT:    v_add_f32_e32 v1, 1.0, v1
249; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2
250; GCN-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
251; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v0
252; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
253; GCN-NEXT:    s_setpc_b64 s[30:31]
254  %b.nnan.add = fadd nnan float %b, 1.0
255  %cmp = icmp eq i32 %c, 0
256  %known.not.snan = select i1 %cmp, float %a, float %b.nnan.add
257  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
258  %med = call float @llvm.minnum.f32(float %max, float 4.0)
259  ret float %med
260}
261
262define float @v_select_possible_nan_rhs_input_fmed3_r_i_i_f32(float %a, float %b, i32 %c) #0 {
263; GCN-LABEL: v_select_possible_nan_rhs_input_fmed3_r_i_i_f32:
264; GCN:       ; %bb.0:
265; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
266; GCN-NEXT:    v_rcp_f32_e32 v0, v0
267; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2
268; GCN-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
269; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v0
270; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
271; GCN-NEXT:    s_setpc_b64 s[30:31]
272  %a.nnan.add = fdiv nnan float 1.0, %a, !fpmath !0
273  %cmp = icmp eq i32 %c, 0
274  %known.not.snan = select i1 %cmp, float %a.nnan.add, float %b
275  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
276  %med = call float @llvm.minnum.f32(float %max, float 4.0)
277  ret float %med
278}
279
280define float @v_test_known_not_snan_fadd_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
281; GCN-LABEL: v_test_known_not_snan_fadd_input_fmed3_r_i_i_f32:
282; GCN:       ; %bb.0:
283; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
284; GCN-NEXT:    v_add_f32_e32 v0, v0, v1
285; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
286; GCN-NEXT:    s_setpc_b64 s[30:31]
287  %known.not.snan = fadd float %a, %b
288  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
289  %med = call float @llvm.minnum.f32(float %max, float 4.0)
290  ret float %med
291}
292
293define float @v_test_known_not_snan_fsub_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
294; GCN-LABEL: v_test_known_not_snan_fsub_input_fmed3_r_i_i_f32:
295; GCN:       ; %bb.0:
296; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
297; GCN-NEXT:    v_sub_f32_e32 v0, v0, v1
298; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
299; GCN-NEXT:    s_setpc_b64 s[30:31]
300  %known.not.snan = fsub float %a, %b
301  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
302  %med = call float @llvm.minnum.f32(float %max, float 4.0)
303  ret float %med
304}
305
306define float @v_test_known_not_snan_fmul_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
307; GCN-LABEL: v_test_known_not_snan_fmul_input_fmed3_r_i_i_f32:
308; GCN:       ; %bb.0:
309; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
310; GCN-NEXT:    v_mul_f32_e32 v0, v0, v1
311; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
312; GCN-NEXT:    s_setpc_b64 s[30:31]
313  %known.not.snan = fmul float %a, %b
314  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
315  %med = call float @llvm.minnum.f32(float %max, float 4.0)
316  ret float %med
317}
318
319define float @v_test_known_not_snan_uint_to_fp_input_fmed3_r_i_i_f32(i32 %a) #0 {
320; GCN-LABEL: v_test_known_not_snan_uint_to_fp_input_fmed3_r_i_i_f32:
321; GCN:       ; %bb.0:
322; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
323; GCN-NEXT:    v_cvt_f32_u32_e32 v0, v0
324; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
325; GCN-NEXT:    s_setpc_b64 s[30:31]
326  %known.not.snan = uitofp i32 %a to float
327  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
328  %med = call float @llvm.minnum.f32(float %max, float 4.0)
329  ret float %med
330}
331
332define float @v_test_known_not_snan_sint_to_fp_input_fmed3_r_i_i_f32(i32 %a) #0 {
333; GCN-LABEL: v_test_known_not_snan_sint_to_fp_input_fmed3_r_i_i_f32:
334; GCN:       ; %bb.0:
335; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
336; GCN-NEXT:    v_cvt_f32_i32_e32 v0, v0
337; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
338; GCN-NEXT:    s_setpc_b64 s[30:31]
339  %known.not.snan = sitofp i32 %a to float
340  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
341  %med = call float @llvm.minnum.f32(float %max, float 4.0)
342  ret float %med
343}
344
345define float @v_test_known_not_snan_fma_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {
346; GCN-LABEL: v_test_known_not_snan_fma_input_fmed3_r_i_i_f32:
347; GCN:       ; %bb.0:
348; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
349; GCN-NEXT:    v_fma_f32 v0, v0, v1, v2
350; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
351; GCN-NEXT:    s_setpc_b64 s[30:31]
352  %known.not.snan = call float @llvm.fma.f32(float %a, float %b, float %c)
353  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
354  %med = call float @llvm.minnum.f32(float %max, float 4.0)
355  ret float %med
356}
357
358define float @v_test_known_not_snan_fmad_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {
359; GCN-LABEL: v_test_known_not_snan_fmad_input_fmed3_r_i_i_f32:
360; GCN:       ; %bb.0:
361; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
362; GCN-NEXT:    v_mac_f32_e32 v2, v0, v1
363; GCN-NEXT:    v_med3_f32 v0, v2, 2.0, 4.0
364; GCN-NEXT:    s_setpc_b64 s[30:31]
365  %known.not.snan = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
366  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
367  %med = call float @llvm.minnum.f32(float %max, float 4.0)
368  ret float %med
369}
370
371
372define float @v_test_known_not_snan_sin_input_fmed3_r_i_i_f32(float %a) #0 {
373; GCN-LABEL: v_test_known_not_snan_sin_input_fmed3_r_i_i_f32:
374; GCN:       ; %bb.0:
375; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
376; GCN-NEXT:    v_mul_f32_e32 v0, 0.15915494, v0
377; GCN-NEXT:    v_fract_f32_e32 v0, v0
378; GCN-NEXT:    v_sin_f32_e32 v0, v0
379; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
380; GCN-NEXT:    s_setpc_b64 s[30:31]
381  %known.not.snan = call float @llvm.sin.f32(float %a)
382  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
383  %med = call float @llvm.minnum.f32(float %max, float 4.0)
384  ret float %med
385}
386
387define float @v_test_known_not_snan_cos_input_fmed3_r_i_i_f32(float %a) #0 {
388; GCN-LABEL: v_test_known_not_snan_cos_input_fmed3_r_i_i_f32:
389; GCN:       ; %bb.0:
390; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
391; GCN-NEXT:    v_mul_f32_e32 v0, 0.15915494, v0
392; GCN-NEXT:    v_fract_f32_e32 v0, v0
393; GCN-NEXT:    v_cos_f32_e32 v0, v0
394; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
395; GCN-NEXT:    s_setpc_b64 s[30:31]
396  %known.not.snan = call float @llvm.cos.f32(float %a)
397  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
398  %med = call float @llvm.minnum.f32(float %max, float 4.0)
399  ret float %med
400}
401
402define float @v_test_known_not_snan_exp2_input_fmed3_r_i_i_f32(float %a) #0 {
403; GCN-LABEL: v_test_known_not_snan_exp2_input_fmed3_r_i_i_f32:
404; GCN:       ; %bb.0:
405; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
406; GCN-NEXT:    v_exp_f32_e32 v0, v0
407; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
408; GCN-NEXT:    s_setpc_b64 s[30:31]
409  %known.not.snan = call float @llvm.exp2.f32(float %a)
410  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
411  %med = call float @llvm.minnum.f32(float %max, float 4.0)
412  ret float %med
413}
414
415define float @v_test_known_not_snan_trunc_input_fmed3_r_i_i_f32(float %a) #0 {
416; GCN-LABEL: v_test_known_not_snan_trunc_input_fmed3_r_i_i_f32:
417; GCN:       ; %bb.0:
418; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
419; GCN-NEXT:    v_trunc_f32_e32 v0, v0
420; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
421; GCN-NEXT:    s_setpc_b64 s[30:31]
422  %known.not.snan = call float @llvm.trunc.f32(float %a)
423  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
424  %med = call float @llvm.minnum.f32(float %max, float 4.0)
425  ret float %med
426}
427
428define float @v_test_known_not_snan_floor_input_fmed3_r_i_i_f32(float %a) #0 {
429; GCN-LABEL: v_test_known_not_snan_floor_input_fmed3_r_i_i_f32:
430; GCN:       ; %bb.0:
431; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
432; GCN-NEXT:    v_floor_f32_e32 v0, v0
433; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
434; GCN-NEXT:    s_setpc_b64 s[30:31]
435  %known.not.snan = call float @llvm.floor.f32(float %a)
436  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
437  %med = call float @llvm.minnum.f32(float %max, float 4.0)
438  ret float %med
439}
440
441define float @v_test_known_not_snan_ceil_input_fmed3_r_i_i_f32(float %a) #0 {
442; GCN-LABEL: v_test_known_not_snan_ceil_input_fmed3_r_i_i_f32:
443; GCN:       ; %bb.0:
444; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
445; GCN-NEXT:    v_floor_f32_e32 v0, v0
446; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
447; GCN-NEXT:    s_setpc_b64 s[30:31]
448  %known.not.snan = call float @llvm.floor.f32(float %a)
449  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
450  %med = call float @llvm.minnum.f32(float %max, float 4.0)
451  ret float %med
452}
453
454define float @v_test_known_not_snan_round_input_fmed3_r_i_i_f32(float %a) #0 {
455; GCN-LABEL: v_test_known_not_snan_round_input_fmed3_r_i_i_f32:
456; GCN:       ; %bb.0:
457; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
458; GCN-NEXT:    s_brev_b32 s4, -2
459; GCN-NEXT:    v_trunc_f32_e32 v2, v0
460; GCN-NEXT:    v_bfi_b32 v1, s4, 1.0, v0
461; GCN-NEXT:    v_sub_f32_e32 v0, v0, v2
462; GCN-NEXT:    v_cmp_ge_f32_e64 vcc, |v0|, 0.5
463; GCN-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc
464; GCN-NEXT:    v_add_f32_e32 v0, v2, v0
465; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
466; GCN-NEXT:    s_setpc_b64 s[30:31]
467  %known.not.snan = call float @llvm.round.f32(float %a)
468  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
469  %med = call float @llvm.minnum.f32(float %max, float 4.0)
470  ret float %med
471}
472
473define float @v_test_known_not_snan_rint_input_fmed3_r_i_i_f32(float %a) #0 {
474; GCN-LABEL: v_test_known_not_snan_rint_input_fmed3_r_i_i_f32:
475; GCN:       ; %bb.0:
476; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
477; GCN-NEXT:    v_rndne_f32_e32 v0, v0
478; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
479; GCN-NEXT:    s_setpc_b64 s[30:31]
480  %known.not.snan = call float @llvm.rint.f32(float %a)
481  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
482  %med = call float @llvm.minnum.f32(float %max, float 4.0)
483  ret float %med
484}
485
486define float @v_test_known_not_snan_nearbyint_input_fmed3_r_i_i_f32(float %a) #0 {
487; GCN-LABEL: v_test_known_not_snan_nearbyint_input_fmed3_r_i_i_f32:
488; GCN:       ; %bb.0:
489; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
490; GCN-NEXT:    v_rndne_f32_e32 v0, v0
491; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
492; GCN-NEXT:    s_setpc_b64 s[30:31]
493  %known.not.snan = call float @llvm.nearbyint.f32(float %a)
494  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
495  %med = call float @llvm.minnum.f32(float %max, float 4.0)
496  ret float %med
497}
498
499define float @v_test_known_not_snan_fmul_legacy_input_fmed3_r_i_i_f32(float %a, float %b) #0 {
500; GCN-LABEL: v_test_known_not_snan_fmul_legacy_input_fmed3_r_i_i_f32:
501; GCN:       ; %bb.0:
502; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
503; GCN-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
504; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
505; GCN-NEXT:    s_setpc_b64 s[30:31]
506  %known.not.snan = call float @llvm.amdgcn.fmul.legacy(float %a, float %b)
507  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
508  %med = call float @llvm.minnum.f32(float %max, float 4.0)
509  ret float %med
510}
511
512define float @v_test_known_not_snan_ldexp_input_fmed3_r_i_i_f32(float %a, i32 %b) #0 {
513; GCN-LABEL: v_test_known_not_snan_ldexp_input_fmed3_r_i_i_f32:
514; GCN:       ; %bb.0:
515; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
516; GCN-NEXT:    v_ldexp_f32 v0, v0, v1
517; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
518; GCN-NEXT:    s_setpc_b64 s[30:31]
519  %known.not.snan = call float @llvm.amdgcn.ldexp.f32(float %a, i32 %b)
520  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
521  %med = call float @llvm.minnum.f32(float %max, float 4.0)
522  ret float %med
523}
524
525define float @v_test_known_not_snan_fmed3_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {
526; GCN-LABEL: v_test_known_not_snan_fmed3_input_fmed3_r_i_i_f32:
527; GCN:       ; %bb.0:
528; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
529; GCN-NEXT:    v_med3_f32 v0, v0, v1, v2
530; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v0
531; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
532; GCN-NEXT:    s_setpc_b64 s[30:31]
533  %known.not.snan = call float @llvm.amdgcn.fmed3.f32(float %a, float %b, float %c)
534  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
535  %med = call float @llvm.minnum.f32(float %max, float 4.0)
536  ret float %med
537}
538
539define float @v_test_known_not_snan_fmin3_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {
540; GCN-LABEL: v_test_known_not_snan_fmin3_input_fmed3_r_i_i_f32:
541; GCN:       ; %bb.0:
542; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
543; GCN-NEXT:    v_min3_f32 v0, v0, v1, v2
544; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
545; GCN-NEXT:    s_setpc_b64 s[30:31]
546  %min0 = call float @llvm.minnum.f32(float %a, float %b)
547  %known.not.snan = call float @llvm.minnum.f32(float %min0, float %c)
548  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
549  %med = call float @llvm.minnum.f32(float %max, float 4.0)
550  ret float %med
551}
552
553define float @v_test_known_not_snan_cvt_ubyte0_input_fmed3_r_i_i_f32(i8 %char) #0 {
554; GCN-LABEL: v_test_known_not_snan_cvt_ubyte0_input_fmed3_r_i_i_f32:
555; GCN:       ; %bb.0:
556; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
557; GCN-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
558; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
559; GCN-NEXT:    s_setpc_b64 s[30:31]
560  %cvt = uitofp i8 %char to float
561  %max = call float @llvm.maxnum.f32(float %cvt, float 2.0)
562  %med = call float @llvm.minnum.f32(float %max, float 4.0)
563  ret float %med
564}
565
566define float @v_test_not_known_frexp_mant_input_fmed3_r_i_i_f32(float %arg) #0 {
567; GCN-LABEL: v_test_not_known_frexp_mant_input_fmed3_r_i_i_f32:
568; GCN:       ; %bb.0:
569; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
570; GCN-NEXT:    v_frexp_mant_f32_e32 v0, v0
571; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
572; GCN-NEXT:    s_setpc_b64 s[30:31]
573  %known.not.snan = call float @llvm.amdgcn.frexp.mant.f32(float %arg)
574  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
575  %med = call float @llvm.minnum.f32(float %max, float 4.0)
576  ret float %med
577}
578
579define float @v_test_known_not_frexp_mant_input_fmed3_r_i_i_f32(float %arg) #0 {
580; GCN-LABEL: v_test_known_not_frexp_mant_input_fmed3_r_i_i_f32:
581; GCN:       ; %bb.0:
582; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
583; GCN-NEXT:    v_add_f32_e32 v0, 1.0, v0
584; GCN-NEXT:    v_frexp_mant_f32_e32 v0, v0
585; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
586; GCN-NEXT:    s_setpc_b64 s[30:31]
587  %add = fadd float %arg, 1.0
588  %known.not.snan = call float @llvm.amdgcn.frexp.mant.f32(float %add)
589  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
590  %med = call float @llvm.minnum.f32(float %max, float 4.0)
591  ret float %med
592}
593
594define float @v_test_known_not_snan_rcp_input_fmed3_r_i_i_f32(float %a) #0 {
595; GCN-LABEL: v_test_known_not_snan_rcp_input_fmed3_r_i_i_f32:
596; GCN:       ; %bb.0:
597; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
598; GCN-NEXT:    v_rcp_f32_e32 v0, v0
599; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
600; GCN-NEXT:    s_setpc_b64 s[30:31]
601  %known.not.snan = call float @llvm.amdgcn.rcp.f32(float %a)
602  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
603  %med = call float @llvm.minnum.f32(float %max, float 4.0)
604  ret float %med
605}
606define float @v_test_known_not_snan_rsq_input_fmed3_r_i_i_f32(float %a) #0 {
607; GCN-LABEL: v_test_known_not_snan_rsq_input_fmed3_r_i_i_f32:
608; GCN:       ; %bb.0:
609; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
610; GCN-NEXT:    v_rsq_f32_e32 v0, v0
611; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
612; GCN-NEXT:    s_setpc_b64 s[30:31]
613  %known.not.snan = call float @llvm.amdgcn.rsq.f32(float %a)
614  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
615  %med = call float @llvm.minnum.f32(float %max, float 4.0)
616  ret float %med
617}
618
619define float @v_test_known_not_snan_fract_input_fmed3_r_i_i_f32(float %a) #0 {
620; GCN-LABEL: v_test_known_not_snan_fract_input_fmed3_r_i_i_f32:
621; GCN:       ; %bb.0:
622; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
623; GCN-NEXT:    v_fract_f32_e32 v0, v0
624; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
625; GCN-NEXT:    s_setpc_b64 s[30:31]
626  %known.not.snan = call float @llvm.amdgcn.fract.f32(float %a)
627  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
628  %med = call float @llvm.minnum.f32(float %max, float 4.0)
629  ret float %med
630}
631
632define float @v_test_known_not_snan_cubeid_input_fmed3_r_i_i_f32(float %a, float %b, float %c) #0 {
633; GCN-LABEL: v_test_known_not_snan_cubeid_input_fmed3_r_i_i_f32:
634; GCN:       ; %bb.0:
635; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
636; GCN-NEXT:    v_cubeid_f32 v0, v0, v1, v2
637; GCN-NEXT:    v_med3_f32 v0, v0, 2.0, 4.0
638; GCN-NEXT:    s_setpc_b64 s[30:31]
639  %known.not.snan = call float @llvm.amdgcn.cubeid(float %a, float %b, float %c)
640  %max = call float @llvm.maxnum.f32(float %known.not.snan, float 2.0)
641  %med = call float @llvm.minnum.f32(float %max, float 4.0)
642  ret float %med
643}
644
645declare float @llvm.fabs.f32(float) #1
646declare float @llvm.sin.f32(float) #1
647declare float @llvm.cos.f32(float) #1
648declare float @llvm.exp2.f32(float) #1
649declare float @llvm.trunc.f32(float) #1
650declare float @llvm.floor.f32(float) #1
651declare float @llvm.ceil.f32(float) #1
652declare float @llvm.round.f32(float) #1
653declare float @llvm.rint.f32(float) #1
654declare float @llvm.nearbyint.f32(float) #1
655declare float @llvm.canonicalize.f32(float) #1
656declare float @llvm.minnum.f32(float, float) #1
657declare float @llvm.maxnum.f32(float, float) #1
658declare float @llvm.copysign.f32(float, float) #1
659declare float @llvm.fma.f32(float, float, float) #1
660declare float @llvm.fmuladd.f32(float, float, float) #1
661declare float @llvm.amdgcn.ldexp.f32(float, i32) #1
662declare float @llvm.amdgcn.fmul.legacy(float, float) #1
663declare float @llvm.amdgcn.fmed3.f32(float, float, float) #1
664declare float @llvm.amdgcn.frexp.mant.f32(float) #1
665declare float @llvm.amdgcn.rcp.f32(float) #1
666declare float @llvm.amdgcn.rsq.f32(float) #1
667declare float @llvm.amdgcn.fract.f32(float) #1
668declare float @llvm.amdgcn.cubeid(float, float, float) #0
669
670attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
671attributes #1 = { nounwind readnone speculatable }
672
673!0 = !{float 2.500000e+00}
674