xref: /llvm-project/llvm/test/Transforms/InstCombine/freeze-fp-ops.ll (revision d3c46db494de331fb49ea7aaeb1ab16c0259d539)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3
4; Test that floating point operations are not treated as sources of
5; poison.
6
7define float @freeze_fneg(float %arg) {
8; CHECK-LABEL: @freeze_fneg(
9; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
10; CHECK-NEXT:    [[OP:%.*]] = fneg float [[ARG_FR]]
11; CHECK-NEXT:    ret float [[OP]]
12;
13  %op = fneg float %arg
14  %freeze = freeze float %op
15  ret float %freeze
16}
17
18define float @freeze_fadd(float %arg0, float noundef %arg1) {
19; CHECK-LABEL: @freeze_fadd(
20; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
21; CHECK-NEXT:    [[OP:%.*]] = fadd float [[ARG0_FR]], [[ARG1:%.*]]
22; CHECK-NEXT:    ret float [[OP]]
23;
24  %op = fadd float %arg0, %arg1
25  %freeze = freeze float %op
26  ret float %freeze
27}
28
29define float @freeze_fsub(float %arg0, float noundef %arg1) {
30; CHECK-LABEL: @freeze_fsub(
31; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
32; CHECK-NEXT:    [[OP:%.*]] = fsub float [[ARG0_FR]], [[ARG1:%.*]]
33; CHECK-NEXT:    ret float [[OP]]
34;
35  %op = fsub float %arg0, %arg1
36  %freeze = freeze float %op
37  ret float %freeze
38}
39
40define float @freeze_fmul(float %arg0, float noundef %arg1) {
41; CHECK-LABEL: @freeze_fmul(
42; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
43; CHECK-NEXT:    [[OP:%.*]] = fmul float [[ARG0_FR]], [[ARG1:%.*]]
44; CHECK-NEXT:    ret float [[OP]]
45;
46  %op = fmul float %arg0, %arg1
47  %freeze = freeze float %op
48  ret float %freeze
49}
50
51define float @freeze_fdiv(float %arg0, float noundef %arg1) {
52; CHECK-LABEL: @freeze_fdiv(
53; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
54; CHECK-NEXT:    [[OP:%.*]] = fdiv float [[ARG0_FR]], [[ARG1:%.*]]
55; CHECK-NEXT:    ret float [[OP]]
56;
57  %op = fdiv float %arg0, %arg1
58  %freeze = freeze float %op
59  ret float %freeze
60}
61
62define float @freeze_frem(float %arg0, float noundef %arg1) {
63; CHECK-LABEL: @freeze_frem(
64; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
65; CHECK-NEXT:    [[OP:%.*]] = fdiv float [[ARG0_FR]], [[ARG1:%.*]]
66; CHECK-NEXT:    ret float [[OP]]
67;
68  %op = fdiv float %arg0, %arg1
69  %freeze = freeze float %op
70  ret float %freeze
71}
72
73define double @fpext(float %arg) {
74; CHECK-LABEL: @fpext(
75; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
76; CHECK-NEXT:    [[OP:%.*]] = fpext float [[ARG_FR]] to double
77; CHECK-NEXT:    ret double [[OP]]
78;
79  %op = fpext float %arg to double
80  %freeze = freeze double %op
81  ret double %freeze
82}
83
84define float @fptrunc(double %arg) {
85; CHECK-LABEL: @fptrunc(
86; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze double [[ARG:%.*]]
87; CHECK-NEXT:    [[OP:%.*]] = fptrunc double [[ARG_FR]] to float
88; CHECK-NEXT:    ret float [[OP]]
89;
90  %op = fptrunc double %arg to float
91  %freeze = freeze float %op
92  ret float %freeze
93}
94
95define float @sitofp(i32 %arg) {
96; CHECK-LABEL: @sitofp(
97; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]
98; CHECK-NEXT:    [[OP:%.*]] = sitofp i32 [[ARG_FR]] to float
99; CHECK-NEXT:    ret float [[OP]]
100;
101  %op = sitofp i32 %arg to float
102  %freeze = freeze float %op
103  ret float %freeze
104}
105
106define float @uitofp(i32 %arg) {
107; CHECK-LABEL: @uitofp(
108; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]
109; CHECK-NEXT:    [[OP:%.*]] = uitofp i32 [[ARG_FR]] to float
110; CHECK-NEXT:    ret float [[OP]]
111;
112  %op = uitofp i32 %arg to float
113  %freeze = freeze float %op
114  ret float %freeze
115}
116
117define float @freeze_fma(float %arg0, float noundef %arg1, float noundef %arg2) {
118; CHECK-LABEL: @freeze_fma(
119; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
120; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.fma.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]], float noundef [[ARG2:%.*]])
121; CHECK-NEXT:    ret float [[OP]]
122;
123  %op = call float @llvm.fma.f32(float %arg0, float noundef %arg1, float noundef %arg2)
124  %freeze = freeze float %op
125  ret float %freeze
126}
127
128define float @freeze_fmuladd(float %arg0, float noundef %arg1, float noundef %arg2) {
129; CHECK-LABEL: @freeze_fmuladd(
130; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
131; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.fmuladd.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]], float noundef [[ARG2:%.*]])
132; CHECK-NEXT:    ret float [[OP]]
133;
134  %op = call float @llvm.fmuladd.f32(float %arg0, float noundef %arg1, float noundef %arg2)
135  %freeze = freeze float %op
136  ret float %freeze
137}
138
139define float @freeze_sqrt(float %arg) {
140; CHECK-LABEL: @freeze_sqrt(
141; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
142; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.sqrt.f32(float [[ARG_FR]])
143; CHECK-NEXT:    ret float [[OP]]
144;
145  %op = call float @llvm.sqrt.f32(float %arg)
146  %freeze = freeze float %op
147  ret float %freeze
148}
149
150define float @freeze_powi(float %arg0, i32 %arg1) {
151; CHECK-LABEL: @freeze_powi(
152; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.powi.f32.i32(float [[ARG0:%.*]], i32 [[ARG1:%.*]])
153; CHECK-NEXT:    [[FREEZE:%.*]] = freeze float [[OP]]
154; CHECK-NEXT:    ret float [[FREEZE]]
155;
156  %op = call float @llvm.powi.f32.i32(float %arg0, i32 %arg1)
157  %freeze = freeze float %op
158  ret float %freeze
159}
160
161define float @freeze_sin(float %arg) {
162; CHECK-LABEL: @freeze_sin(
163; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
164; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.sin.f32(float [[ARG_FR]])
165; CHECK-NEXT:    ret float [[OP]]
166;
167  %op = call float @llvm.sin.f32(float %arg)
168  %freeze = freeze float %op
169  ret float %freeze
170}
171
172define float @freeze_cos(float %arg) {
173; CHECK-LABEL: @freeze_cos(
174; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
175; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.cos.f32(float [[ARG_FR]])
176; CHECK-NEXT:    ret float [[OP]]
177;
178  %op = call float @llvm.cos.f32(float %arg)
179  %freeze = freeze float %op
180  ret float %freeze
181}
182
183define float @freeze_pow(float %arg0, float noundef %arg1) {
184; CHECK-LABEL: @freeze_pow(
185; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
186; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.pow.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]])
187; CHECK-NEXT:    ret float [[OP]]
188;
189  %op = call float @llvm.pow.f32(float %arg0, float noundef %arg1)
190  %freeze = freeze float %op
191  ret float %freeze
192}
193
194define float @freeze_log(float %arg) {
195; CHECK-LABEL: @freeze_log(
196; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
197; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.log.f32(float [[ARG_FR]])
198; CHECK-NEXT:    ret float [[OP]]
199;
200  %op = call float @llvm.log.f32(float %arg)
201  %freeze = freeze float %op
202  ret float %freeze
203}
204
205define float @freeze_log10(float %arg) {
206; CHECK-LABEL: @freeze_log10(
207; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
208; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.log10.f32(float [[ARG_FR]])
209; CHECK-NEXT:    ret float [[OP]]
210;
211  %op = call float @llvm.log10.f32(float %arg)
212  %freeze = freeze float %op
213  ret float %freeze
214}
215
216define float @freeze_log2(float %arg) {
217; CHECK-LABEL: @freeze_log2(
218; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
219; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.log2.f32(float [[ARG_FR]])
220; CHECK-NEXT:    ret float [[OP]]
221;
222  %op = call float @llvm.log2.f32(float %arg)
223  %freeze = freeze float %op
224  ret float %freeze
225}
226
227define float @freeze_exp(float %arg) {
228; CHECK-LABEL: @freeze_exp(
229; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
230; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.exp.f32(float [[ARG_FR]])
231; CHECK-NEXT:    ret float [[OP]]
232;
233  %op = call float @llvm.exp.f32(float %arg)
234  %freeze = freeze float %op
235  ret float %freeze
236}
237
238define float @freeze_exp2(float %arg) {
239; CHECK-LABEL: @freeze_exp2(
240; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
241; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.exp2.f32(float [[ARG_FR]])
242; CHECK-NEXT:    ret float [[OP]]
243;
244  %op = call float @llvm.exp2.f32(float %arg)
245  %freeze = freeze float %op
246  ret float %freeze
247}
248
249define float @freeze_exp10(float %arg) {
250; CHECK-LABEL: @freeze_exp10(
251; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
252; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.exp10.f32(float [[ARG_FR]])
253; CHECK-NEXT:    ret float [[OP]]
254;
255  %op = call float @llvm.exp10.f32(float %arg)
256  %freeze = freeze float %op
257  ret float %freeze
258}
259
260define float @freeze_fabs(float %arg) {
261; CHECK-LABEL: @freeze_fabs(
262; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
263; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.fabs.f32(float [[ARG_FR]])
264; CHECK-NEXT:    ret float [[OP]]
265;
266  %op = call float @llvm.fabs.f32(float %arg)
267  %freeze = freeze float %op
268  ret float %freeze
269}
270
271define float @freeze_copysign(float %arg0, float noundef %arg1) {
272; CHECK-LABEL: @freeze_copysign(
273; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
274; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.copysign.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]])
275; CHECK-NEXT:    ret float [[OP]]
276;
277  %op = call float @llvm.copysign.f32(float %arg0, float noundef %arg1)
278  %freeze = freeze float %op
279  ret float %freeze
280}
281
282define float @freeze_floor(float %arg) {
283; CHECK-LABEL: @freeze_floor(
284; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
285; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.floor.f32(float [[ARG_FR]])
286; CHECK-NEXT:    ret float [[OP]]
287;
288  %op = call float @llvm.floor.f32(float %arg)
289  %freeze = freeze float %op
290  ret float %freeze
291}
292
293define float @freeze_ceil(float %arg) {
294; CHECK-LABEL: @freeze_ceil(
295; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
296; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.ceil.f32(float [[ARG_FR]])
297; CHECK-NEXT:    ret float [[OP]]
298;
299  %op = call float @llvm.ceil.f32(float %arg)
300  %freeze = freeze float %op
301  ret float %freeze
302}
303
304define float @freeze_trunc(float %arg) {
305; CHECK-LABEL: @freeze_trunc(
306; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
307; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.trunc.f32(float [[ARG_FR]])
308; CHECK-NEXT:    ret float [[OP]]
309;
310  %op = call float @llvm.trunc.f32(float %arg)
311  %freeze = freeze float %op
312  ret float %freeze
313}
314
315define float @freeze_rint(float %arg) {
316; CHECK-LABEL: @freeze_rint(
317; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
318; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.rint.f32(float [[ARG_FR]])
319; CHECK-NEXT:    ret float [[OP]]
320;
321  %op = call float @llvm.rint.f32(float %arg)
322  %freeze = freeze float %op
323  ret float %freeze
324}
325
326define float @freeze_nearbyint(float %arg) {
327; CHECK-LABEL: @freeze_nearbyint(
328; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
329; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.nearbyint.f32(float [[ARG_FR]])
330; CHECK-NEXT:    ret float [[OP]]
331;
332  %op = call float @llvm.nearbyint.f32(float %arg)
333  %freeze = freeze float %op
334  ret float %freeze
335}
336
337define float @freeze_round(float %arg) {
338; CHECK-LABEL: @freeze_round(
339; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
340; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.round.f32(float [[ARG_FR]])
341; CHECK-NEXT:    ret float [[OP]]
342;
343  %op = call float @llvm.round.f32(float %arg)
344  %freeze = freeze float %op
345  ret float %freeze
346}
347
348define float @freeze_roundeven(float %arg) {
349; CHECK-LABEL: @freeze_roundeven(
350; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
351; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.roundeven.f32(float [[ARG_FR]])
352; CHECK-NEXT:    ret float [[OP]]
353;
354  %op = call float @llvm.roundeven.f32(float %arg)
355  %freeze = freeze float %op
356  ret float %freeze
357}
358
359define float @freeze_canonicalize(float %arg) {
360; CHECK-LABEL: @freeze_canonicalize(
361; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
362; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.canonicalize.f32(float [[ARG_FR]])
363; CHECK-NEXT:    ret float [[OP]]
364;
365  %op = call float @llvm.canonicalize.f32(float %arg)
366  %freeze = freeze float %op
367  ret float %freeze
368}
369
370define float @freeze_arithmetic_fence(float %arg) {
371; CHECK-LABEL: @freeze_arithmetic_fence(
372; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
373; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.arithmetic.fence.f32(float [[ARG_FR]])
374; CHECK-NEXT:    ret float [[OP]]
375;
376  %op = call float @llvm.arithmetic.fence.f32(float %arg)
377  %freeze = freeze float %op
378  ret float %freeze
379}
380
381define i32 @freeze_lround(float %arg) {
382; CHECK-LABEL: @freeze_lround(
383; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
384; CHECK-NEXT:    [[OP:%.*]] = call i32 @llvm.lround.i32.f32(float [[ARG_FR]])
385; CHECK-NEXT:    ret i32 [[OP]]
386;
387  %op = call i32 @llvm.lround.i32.f32(float %arg)
388  %freeze = freeze i32 %op
389  ret i32 %freeze
390}
391
392define i32 @freeze_llround(float %arg) {
393; CHECK-LABEL: @freeze_llround(
394; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
395; CHECK-NEXT:    [[OP:%.*]] = call i32 @llvm.llround.i32.f32(float [[ARG_FR]])
396; CHECK-NEXT:    ret i32 [[OP]]
397;
398  %op = call i32 @llvm.llround.i32.f32(float %arg)
399  %freeze = freeze i32 %op
400  ret i32 %freeze
401}
402
403define i32 @freeze_lrint(float %arg) {
404; CHECK-LABEL: @freeze_lrint(
405; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
406; CHECK-NEXT:    [[OP:%.*]] = call i32 @llvm.lrint.i32.f32(float [[ARG_FR]])
407; CHECK-NEXT:    ret i32 [[OP]]
408;
409  %op = call i32 @llvm.lrint.i32.f32(float %arg)
410  %freeze = freeze i32 %op
411  ret i32 %freeze
412}
413
414define i32 @freeze_llrint(float %arg) {
415; CHECK-LABEL: @freeze_llrint(
416; CHECK-NEXT:    [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]
417; CHECK-NEXT:    [[OP:%.*]] = call i32 @llvm.llrint.i32.f32(float [[ARG_FR]])
418; CHECK-NEXT:    ret i32 [[OP]]
419;
420  %op = call i32 @llvm.llrint.i32.f32(float %arg)
421  %freeze = freeze i32 %op
422  ret i32 %freeze
423}
424
425define i32 @freeze_noundef_lround(float %arg) {
426; CHECK-LABEL: @freeze_noundef_lround(
427; CHECK-NEXT:    [[OP:%.*]] = call noundef i32 @llvm.lround.i32.f32(float [[ARG:%.*]])
428; CHECK-NEXT:    ret i32 [[OP]]
429;
430  %op = call noundef i32 @llvm.lround.i32.f32(float %arg)
431  %freeze = freeze i32 %op
432  ret i32 %freeze
433}
434
435define i32 @freeze_noundef_llround(float %arg) {
436; CHECK-LABEL: @freeze_noundef_llround(
437; CHECK-NEXT:    [[OP:%.*]] = call noundef i32 @llvm.llround.i32.f32(float [[ARG:%.*]])
438; CHECK-NEXT:    ret i32 [[OP]]
439;
440  %op = call noundef i32 @llvm.llround.i32.f32(float %arg)
441  %freeze = freeze i32 %op
442  ret i32 %freeze
443}
444
445define i32 @freeze_noundef_lrint(float %arg) {
446; CHECK-LABEL: @freeze_noundef_lrint(
447; CHECK-NEXT:    [[OP:%.*]] = call noundef i32 @llvm.lrint.i32.f32(float [[ARG:%.*]])
448; CHECK-NEXT:    ret i32 [[OP]]
449;
450  %op = call noundef i32 @llvm.lrint.i32.f32(float %arg)
451  %freeze = freeze i32 %op
452  ret i32 %freeze
453}
454
455define i32 @freeze_noundef_llrint(float %arg) {
456; CHECK-LABEL: @freeze_noundef_llrint(
457; CHECK-NEXT:    [[OP:%.*]] = call noundef i32 @llvm.llrint.i32.f32(float [[ARG:%.*]])
458; CHECK-NEXT:    ret i32 [[OP]]
459;
460  %op = call noundef i32 @llvm.llrint.i32.f32(float %arg)
461  %freeze = freeze i32 %op
462  ret i32 %freeze
463}
464
465define float @freeze_minnum(float %arg0, float noundef %arg1) {
466; CHECK-LABEL: @freeze_minnum(
467; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
468; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.minnum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]])
469; CHECK-NEXT:    ret float [[OP]]
470;
471  %op = call float @llvm.minnum.f32(float %arg0, float noundef %arg1)
472  %freeze = freeze float %op
473  ret float %freeze
474}
475
476define float @freeze_maxnum(float %arg0, float noundef %arg1) {
477; CHECK-LABEL: @freeze_maxnum(
478; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
479; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.maxnum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]])
480; CHECK-NEXT:    ret float [[OP]]
481;
482  %op = call float @llvm.maxnum.f32(float %arg0, float noundef %arg1)
483  %freeze = freeze float %op
484  ret float %freeze
485}
486
487define float @freeze_minimum(float %arg0, float noundef %arg1) {
488; CHECK-LABEL: @freeze_minimum(
489; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
490; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.minimum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]])
491; CHECK-NEXT:    ret float [[OP]]
492;
493  %op = call float @llvm.minimum.f32(float %arg0, float noundef %arg1)
494  %freeze = freeze float %op
495  ret float %freeze
496}
497
498define float @freeze_maximum(float %arg0, float noundef %arg1) {
499; CHECK-LABEL: @freeze_maximum(
500; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
501; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.maximum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]])
502; CHECK-NEXT:    ret float [[OP]]
503;
504  %op = call float @llvm.maximum.f32(float %arg0, float noundef %arg1)
505  %freeze = freeze float %op
506  ret float %freeze
507}
508
509define i1 @freeze_isfpclass(float %arg0) {
510; CHECK-LABEL: @freeze_isfpclass(
511; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
512; CHECK-NEXT:    [[OP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG0_FR]], i32 27)
513; CHECK-NEXT:    ret i1 [[OP]]
514;
515  %op = call i1 @llvm.is.fpclass.f32(float %arg0, i32 27)
516  %freeze = freeze i1 %op
517  ret i1 %freeze
518}
519
520define float @freeze_fptrunc_round(double %arg0) {
521; CHECK-LABEL: @freeze_fptrunc_round(
522; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze double [[ARG0:%.*]]
523; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.fptrunc.round.f32.f64(double [[ARG0_FR]], metadata !"round.downward")
524; CHECK-NEXT:    ret float [[OP]]
525;
526  %op = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
527  %freeze = freeze float %op
528  ret float %freeze
529}
530
531define float @freeze_ldexp(float %arg0, i32 noundef %arg1) {
532; CHECK-LABEL: @freeze_ldexp(
533; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
534; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.ldexp.f32.i32(float [[ARG0_FR]], i32 [[ARG1:%.*]])
535; CHECK-NEXT:    ret float [[OP]]
536;
537  %op = call float @llvm.ldexp.f32.i32(float %arg0, i32 %arg1)
538  %freeze = freeze float %op
539  ret float %freeze
540}
541
542define { float, i32 } @freeze_frexp(float %arg0) {
543; CHECK-LABEL: @freeze_frexp(
544; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
545; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
546; CHECK-NEXT:    ret { float, i32 } [[OP]]
547;
548  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
549  %freeze = freeze { float, i32 } %op
550  ret { float, i32 } %freeze
551}
552
553define float @freeze_frexp_0(float %arg0) {
554; CHECK-LABEL: @freeze_frexp_0(
555; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
556; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
557; CHECK-NEXT:    [[EXTRACT_0:%.*]] = extractvalue { float, i32 } [[OP]], 0
558; CHECK-NEXT:    ret float [[EXTRACT_0]]
559;
560  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
561  %extract.0 = extractvalue { float, i32 } %op, 0
562  %freeze = freeze float %extract.0
563  ret float %freeze
564}
565
566define i32 @freeze_frexp_1(float %arg0) {
567; CHECK-LABEL: @freeze_frexp_1(
568; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
569; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
570; CHECK-NEXT:    [[EXTRACT_1:%.*]] = extractvalue { float, i32 } [[OP]], 1
571; CHECK-NEXT:    ret i32 [[EXTRACT_1]]
572;
573  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
574  %extract.1 = extractvalue { float, i32 } %op, 1
575  %freeze = freeze i32 %extract.1
576  ret i32 %freeze
577}
578
579declare float @llvm.fma.f32(float, float, float)
580declare float @llvm.fmuladd.f32(float, float, float)
581declare float @llvm.sqrt.f32(float)
582declare float @llvm.powi.f32.i32(float, i32)
583declare float @llvm.sin.f32(float)
584declare float @llvm.cos.f32(float)
585declare float @llvm.pow.f32(float, float)
586declare float @llvm.log.f32(float)
587declare float @llvm.log10.f32(float)
588declare float @llvm.log2.f32(float)
589declare float @llvm.exp.f32(float)
590declare float @llvm.exp2.f32(float)
591declare float @llvm.exp10.f32(float)
592declare float @llvm.fabs.f32(float)
593declare float @llvm.copysign.f32(float, float)
594declare float @llvm.floor.f32(float)
595declare float @llvm.ceil.f32(float)
596declare float @llvm.trunc.f32(float)
597declare float @llvm.rint.f32(float)
598declare float @llvm.nearbyint.f32(float)
599declare float @llvm.round.f32(float)
600declare float @llvm.roundeven.f32(float)
601declare float @llvm.canonicalize.f32(float)
602declare float @llvm.arithmetic.fence.f32(float)
603declare i32 @llvm.lround.i32.f32(float)
604declare i32 @llvm.llround.i32.f32(float)
605declare i32 @llvm.lrint.i32.f32(float)
606declare i32 @llvm.llrint.i32.f32(float)
607declare float @llvm.minnum.f32(float, float)
608declare float @llvm.maxnum.f32(float, float)
609declare float @llvm.minimum.f32(float, float)
610declare float @llvm.maximum.f32(float, float)
611declare i1 @llvm.is.fpclass.f32(float, i32 immarg)
612declare float @llvm.fptrunc.round.f32.f64(double, metadata)
613declare float @llvm.ldexp.f32.i32(float, i32)
614declare { float, i32 } @llvm.frexp.f32.i32(float)
615