1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instcombine -S | FileCheck %s
3
4; Infinity
5
6define i1 @inf0(double %arg) {
7; CHECK-LABEL: @inf0(
8; CHECK-NEXT:    ret i1 false
9;
10  %tmp = fcmp ogt double %arg, 0x7FF0000000000000
11  ret i1 %tmp
12}
13
14define i1 @inf1(double %arg) {
15; CHECK-LABEL: @inf1(
16; CHECK-NEXT:    ret i1 true
17;
18  %tmp = fcmp ule double %arg, 0x7FF0000000000000
19  ret i1 %tmp
20}
21
22; Negative infinity
23
24define i1 @ninf0(double %arg) {
25; CHECK-LABEL: @ninf0(
26; CHECK-NEXT:    ret i1 false
27;
28  %tmp = fcmp olt double %arg, 0xFFF0000000000000
29  ret i1 %tmp
30}
31
32define i1 @ninf1(double %arg) {
33; CHECK-LABEL: @ninf1(
34; CHECK-NEXT:    ret i1 true
35;
36  %tmp = fcmp uge double %arg, 0xFFF0000000000000
37  ret i1 %tmp
38}
39
40; NaNs
41
42define i1 @nan0(double %arg) {
43; CHECK-LABEL: @nan0(
44; CHECK-NEXT:    ret i1 false
45;
46  %tmp = fcmp ord double %arg, 0x7FF00000FFFFFFFF
47  ret i1 %tmp
48}
49
50define i1 @nan1(double %arg) {
51; CHECK-LABEL: @nan1(
52; CHECK-NEXT:    ret i1 false
53;
54  %tmp = fcmp oeq double %arg, 0x7FF00000FFFFFFFF
55  ret i1 %tmp
56}
57
58define i1 @nan2(double %arg) {
59; CHECK-LABEL: @nan2(
60; CHECK-NEXT:    ret i1 false
61;
62  %tmp = fcmp olt double %arg, 0x7FF00000FFFFFFFF
63  ret i1 %tmp
64}
65
66define i1 @nan3(double %arg) {
67; CHECK-LABEL: @nan3(
68; CHECK-NEXT:    ret i1 true
69;
70  %tmp = fcmp uno double %arg, 0x7FF00000FFFFFFFF
71  ret i1 %tmp
72}
73
74define i1 @nan4(double %arg) {
75; CHECK-LABEL: @nan4(
76; CHECK-NEXT:    ret i1 true
77;
78  %tmp = fcmp une double %arg, 0x7FF00000FFFFFFFF
79  ret i1 %tmp
80}
81
82define i1 @nan5(double %arg) {
83; CHECK-LABEL: @nan5(
84; CHECK-NEXT:    ret i1 true
85;
86  %tmp = fcmp ult double %arg, 0x7FF00000FFFFFFFF
87  ret i1 %tmp
88}
89
90; Negative NaN.
91
92define i1 @nnan0(double %arg) {
93; CHECK-LABEL: @nnan0(
94; CHECK-NEXT:    ret i1 false
95;
96  %tmp = fcmp ord double %arg, 0xFFF00000FFFFFFFF
97  ret i1 %tmp
98}
99
100define i1 @nnan1(double %arg) {
101; CHECK-LABEL: @nnan1(
102; CHECK-NEXT:    ret i1 false
103;
104  %tmp = fcmp oeq double %arg, 0xFFF00000FFFFFFFF
105  ret i1 %tmp
106}
107
108define i1 @nnan2(double %arg) {
109; CHECK-LABEL: @nnan2(
110; CHECK-NEXT:    ret i1 false
111;
112  %tmp = fcmp olt double %arg, 0xFFF00000FFFFFFFF
113  ret i1 %tmp
114}
115
116define i1 @nnan3(double %arg) {
117; CHECK-LABEL: @nnan3(
118; CHECK-NEXT:    ret i1 true
119;
120  %tmp = fcmp uno double %arg, 0xFFF00000FFFFFFFF
121  ret i1 %tmp
122}
123
124define i1 @nnan4(double %arg) {
125; CHECK-LABEL: @nnan4(
126; CHECK-NEXT:    ret i1 true
127;
128  %tmp = fcmp une double %arg, 0xFFF00000FFFFFFFF
129  ret i1 %tmp
130}
131
132define i1 @nnan5(double %arg) {
133; CHECK-LABEL: @nnan5(
134; CHECK-NEXT:    ret i1 true
135;
136  %tmp = fcmp ult double %arg, 0xFFF00000FFFFFFFF
137  ret i1 %tmp
138}
139
140; Negative zero.
141
142define i1 @nzero0() {
143; CHECK-LABEL: @nzero0(
144; CHECK-NEXT:    ret i1 true
145;
146  %tmp = fcmp oeq double 0.0, -0.0
147  ret i1 %tmp
148}
149
150define i1 @nzero1() {
151; CHECK-LABEL: @nzero1(
152; CHECK-NEXT:    ret i1 false
153;
154  %tmp = fcmp ogt double 0.0, -0.0
155  ret i1 %tmp
156}
157
158; Misc.
159
160define i1 @misc0(double %arg) {
161; CHECK-LABEL: @misc0(
162; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double %arg, 0.000000e+00
163; CHECK-NEXT:    ret i1 [[TMP]]
164;
165  %tmp = fcmp oeq double %arg, %arg
166  ret i1 %tmp
167}
168
169define i1 @misc1(double %arg) {
170; CHECK-LABEL: @misc1(
171; CHECK-NEXT:    ret i1 false
172;
173  %tmp = fcmp one double %arg, %arg
174  ret i1 %tmp
175}
176
177