1; RUN: opt < %s -instcombine -S | FileCheck %s
2
3define zeroext i8 @t1(float %x, float %y) nounwind {
4       %a = fcmp ueq float %x, %y
5       %b = fcmp ord float %x, %y
6       %c = and i1 %a, %b
7       %retval = zext i1 %c to i8
8       ret i8 %retval
9; CHECK: t1
10; CHECK: fcmp oeq float %x, %y
11; CHECK-NOT: fcmp ueq float %x, %y
12; CHECK-NOT: fcmp ord float %x, %y
13; CHECK-NOT: and
14}
15
16define zeroext i8 @t2(float %x, float %y) nounwind {
17       %a = fcmp olt float %x, %y
18       %b = fcmp ord float %x, %y
19       %c = and i1 %a, %b
20       %retval = zext i1 %c to i8
21       ret i8 %retval
22; CHECK: t2
23; CHECK: fcmp olt float %x, %y
24; CHECK-NOT: fcmp ord float %x, %y
25; CHECK-NOT: and
26}
27
28define zeroext i8 @t3(float %x, float %y) nounwind {
29       %a = fcmp oge float %x, %y
30       %b = fcmp uno float %x, %y
31       %c = and i1 %a, %b
32       %retval = zext i1 %c to i8
33       ret i8 %retval
34; CHECK: t3
35; CHECK: ret i8 0
36}
37
38define zeroext i8 @t4(float %x, float %y) nounwind {
39       %a = fcmp one float %y, %x
40       %b = fcmp ord float %x, %y
41       %c = and i1 %a, %b
42       %retval = zext i1 %c to i8
43       ret i8 %retval
44; CHECK: t4
45; CHECK: fcmp one float %y, %x
46; CHECK-NOT: fcmp ord float %x, %y
47; CHECK-NOT: and
48}
49
50define zeroext i8 @t5(float %x, float %y) nounwind {
51       %a = fcmp ord float %x, %y
52       %b = fcmp uno float %x, %y
53       %c = and i1 %a, %b
54       %retval = zext i1 %c to i8
55       ret i8 %retval
56; CHECK: t5
57; CHECK: ret i8 0
58}
59
60define zeroext i8 @t6(float %x, float %y) nounwind {
61       %a = fcmp uno float %x, %y
62       %b = fcmp ord float %x, %y
63       %c = and i1 %a, %b
64       %retval = zext i1 %c to i8
65       ret i8 %retval
66; CHECK: t6
67; CHECK: ret i8 0
68}
69
70define zeroext i8 @t7(float %x, float %y) nounwind {
71       %a = fcmp uno float %x, %y
72       %b = fcmp ult float %x, %y
73       %c = and i1 %a, %b
74       %retval = zext i1 %c to i8
75       ret i8 %retval
76; CHECK: t7
77; CHECK: fcmp uno
78; CHECK-NOT: fcmp ult
79}
80
81; PR15737
82define i1 @t8(float %a, double %b) {
83  %cmp = fcmp ord float %a, 0.000000e+00
84  %cmp1 = fcmp ord double %b, 0.000000e+00
85  %and = and i1 %cmp, %cmp1
86  ret i1 %and
87; CHECK: t8
88; CHECK: fcmp ord
89; CHECK: fcmp ord
90}
91
92define <2 x i1> @t9(<2 x float> %a, <2 x double> %b) {
93  %cmp = fcmp ord <2 x float> %a, zeroinitializer
94  %cmp1 = fcmp ord <2 x double> %b, zeroinitializer
95  %and = and <2 x i1> %cmp, %cmp1
96  ret <2 x i1> %and
97; CHECK: t9
98; CHECK: fcmp ord
99; CHECK: fcmp ord
100}
101