xref: /llvm-project/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll (revision a67bd94fdafce716b42e0cb5409ee451b20f1749)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3
4define i1 @test1(float %x) {
5; CHECK-LABEL: define i1 @test1(
6; CHECK-SAME: float [[X:%.*]]) {
7; CHECK-NEXT:  entry:
8; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
9; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
10; CHECK:       if.then:
11; CHECK-NEXT:    ret i1 false
12; CHECK:       if.else:
13; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780)
14; CHECK-NEXT:    ret i1 [[RET]]
15;
16entry:
17  %cond = fcmp ueq float %x, 0.000000e+00
18  br i1 %cond, label %if.then, label %if.else
19
20if.then:
21  ret i1 false
22
23if.else:
24  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
25  ret i1 %ret
26}
27
28define i1 @test2(double %x) {
29; CHECK-LABEL: define i1 @test2(
30; CHECK-SAME: double [[X:%.*]]) {
31; CHECK-NEXT:  entry:
32; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000
33; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
34; CHECK:       if.then:
35; CHECK-NEXT:    ret i1 false
36; CHECK:       if.end:
37; CHECK-NEXT:    ret i1 false
38;
39entry:
40  %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000
41  br i1 %cmp, label %if.then, label %if.end
42if.then:
43  ret i1 false
44if.end:
45  %cmp.i = fcmp oeq double %x, 0.000000e+00
46  ret i1 %cmp.i
47}
48
49define i1 @test2_or(double %x, i1 %cond) {
50; CHECK-LABEL: define i1 @test2_or(
51; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) {
52; CHECK-NEXT:  entry:
53; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000
54; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP]], [[COND]]
55; CHECK-NEXT:    br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
56; CHECK:       if.then:
57; CHECK-NEXT:    ret i1 false
58; CHECK:       if.end:
59; CHECK-NEXT:    ret i1 false
60;
61entry:
62  %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000
63  %or = or i1 %cmp, %cond
64  br i1 %or, label %if.then, label %if.end
65
66if.then:
67  ret i1 false
68
69if.end:
70  %cmp.i = fcmp oeq double %x, 0.000000e+00
71  ret i1 %cmp.i
72}
73
74define i1 @test3(float %x) {
75; CHECK-LABEL: define i1 @test3(
76; CHECK-SAME: float [[X:%.*]]) {
77; CHECK-NEXT:  entry:
78; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[X]], 3.000000e+00
79; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
80; CHECK:       if.then:
81; CHECK-NEXT:    [[RET:%.*]] = fcmp oeq float [[X]], 0x7FF0000000000000
82; CHECK-NEXT:    ret i1 [[RET]]
83; CHECK:       if.else:
84; CHECK-NEXT:    ret i1 false
85;
86entry:
87  %cmp = fcmp ogt float %x, 3.000000e+00
88  br i1 %cmp, label %if.then, label %if.else
89if.then:
90  %abs = call float @llvm.fabs.f32(float %x)
91  %ret = fcmp oeq float %abs, 0x7FF0000000000000
92  ret i1 %ret
93if.else:
94  ret i1 false
95}
96
97define float @test4(float %x) {
98; CHECK-LABEL: define float @test4(
99; CHECK-SAME: float [[X:%.*]]) {
100; CHECK-NEXT:  entry:
101; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt float [[X]], 0x3EB0C6F7A0000000
102; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
103; CHECK:       if.then:
104; CHECK-NEXT:    ret float 1.000000e+00
105; CHECK:       if.end:
106; CHECK-NEXT:    [[DIV:%.*]] = fdiv float 1.000000e+00, [[X]]
107; CHECK-NEXT:    ret float [[DIV]]
108;
109entry:
110  %cmp = fcmp olt float %x, 0x3EB0C6F7A0000000
111  br i1 %cmp, label %if.then, label %if.end
112
113if.then:
114  ret float 1.0
115
116if.end:
117  %cmp.i = fcmp oeq float %x, 0.000000e+00
118  %div = fdiv float 1.000000e+00, %x
119  %ret = select i1 %cmp.i, float 1.000000e+00, float %div
120  ret float %ret
121}
122
123define i1 @test5(double %x, i1 %cond) {
124; CHECK-LABEL: define i1 @test5(
125; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) {
126; CHECK-NEXT:  entry:
127; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
128; CHECK:       if:
129; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno double [[X]], 0.000000e+00
130; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
131; CHECK:       if.then:
132; CHECK-NEXT:    ret i1 false
133; CHECK:       if.end:
134; CHECK-NEXT:    br label [[EXIT]]
135; CHECK:       exit:
136; CHECK-NEXT:    [[Y:%.*]] = phi double [ -1.000000e+00, [[ENTRY:%.*]] ], [ [[X]], [[IF_END]] ]
137; CHECK-NEXT:    [[RET:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[Y]], i32 408)
138; CHECK-NEXT:    ret i1 [[RET]]
139;
140entry:
141  br i1 %cond, label %if, label %exit
142if:
143  %cmp = fcmp uno double %x, 0.000000e+00
144  br i1 %cmp, label %if.then, label %if.end
145if.then:
146  ret i1 false
147if.end:
148  br label %exit
149exit:
150  %y = phi double [ -1.000000e+00, %entry ], [ %x, %if.end ]
151  %ret = tail call i1 @llvm.is.fpclass.f64(double %y, i32 411)
152  ret i1 %ret
153}
154
155define i1 @test6(double %x) {
156; CHECK-LABEL: define i1 @test6(
157; CHECK-SAME: double [[X:%.*]]) {
158; CHECK-NEXT:  entry:
159; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00
160; CHECK-NEXT:    br i1 [[CMP]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]
161; CHECK:       land.rhs:
162; CHECK-NEXT:    [[CMP_I:%.*]] = fcmp oeq double [[X]], 0x7FF0000000000000
163; CHECK-NEXT:    br label [[LAND_END]]
164; CHECK:       land.end:
165; CHECK-NEXT:    [[RET:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP_I]], [[LAND_RHS]] ]
166; CHECK-NEXT:    ret i1 [[RET]]
167;
168entry:
169  %cmp = fcmp ogt double %x, 0.000000e+00
170  br i1 %cmp, label %land.rhs, label %land.end
171
172land.rhs:
173  %abs = tail call double @llvm.fabs.f64(double %x)
174  %and.i = bitcast double %abs to i64
175  %cmp.i = icmp eq i64 %and.i, 9218868437227405312
176  br label %land.end
177
178land.end:
179  %ret = phi i1 [ false, %entry ], [ %cmp.i, %land.rhs ]
180  ret i1 %ret
181}
182
183define i1 @test7(float %x) {
184; CHECK-LABEL: define i1 @test7(
185; CHECK-SAME: float [[X:%.*]]) {
186; CHECK-NEXT:    [[COND:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 345)
187; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
188; CHECK:       if.then:
189; CHECK-NEXT:    [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 328)
190; CHECK-NEXT:    ret i1 [[RET1]]
191; CHECK:       if.else:
192; CHECK-NEXT:    [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 128)
193; CHECK-NEXT:    ret i1 [[RET2]]
194;
195  %cond = call i1 @llvm.is.fpclass.f32(float %x, i32 345)
196  br i1 %cond, label %if.then, label %if.else
197if.then:
198  %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)
199  ret i1 %ret1
200if.else:
201  %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)
202  ret i1 %ret2
203}
204
205; TODO: These two is.fpclass can be simplified.
206define i1 @test8(float %x) {
207; CHECK-LABEL: define i1 @test8(
208; CHECK-SAME: float [[X:%.*]]) {
209; CHECK-NEXT:    [[ABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
210; CHECK-NEXT:    [[COND:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000
211; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
212; CHECK:       if.then:
213; CHECK-NEXT:    ret i1 true
214; CHECK:       if.else:
215; CHECK-NEXT:    [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 59)
216; CHECK-NEXT:    ret i1 [[RET2]]
217;
218  %abs = call float @llvm.fabs.f32(float %x)
219  %cond = fcmp oeq float %abs, 0x7FF0000000000000
220  br i1 %cond, label %if.then, label %if.else
221if.then:
222  %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)
223  ret i1 %ret1
224if.else:
225  %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)
226  ret i1 %ret2
227}
228
229define i1 @test9(float %x) {
230; CHECK-LABEL: define i1 @test9(
231; CHECK-SAME: float [[X:%.*]]) {
232; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
233; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
234; CHECK:       if.then:
235; CHECK-NEXT:    ret i1 false
236; CHECK:       if.else:
237; CHECK-NEXT:    ret i1 false
238;
239  %cond = fcmp olt float %x, -1.0
240  br i1 %cond, label %if.then, label %if.else
241if.then:
242  %ret1 = fcmp oeq float %x, 0x7FF0000000000000
243  ret i1 %ret1
244if.else:
245  ret i1 false
246}
247
248define i1 @test10(float %x) {
249; CHECK-LABEL: define i1 @test10(
250; CHECK-SAME: float [[X:%.*]]) {
251; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
252; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
253; CHECK:       if.then:
254; CHECK-NEXT:    ret i1 false
255; CHECK:       if.else:
256; CHECK-NEXT:    ret i1 false
257;
258  %cond = fcmp olt float %x, -1.0
259  %neg = fneg float %x
260  br i1 %cond, label %if.then, label %if.else
261if.then:
262  %ret1 = fcmp oeq float %neg, 0xFFF0000000000000
263  ret i1 %ret1
264if.else:
265  ret i1 false
266}
267
268define i1 @test11_and(float %x, i1 %cond2) {
269; CHECK-LABEL: define i1 @test11_and(
270; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) {
271; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
272; CHECK-NEXT:    [[AND:%.*]] = and i1 [[COND]], [[COND2]]
273; CHECK-NEXT:    br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
274; CHECK:       if.then:
275; CHECK-NEXT:    ret i1 false
276; CHECK:       if.else:
277; CHECK-NEXT:    ret i1 false
278;
279  %cond = fcmp olt float %x, -1.0
280  %neg = fneg float %x
281  %and = and i1 %cond, %cond2
282  br i1 %and, label %if.then, label %if.else
283if.then:
284  %ret1 = fcmp oeq float %neg, 0xFFF0000000000000
285  ret i1 %ret1
286if.else:
287  ret i1 false
288}
289
290define i1 @test12_or(float %x, i1 %cond2) {
291; CHECK-LABEL: define i1 @test12_or(
292; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) {
293; CHECK-NEXT:  entry:
294; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
295; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND]], [[COND2]]
296; CHECK-NEXT:    br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
297; CHECK:       if.then:
298; CHECK-NEXT:    ret i1 false
299; CHECK:       if.else:
300; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780)
301; CHECK-NEXT:    ret i1 [[RET]]
302;
303entry:
304  %cond = fcmp ueq float %x, 0.000000e+00
305  %or = or i1 %cond, %cond2
306  br i1 %or, label %if.then, label %if.else
307
308if.then:
309  ret i1 false
310
311if.else:
312  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
313  ret i1 %ret
314}
315
316define i1 @test1_no_dominating(float %x, i1 %c) {
317; CHECK-LABEL: define i1 @test1_no_dominating(
318; CHECK-SAME: float [[X:%.*]], i1 [[C:%.*]]) {
319; CHECK-NEXT:  entry0:
320; CHECK-NEXT:    br i1 [[C]], label [[ENTRY:%.*]], label [[IF_ELSE:%.*]]
321; CHECK:       entry:
322; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
323; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE]]
324; CHECK:       if.then:
325; CHECK-NEXT:    ret i1 false
326; CHECK:       if.else:
327; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783)
328; CHECK-NEXT:    ret i1 [[RET]]
329;
330entry0:
331  br i1 %c, label %entry, label %if.else
332
333entry:
334  %cond = fcmp ueq float %x, 0.000000e+00
335  br i1 %cond, label %if.then, label %if.else
336
337if.then:
338  ret i1 false
339
340if.else:
341  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
342  ret i1 %ret
343}
344
345define float @test_signbit_check(float %x, i1 %cond) {
346; CHECK-LABEL: define float @test_signbit_check(
347; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {
348; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[X]] to i32
349; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0
350; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
351; CHECK:       if.then1:
352; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]
353; CHECK-NEXT:    br label [[IF_END:%.*]]
354; CHECK:       if.else:
355; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
356; CHECK:       if.then2:
357; CHECK-NEXT:    br label [[IF_END]]
358; CHECK:       if.end:
359; CHECK-NEXT:    [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
360; CHECK-NEXT:    ret float [[VALUE]]
361;
362  %i32 = bitcast float %x to i32
363  %cmp = icmp slt i32 %i32, 0
364  br i1 %cmp, label %if.then1, label %if.else
365
366if.then1:
367  %fneg = fneg float %x
368  br label %if.end
369
370if.else:
371  br i1 %cond, label %if.then2, label %if.end
372
373if.then2:
374  br label %if.end
375
376if.end:
377  %value = phi float [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ]
378  %ret = call float @llvm.fabs.f32(float %value)
379  ret float %ret
380}
381
382define float @test_signbit_check_fail(float %x, i1 %cond) {
383; CHECK-LABEL: define float @test_signbit_check_fail(
384; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {
385; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[X]] to i32
386; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0
387; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
388; CHECK:       if.then1:
389; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]
390; CHECK-NEXT:    br label [[IF_END:%.*]]
391; CHECK:       if.else:
392; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
393; CHECK:       if.then2:
394; CHECK-NEXT:    [[FNEG2:%.*]] = fneg float [[X]]
395; CHECK-NEXT:    br label [[IF_END]]
396; CHECK:       if.end:
397; CHECK-NEXT:    [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[FNEG2]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
398; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.fabs.f32(float [[VALUE]])
399; CHECK-NEXT:    ret float [[RET]]
400;
401  %i32 = bitcast float %x to i32
402  %cmp = icmp slt i32 %i32, 0
403  br i1 %cmp, label %if.then1, label %if.else
404
405if.then1:
406  %fneg = fneg float %x
407  br label %if.end
408
409if.else:
410  br i1 %cond, label %if.then2, label %if.end
411
412if.then2:
413  %fneg2 = fneg float %x
414  br label %if.end
415
416if.end:
417  %value = phi float [ %fneg, %if.then1 ], [ %fneg2, %if.then2 ], [ %x, %if.else ]
418  %ret = call float @llvm.fabs.f32(float %value)
419  ret float %ret
420}
421
422define <2 x float> @test_signbit_check_wrong_type(<2 x float> %x, i1 %cond) {
423; CHECK-LABEL: define <2 x float> @test_signbit_check_wrong_type(
424; CHECK-SAME: <2 x float> [[X:%.*]], i1 [[COND:%.*]]) {
425; CHECK-NEXT:    [[I32:%.*]] = bitcast <2 x float> [[X]] to i64
426; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[I32]], 0
427; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
428; CHECK:       if.then1:
429; CHECK-NEXT:    [[FNEG:%.*]] = fneg <2 x float> [[X]]
430; CHECK-NEXT:    br label [[IF_END:%.*]]
431; CHECK:       if.else:
432; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
433; CHECK:       if.then2:
434; CHECK-NEXT:    br label [[IF_END]]
435; CHECK:       if.end:
436; CHECK-NEXT:    [[VALUE:%.*]] = phi <2 x float> [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
437; CHECK-NEXT:    [[RET:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[VALUE]])
438; CHECK-NEXT:    ret <2 x float> [[RET]]
439;
440  %i32 = bitcast <2 x float> %x to i64
441  %cmp = icmp slt i64 %i32, 0
442  br i1 %cmp, label %if.then1, label %if.else
443
444if.then1:
445  %fneg = fneg <2 x float> %x
446  br label %if.end
447
448if.else:
449  br i1 %cond, label %if.then2, label %if.end
450
451if.then2:
452  br label %if.end
453
454if.end:
455  %value = phi <2 x float> [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ]
456  %ret = call <2 x float> @llvm.fabs.v2f32(<2 x float> %value)
457  ret <2 x float> %ret
458}
459
460define i1 @pr118257(half %v0, half %v1) {
461; CHECK-LABEL: define i1 @pr118257(
462; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) {
463; CHECK-NEXT:  entry:
464; CHECK-NEXT:    [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000
465; CHECK-NEXT:    [[CAST0:%.*]] = bitcast half [[V0]] to i16
466; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i16 [[CAST0]], 0
467; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]]
468; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]]
469; CHECK:       if.else:
470; CHECK-NEXT:    [[CAST1:%.*]] = bitcast half [[V1]] to i16
471; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0
472; CHECK-NEXT:    ret i1 [[CMP3]]
473; CHECK:       if.end:
474; CHECK-NEXT:    ret i1 false
475;
476entry:
477  %cmp1 = fcmp une half %v1, 0.000000e+00
478  %cast0 = bitcast half %v0 to i16
479  %cmp2 = icmp slt i16 %cast0, 0
480  %or.cond = or i1 %cmp1, %cmp2
481  br i1 %or.cond, label %if.end, label %if.else
482
483if.else:
484  %cast1 = bitcast half %v1 to i16
485  %cmp3 = icmp slt i16 %cast1, 0
486  ret i1 %cmp3
487
488if.end:
489  ret i1 false
490}
491
492define i1 @pr118257_is_fpclass(half %v0, half %v1) {
493; CHECK-LABEL: define i1 @pr118257_is_fpclass(
494; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) {
495; CHECK-NEXT:  entry:
496; CHECK-NEXT:    [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000
497; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @llvm.is.fpclass.f16(half [[V0]], i32 35)
498; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]]
499; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]]
500; CHECK:       if.else:
501; CHECK-NEXT:    [[CAST1:%.*]] = bitcast half [[V1]] to i16
502; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0
503; CHECK-NEXT:    ret i1 [[CMP3]]
504; CHECK:       if.end:
505; CHECK-NEXT:    ret i1 false
506;
507entry:
508  %cmp1 = fcmp une half %v1, 0.000000e+00
509  %cmp2 = call i1 @llvm.is.fpclass.half(half %v0, i32 35)
510  %or.cond = or i1 %cmp1, %cmp2
511  br i1 %or.cond, label %if.end, label %if.else
512
513if.else:
514  %cast1 = bitcast half %v1 to i16
515  %cmp3 = icmp slt i16 %cast1, 0
516  ret i1 %cmp3
517
518if.end:
519  ret i1 false
520}
521