xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/cast-int-fcmp-eq-0.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_0_uitofp(
4*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
6*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_0_uitofp(i32 %i) {
7*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
8*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0.0
9*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_n0_uitofp(
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
15*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_n0_uitofp(i32 %i) {
16*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
17*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, -0.0
18*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_0_sitofp(
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
24*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_0_sitofp(i32 %i) {
25*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
26*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0.0
27*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_n0_sitofp(
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
33*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_n0_sitofp(i32 %i) {
34*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
35*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, -0.0
36*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_one_int_0_uitofp(
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
42*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_one_int_0_uitofp(i32 %i) {
43*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
44*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %f, 0.0
45*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_one_int_n0_uitofp(
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
51*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_one_int_n0_uitofp(i32 %i) {
52*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
53*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %f, -0.0
54*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_one_int_0_sitofp(
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
60*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_one_int_0_sitofp(i32 %i) {
61*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
62*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %f, 0.0
63*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_one_int_n0_sitofp(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
69*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_one_int_n0_sitofp(i32 %i) {
70*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
71*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %f, -0.0
72*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ueq_int_0_uitofp(
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
78*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ueq_int_0_uitofp(i32 %i) {
79*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
80*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %f, 0.0
81*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ueq_int_n0_uitofp(
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
87*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ueq_int_n0_uitofp(i32 %i) {
88*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
89*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %f, -0.0
90*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ueq_int_0_sitofp(
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
96*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ueq_int_0_sitofp(i32 %i) {
97*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
98*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %f, 0.0
99*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ueq_int_n0_sitofp(
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i32 %i, 0
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
105*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ueq_int_n0_sitofp(i32 %i) {
106*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
107*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %f, -0.0
108*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_une_int_0_uitofp(
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
114*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_une_int_0_uitofp(i32 %i) {
115*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
116*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %f, 0.0
117*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_une_int_n0_uitofp(
121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
123*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_une_int_n0_uitofp(i32 %i) {
124*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
125*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %f, -0.0
126*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_une_int_0_sitofp(
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
132*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_une_int_0_sitofp(i32 %i) {
133*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
134*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %f, 0.0
135*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_une_int_n0_sitofp(
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %i, 0
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
141*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_une_int_n0_sitofp(i32 %i) {
142*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
143*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %f, -0.0
144*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ogt_int_0_uitofp(
148*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 %i, 0
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
150*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ogt_int_0_uitofp(i32 %i) {
151*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
152*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %f, 0.0
153*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ogt_int_n0_uitofp(
157*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 %i, 0
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
159*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ogt_int_n0_uitofp(i32 %i) {
160*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
161*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %f, -0.0
162*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ogt_int_0_sitofp(
166*9880d681SAndroid Build Coastguard Worker; CHECK: icmp sgt i32 %i, 0
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
168*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ogt_int_0_sitofp(i32 %i) {
169*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
170*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %f, 0.0
171*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ogt_int_n0_sitofp(
175*9880d681SAndroid Build Coastguard Worker; CHECK: icmp sgt i32 %i, 0
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
177*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ogt_int_n0_sitofp(i32 %i) {
178*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
179*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %f, -0.0
180*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ole_int_0_uitofp(
184*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 %i, 0
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
186*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ole_int_0_uitofp(i32 %i) {
187*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
188*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ole float %f, 0.0
189*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ole_int_0_sitofp(
193*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i32 %i, 1
194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
195*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ole_int_0_sitofp(i32 %i) {
196*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
197*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ole float %f, 0.0
198*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
199*9880d681SAndroid Build Coastguard Worker}
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_olt_int_0_uitofp(
202*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
203*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_olt_int_0_uitofp(i32 %i) {
204*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
205*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %f, 0.0
206*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_olt_int_0_sitofp(
210*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i32 %i, 0
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
212*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_olt_int_0_sitofp(i32 %i) {
213*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
214*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %f, 0.0
215*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_uitofp(
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i64 %i, 0
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
221*9880d681SAndroid Build Coastguard Workerdefine i1 @i64_cast_cmp_oeq_int_0_uitofp(i64 %i) {
222*9880d681SAndroid Build Coastguard Worker  %f = uitofp i64 %i to float
223*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0.0
224*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_sitofp(
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i64 %i, 0
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
230*9880d681SAndroid Build Coastguard Workerdefine i1 @i64_cast_cmp_oeq_int_0_sitofp(i64 %i) {
231*9880d681SAndroid Build Coastguard Worker  %f = sitofp i64 %i to float
232*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0.0
233*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_uitofp_half(
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i64 %i, 0
238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
239*9880d681SAndroid Build Coastguard Workerdefine i1 @i64_cast_cmp_oeq_int_0_uitofp_half(i64 %i) {
240*9880d681SAndroid Build Coastguard Worker  %f = uitofp i64 %i to half
241*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq half %f, 0.0
242*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_sitofp_half(
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i64 %i, 0
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
248*9880d681SAndroid Build Coastguard Workerdefine i1 @i64_cast_cmp_oeq_int_0_sitofp_half(i64 %i) {
249*9880d681SAndroid Build Coastguard Worker  %f = sitofp i64 %i to half
250*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq half %f, 0.0
251*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_0_uitofp_ppcf128(
255*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
256*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
258*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_0_uitofp_ppcf128(i32 %i) {
259*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to ppc_fp128
260*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq ppc_fp128 %f, 0xM00000000000000000000000000000000
261*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
262*9880d681SAndroid Build Coastguard Worker}
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker; Since 0xFFFFFF fits in a float, and one less and
265*9880d681SAndroid Build Coastguard Worker; one more than it also fits without rounding, the
266*9880d681SAndroid Build Coastguard Worker; test can be optimized to an integer compare.
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24max_uitofp(
269*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 %i, 16777215
270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
271*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i24max_uitofp(i32 %i) {
272*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
273*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x416FFFFFE0000000
274*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24max_sitofp(
278*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 %i, 16777215
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
280*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i24max_sitofp(i32 %i) {
281*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
282*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x416FFFFFE0000000
283*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker; Though 0x1000000 fits in a float, one more than it
287*9880d681SAndroid Build Coastguard Worker; would round to it too, hence a single integer comparison
288*9880d681SAndroid Build Coastguard Worker; does not suffice.
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24maxp1_uitofp(
291*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
292*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker; XCHECK: icmp eq i32 %i, 16777216
295*9880d681SAndroid Build Coastguard Worker; XCHECK-NEXT: ret
296*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i24maxp1_uitofp(i32 %i) {
297*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
298*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x4170000000000000
299*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
300*9880d681SAndroid Build Coastguard Worker}
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24maxp1_sitofp(
303*9880d681SAndroid Build Coastguard Worker; CHECK: sitofp
304*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Worker; XCHECK: icmp eq i32 %i, 16777216
307*9880d681SAndroid Build Coastguard Worker; XCHECK-NEXT: ret
308*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i24maxp1_sitofp(i32 %i) {
309*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
310*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x4170000000000000
311*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
312*9880d681SAndroid Build Coastguard Worker}
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32umax_uitofp(
315*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
316*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
318*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i32umax_uitofp(i32 %i) {
319*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
320*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x41F0000000000000
321*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
322*9880d681SAndroid Build Coastguard Worker}
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker; 32-bit unsigned integer cannot possibly round up to 1<<33
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_big_uitofp(
326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false
327*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_big_uitofp(i32 %i) {
328*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
329*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x4200000000000000
330*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
331*9880d681SAndroid Build Coastguard Worker}
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker; 32-bit signed integer cannot possibly round up to 1<<32
334*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32umax_sitofp(
335*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false
336*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i32umax_sitofp(i32 %i) {
337*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
338*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x41F0000000000000
339*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
340*9880d681SAndroid Build Coastguard Worker}
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imin_uitofp(
343*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
344*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
346*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i32imin_uitofp(i32 %i) {
347*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
348*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0xC1E0000000000000
349*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
350*9880d681SAndroid Build Coastguard Worker}
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imin_sitofp(
353*9880d681SAndroid Build Coastguard Worker; CHECK: sitofp
354*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
356*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i32imin_sitofp(i32 %i) {
357*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
358*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0xC1E0000000000000
359*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imax_uitofp(
363*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
364*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
366*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i32imax_uitofp(i32 %i) {
367*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
368*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x41E0000000000000
369*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
370*9880d681SAndroid Build Coastguard Worker}
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imax_sitofp(
373*9880d681SAndroid Build Coastguard Worker; CHECK: sitofp
374*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
375*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
376*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_i32imax_sitofp(i32 %i) {
377*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
378*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x41E0000000000000
379*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
380*9880d681SAndroid Build Coastguard Worker}
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_negi32umax_uitofp(
383*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
384*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
385*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
386*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_negi32umax_uitofp(i32 %i) {
387*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
388*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0xC1F0000000000000
389*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
390*9880d681SAndroid Build Coastguard Worker}
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker; 32-bit signed integer cannot possibly round to -1<<32
393*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_negi32umax_sitofp(
394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false
395*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_negi32umax_sitofp(i32 %i) {
396*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
397*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0xC1F0000000000000
398*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
399*9880d681SAndroid Build Coastguard Worker}
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_half_uitofp(
402*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
403*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_half_uitofp(i32 %i) {
404*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
405*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0.5
406*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
407*9880d681SAndroid Build Coastguard Worker}
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_half_sitofp(
410*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
411*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_half_sitofp(i32 %i) {
412*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
413*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0.5
414*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
415*9880d681SAndroid Build Coastguard Worker}
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_one_half_uitofp(
418*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
419*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_one_half_uitofp(i32 %i) {
420*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
421*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %f, 0.5
422*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
423*9880d681SAndroid Build Coastguard Worker}
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_one_half_sitofp(
426*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
427*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_one_half_sitofp(i32 %i) {
428*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
429*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %f, 0.5
430*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ueq_half_uitofp(
434*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
435*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ueq_half_uitofp(i32 %i) {
436*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
437*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %f, 0.5
438*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
439*9880d681SAndroid Build Coastguard Worker}
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_ueq_half_sitofp(
442*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
443*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_ueq_half_sitofp(i32 %i) {
444*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
445*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %f, 0.5
446*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_une_half_uitofp(
450*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
451*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_une_half_uitofp(i32 %i) {
452*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
453*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %f, 0.5
454*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
455*9880d681SAndroid Build Coastguard Worker}
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_une_half_sitofp(
458*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
459*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_une_half_sitofp(i32 %i) {
460*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
461*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %f, 0.5
462*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
463*9880d681SAndroid Build Coastguard Worker}
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_inf_uitofp(
466*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false
467*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_inf_uitofp(i32 %i) {
468*9880d681SAndroid Build Coastguard Worker  %f = uitofp i32 %i to float
469*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x7FF0000000000000
470*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
471*9880d681SAndroid Build Coastguard Worker}
472*9880d681SAndroid Build Coastguard Worker
473*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i32_cast_cmp_oeq_int_inf_sitofp(
474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false
475*9880d681SAndroid Build Coastguard Workerdefine i1 @i32_cast_cmp_oeq_int_inf_sitofp(i32 %i) {
476*9880d681SAndroid Build Coastguard Worker  %f = sitofp i32 %i to float
477*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x7FF0000000000000
478*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
479*9880d681SAndroid Build Coastguard Worker}
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Worker; An i128 could round to an IEEE single-precision infinity.
482*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @i128_cast_cmp_oeq_int_inf_uitofp(
483*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
484*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq
485*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
486*9880d681SAndroid Build Coastguard Workerdefine i1 @i128_cast_cmp_oeq_int_inf_uitofp(i128 %i) {
487*9880d681SAndroid Build Coastguard Worker  %f = uitofp i128 %i to float
488*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %f, 0x7FF0000000000000
489*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
490*9880d681SAndroid Build Coastguard Worker}
491