• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt -instcombine -S < %s | FileCheck %s
2
3; --------------------------------------------------------------------
4; llvm.amdgcn.rcp
5; --------------------------------------------------------------------
6
7declare float @llvm.amdgcn.rcp.f32(float) nounwind readnone
8declare double @llvm.amdgcn.rcp.f64(double) nounwind readnone
9
10
11; CHECK-LABEL: @test_constant_fold_rcp_f32_1
12; CHECK-NEXT: ret float 1.000000e+00
13define float @test_constant_fold_rcp_f32_1() nounwind {
14  %val = call float @llvm.amdgcn.rcp.f32(float 1.0) nounwind readnone
15  ret float %val
16}
17
18; CHECK-LABEL: @test_constant_fold_rcp_f64_1
19; CHECK-NEXT:  ret double 1.000000e+00
20define double @test_constant_fold_rcp_f64_1() nounwind {
21  %val = call double @llvm.amdgcn.rcp.f64(double 1.0) nounwind readnone
22  ret double %val
23}
24
25; CHECK-LABEL: @test_constant_fold_rcp_f32_half
26; CHECK-NEXT: ret float 2.000000e+00
27define float @test_constant_fold_rcp_f32_half() nounwind {
28  %val = call float @llvm.amdgcn.rcp.f32(float 0.5) nounwind readnone
29  ret float %val
30}
31
32; CHECK-LABEL: @test_constant_fold_rcp_f64_half
33; CHECK-NEXT:  ret double 2.000000e+00
34define double @test_constant_fold_rcp_f64_half() nounwind {
35  %val = call double @llvm.amdgcn.rcp.f64(double 0.5) nounwind readnone
36  ret double %val
37}
38
39; CHECK-LABEL: @test_constant_fold_rcp_f32_43
40; CHECK-NEXT: call float @llvm.amdgcn.rcp.f32(float 4.300000e+01)
41define float @test_constant_fold_rcp_f32_43() nounwind {
42 %val = call float @llvm.amdgcn.rcp.f32(float 4.300000e+01) nounwind readnone
43 ret float %val
44}
45
46; CHECK-LABEL: @test_constant_fold_rcp_f64_43
47; CHECK-NEXT: call double @llvm.amdgcn.rcp.f64(double 4.300000e+01)
48define double @test_constant_fold_rcp_f64_43() nounwind {
49  %val = call double @llvm.amdgcn.rcp.f64(double 4.300000e+01) nounwind readnone
50  ret double %val
51}
52
53
54; --------------------------------------------------------------------
55; llvm.amdgcn.frexp.mant
56; --------------------------------------------------------------------
57
58declare float @llvm.amdgcn.frexp.mant.f32(float) nounwind readnone
59declare double @llvm.amdgcn.frexp.mant.f64(double) nounwind readnone
60
61
62; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_undef(
63; CHECK-NEXT: ret float undef
64define float @test_constant_fold_frexp_mant_f32_undef() nounwind {
65  %val = call float @llvm.amdgcn.frexp.mant.f32(float undef)
66  ret float %val
67}
68
69; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_undef(
70; CHECK-NEXT:  ret double undef
71define double @test_constant_fold_frexp_mant_f64_undef() nounwind {
72  %val = call double @llvm.amdgcn.frexp.mant.f64(double undef)
73  ret double %val
74}
75
76; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_0(
77; CHECK-NEXT: ret float 0.000000e+00
78define float @test_constant_fold_frexp_mant_f32_0() nounwind {
79  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0.0)
80  ret float %val
81}
82
83; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_0(
84; CHECK-NEXT:  ret double 0.000000e+00
85define double @test_constant_fold_frexp_mant_f64_0() nounwind {
86  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0.0)
87  ret double %val
88}
89
90
91; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n0(
92; CHECK-NEXT: ret float -0.000000e+00
93define float @test_constant_fold_frexp_mant_f32_n0() nounwind {
94  %val = call float @llvm.amdgcn.frexp.mant.f32(float -0.0)
95  ret float %val
96}
97
98; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n0(
99; CHECK-NEXT:  ret double -0.000000e+00
100define double @test_constant_fold_frexp_mant_f64_n0() nounwind {
101  %val = call double @llvm.amdgcn.frexp.mant.f64(double -0.0)
102  ret double %val
103}
104
105; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_1(
106; CHECK-NEXT: ret float 5.000000e-01
107define float @test_constant_fold_frexp_mant_f32_1() nounwind {
108  %val = call float @llvm.amdgcn.frexp.mant.f32(float 1.0)
109  ret float %val
110}
111
112; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_1(
113; CHECK-NEXT:  ret double 5.000000e-01
114define double @test_constant_fold_frexp_mant_f64_1() nounwind {
115  %val = call double @llvm.amdgcn.frexp.mant.f64(double 1.0)
116  ret double %val
117}
118
119; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n1(
120; CHECK-NEXT: ret float -5.000000e-01
121define float @test_constant_fold_frexp_mant_f32_n1() nounwind {
122  %val = call float @llvm.amdgcn.frexp.mant.f32(float -1.0)
123  ret float %val
124}
125
126; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n1(
127; CHECK-NEXT:  ret double -5.000000e-01
128define double @test_constant_fold_frexp_mant_f64_n1() nounwind {
129  %val = call double @llvm.amdgcn.frexp.mant.f64(double -1.0)
130  ret double %val
131}
132
133; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_nan(
134; CHECK-NEXT: ret float 0x7FF8000000000000
135define float @test_constant_fold_frexp_mant_f32_nan() nounwind {
136  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF8000000000000)
137  ret float %val
138}
139
140; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_nan(
141; CHECK-NEXT:  ret double 0x7FF8000000000000
142define double @test_constant_fold_frexp_mant_f64_nan() nounwind {
143  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF8000000000000)
144  ret double %val
145}
146
147; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_inf(
148; CHECK-NEXT: ret float 0x7FF0000000000000
149define float @test_constant_fold_frexp_mant_f32_inf() nounwind {
150  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF0000000000000)
151  ret float %val
152}
153
154; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_inf(
155; CHECK-NEXT:  ret double 0x7FF0000000000000
156define double @test_constant_fold_frexp_mant_f64_inf() nounwind {
157  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF0000000000000)
158  ret double %val
159}
160
161; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_ninf(
162; CHECK-NEXT: ret float 0xFFF0000000000000
163define float @test_constant_fold_frexp_mant_f32_ninf() nounwind {
164  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0xFFF0000000000000)
165  ret float %val
166}
167
168; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_ninf(
169; CHECK-NEXT:  ret double 0xFFF0000000000000
170define double @test_constant_fold_frexp_mant_f64_ninf() nounwind {
171  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0xFFF0000000000000)
172  ret double %val
173}
174
175; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_max_num(
176; CHECK-NEXT: ret float 0x3FEFFFFFE0000000
177define float @test_constant_fold_frexp_mant_f32_max_num() nounwind {
178  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x47EFFFFFE0000000)
179  ret float %val
180}
181
182; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_max_num(
183; CHECK-NEXT:  ret double 0x3FEFFFFFFFFFFFFF
184define double @test_constant_fold_frexp_mant_f64_max_num() nounwind {
185  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FEFFFFFFFFFFFFF)
186  ret double %val
187}
188
189; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_min_num(
190; CHECK-NEXT: ret float 5.000000e-01
191define float @test_constant_fold_frexp_mant_f32_min_num() nounwind {
192  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x36A0000000000000)
193  ret float %val
194}
195
196; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_min_num(
197; CHECK-NEXT:  ret double 5.000000e-01
198define double @test_constant_fold_frexp_mant_f64_min_num() nounwind {
199  %val = call double @llvm.amdgcn.frexp.mant.f64(double 4.940656e-324)
200  ret double %val
201}
202
203
204; --------------------------------------------------------------------
205; llvm.amdgcn.frexp.exp
206; --------------------------------------------------------------------
207
208declare i32 @llvm.amdgcn.frexp.exp.f32(float) nounwind readnone
209declare i32 @llvm.amdgcn.frexp.exp.f64(double) nounwind readnone
210
211; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_undef(
212; CHECK-NEXT: ret i32 undef
213define i32 @test_constant_fold_frexp_exp_f32_undef() nounwind {
214  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float undef)
215  ret i32 %val
216}
217
218; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_undef(
219; CHECK-NEXT:  ret i32 undef
220define i32 @test_constant_fold_frexp_exp_f64_undef() nounwind {
221  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double undef)
222  ret i32 %val
223}
224
225; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_0(
226; CHECK-NEXT: ret i32 0
227define i32 @test_constant_fold_frexp_exp_f32_0() nounwind {
228  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0)
229  ret i32 %val
230}
231
232; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_0(
233; CHECK-NEXT:  ret i32 0
234define i32 @test_constant_fold_frexp_exp_f64_0() nounwind {
235  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0)
236  ret i32 %val
237}
238
239; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n0(
240; CHECK-NEXT: ret i32 0
241define i32 @test_constant_fold_frexp_exp_f32_n0() nounwind {
242  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -0.0)
243  ret i32 %val
244}
245
246; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n0(
247; CHECK-NEXT:  ret i32 0
248define i32 @test_constant_fold_frexp_exp_f64_n0() nounwind {
249  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -0.0)
250  ret i32 %val
251}
252
253; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1024(
254; CHECK-NEXT: ret i32 11
255define i32 @test_constant_fold_frexp_exp_f32_1024() nounwind {
256  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 1024.0)
257  ret i32 %val
258}
259
260; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1024(
261; CHECK-NEXT:  ret i32 11
262define i32 @test_constant_fold_frexp_exp_f64_1024() nounwind {
263  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 1024.0)
264  ret i32 %val
265}
266
267; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n1024(
268; CHECK-NEXT: ret i32 11
269define i32 @test_constant_fold_frexp_exp_f32_n1024() nounwind {
270  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -1024.0)
271  ret i32 %val
272}
273
274; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n1024(
275; CHECK-NEXT:  ret i32 11
276define i32 @test_constant_fold_frexp_exp_f64_n1024() nounwind {
277  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -1024.0)
278  ret i32 %val
279}
280
281; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1_1024(
282; CHECK-NEXT: ret i32 -9
283define i32 @test_constant_fold_frexp_exp_f32_1_1024() nounwind {
284  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0009765625)
285  ret i32 %val
286}
287
288; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1_1024(
289; CHECK-NEXT:  ret i32 -9
290define i32 @test_constant_fold_frexp_exp_f64_1_1024() nounwind {
291  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0009765625)
292  ret i32 %val
293}
294
295; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_nan(
296; CHECK-NEXT: ret i32 0
297define i32 @test_constant_fold_frexp_exp_f32_nan() nounwind {
298  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF8000000000000)
299  ret i32 %val
300}
301
302; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_nan(
303; CHECK-NEXT:  ret i32 0
304define i32 @test_constant_fold_frexp_exp_f64_nan() nounwind {
305  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF8000000000000)
306  ret i32 %val
307}
308
309; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_inf(
310; CHECK-NEXT: ret i32 0
311define i32 @test_constant_fold_frexp_exp_f32_inf() nounwind {
312  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF0000000000000)
313  ret i32 %val
314}
315
316; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_inf(
317; CHECK-NEXT:  ret i32 0
318define i32 @test_constant_fold_frexp_exp_f64_inf() nounwind {
319  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF0000000000000)
320  ret i32 %val
321}
322
323; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_ninf(
324; CHECK-NEXT: ret i32 0
325define i32 @test_constant_fold_frexp_exp_f32_ninf() nounwind {
326  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0xFFF0000000000000)
327  ret i32 %val
328}
329
330; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_ninf(
331; CHECK-NEXT:  ret i32 0
332define i32 @test_constant_fold_frexp_exp_f64_ninf() nounwind {
333  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0xFFF0000000000000)
334  ret i32 %val
335}
336
337; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_max_num(
338; CHECK-NEXT: ret i32 128
339define i32 @test_constant_fold_frexp_exp_f32_max_num() nounwind {
340  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x47EFFFFFE0000000)
341  ret i32 %val
342}
343
344; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_max_num(
345; CHECK-NEXT:  ret i32 1024
346define i32 @test_constant_fold_frexp_exp_f64_max_num() nounwind {
347  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FEFFFFFFFFFFFFF)
348  ret i32 %val
349}
350
351; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_min_num(
352; CHECK-NEXT: ret i32 -148
353define i32 @test_constant_fold_frexp_exp_f32_min_num() nounwind {
354  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x36A0000000000000)
355  ret i32 %val
356}
357
358; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_min_num(
359; CHECK-NEXT:  ret i32 -1073
360define i32 @test_constant_fold_frexp_exp_f64_min_num() nounwind {
361  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 4.940656e-324)
362  ret i32 %val
363}
364
365