xref: /llvm-project/llvm/test/Transforms/InstCombine/fpclass-check-idioms.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1390b9974SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2390b9974SYingwei Zheng; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3390b9974SYingwei Zheng
4390b9974SYingwei Zhengdefine i1 @f32_fcnan_fcinf(float %a) {
5390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan_fcinf(
6390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
7390b9974SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[A]])
8390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp ueq float [[TMP1]], 0x7FF0000000000000
9390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
10390b9974SYingwei Zheng;
11390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
12390b9974SYingwei Zheng  %and = and i32 %i32, 2139095040
13390b9974SYingwei Zheng  %cmp = icmp eq i32 %and, 2139095040
14390b9974SYingwei Zheng  ret i1 %cmp
15390b9974SYingwei Zheng}
16390b9974SYingwei Zheng
1744706bd4Sostannarddefine i1 @f32_fcnan_fcinf_strictfp(float %a) strictfp {
1844706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_fcinf_strictfp(
1944706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0:[0-9]+]] {
2044706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 519)
2144706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
2244706bd4Sostannard;
2344706bd4Sostannard  %i32 = bitcast float %a to i32
2444706bd4Sostannard  %and = and i32 %i32, 2139095040
2544706bd4Sostannard  %cmp = icmp eq i32 %and, 2139095040
2644706bd4Sostannard  ret i1 %cmp
2744706bd4Sostannard}
2844706bd4Sostannard
29390b9974SYingwei Zhengdefine i1 @f32_not_fcnan_fcinf(float %a) {
30390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_not_fcnan_fcinf(
31390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
32390b9974SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[A]])
33390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp one float [[TMP1]], 0x7FF0000000000000
34390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
35390b9974SYingwei Zheng;
36390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
37390b9974SYingwei Zheng  %and = and i32 %i32, 2139095040
38390b9974SYingwei Zheng  %cmp = icmp ne i32 %and, 2139095040
39390b9974SYingwei Zheng  ret i1 %cmp
40390b9974SYingwei Zheng}
41390b9974SYingwei Zheng
4244706bd4Sostannarddefine i1 @f32_not_fcnan_fcinf_strictfp(float %a) strictfp {
4344706bd4Sostannard; CHECK-LABEL: define i1 @f32_not_fcnan_fcinf_strictfp(
4444706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
4544706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 504)
4644706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
4744706bd4Sostannard;
4844706bd4Sostannard  %i32 = bitcast float %a to i32
4944706bd4Sostannard  %and = and i32 %i32, 2139095040
5044706bd4Sostannard  %cmp = icmp ne i32 %and, 2139095040
5144706bd4Sostannard  ret i1 %cmp
5244706bd4Sostannard}
5344706bd4Sostannard
54390b9974SYingwei Zhengdefine i1 @f64_fcnan_fcinf(double %a) {
55390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f64_fcnan_fcinf(
56390b9974SYingwei Zheng; CHECK-SAME: double [[A:%.*]]) {
57390b9974SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[A]])
58390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp ueq double [[TMP1]], 0x7FF0000000000000
59390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
60390b9974SYingwei Zheng;
61390b9974SYingwei Zheng  %i64 = bitcast double %a to i64
62390b9974SYingwei Zheng  %and = and i64 %i64, 9218868437227405312
63390b9974SYingwei Zheng  %cmp = icmp eq i64 %and, 9218868437227405312
64390b9974SYingwei Zheng  ret i1 %cmp
65390b9974SYingwei Zheng}
66390b9974SYingwei Zheng
6744706bd4Sostannarddefine i1 @f64_fcnan_fcinf_strictfp(double %a) strictfp {
6844706bd4Sostannard; CHECK-LABEL: define i1 @f64_fcnan_fcinf_strictfp(
6944706bd4Sostannard; CHECK-SAME: double [[A:%.*]]) #[[ATTR0]] {
7044706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f64(double [[A]], i32 519)
7144706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
7244706bd4Sostannard;
7344706bd4Sostannard  %i64 = bitcast double %a to i64
7444706bd4Sostannard  %and = and i64 %i64, 9218868437227405312
7544706bd4Sostannard  %cmp = icmp eq i64 %and, 9218868437227405312
7644706bd4Sostannard  ret i1 %cmp
7744706bd4Sostannard}
7844706bd4Sostannard
79390b9974SYingwei Zhengdefine i1 @f32_fcinf(float %a) {
80390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcinf(
81390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
82390b9974SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[A]])
83c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[TMP1]], 0x7FF0000000000000
84390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
85390b9974SYingwei Zheng;
86390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
87390b9974SYingwei Zheng  %and = and i32 %i32, 2147483647
88390b9974SYingwei Zheng  %cmp = icmp eq i32 %and, 2139095040
89390b9974SYingwei Zheng  ret i1 %cmp
90390b9974SYingwei Zheng}
91390b9974SYingwei Zheng
9244706bd4Sostannarddefine i1 @f32_fcinf_strictfp(float %a) strictfp {
9344706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcinf_strictfp(
9444706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
9544706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 516)
9644706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
9744706bd4Sostannard;
9844706bd4Sostannard  %i32 = bitcast float %a to i32
9944706bd4Sostannard  %and = and i32 %i32, 2147483647
10044706bd4Sostannard  %cmp = icmp eq i32 %and, 2139095040
10144706bd4Sostannard  ret i1 %cmp
10244706bd4Sostannard}
10344706bd4Sostannard
104c8ca98a2SYingwei Zhengdefine i1 @f32_fcposinf(float %a) {
105c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposinf(
106c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
107c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[A]], 0x7FF0000000000000
108c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
109c8ca98a2SYingwei Zheng;
110c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
111c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %i32, 2139095040
112c8ca98a2SYingwei Zheng  ret i1 %cmp
113c8ca98a2SYingwei Zheng}
114c8ca98a2SYingwei Zheng
11544706bd4Sostannarddefine i1 @f32_fcposinf_strictfp(float %a) strictfp {
11644706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposinf_strictfp(
11744706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
11844706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 512)
11944706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
12044706bd4Sostannard;
12144706bd4Sostannard  %i32 = bitcast float %a to i32
12244706bd4Sostannard  %cmp = icmp eq i32 %i32, 2139095040
12344706bd4Sostannard  ret i1 %cmp
12444706bd4Sostannard}
12544706bd4Sostannard
126c8ca98a2SYingwei Zhengdefine i1 @f32_fcneginf(float %a) {
127c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcneginf(
128c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
129c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[A]], 0xFFF0000000000000
130c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
131c8ca98a2SYingwei Zheng;
132c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
133c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %i32, 4286578688
134c8ca98a2SYingwei Zheng  ret i1 %cmp
135c8ca98a2SYingwei Zheng}
136c8ca98a2SYingwei Zheng
13744706bd4Sostannarddefine i1 @f32_fcneginf_strictfp(float %a) strictfp {
13844706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcneginf_strictfp(
13944706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
14044706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 4)
14144706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
14244706bd4Sostannard;
14344706bd4Sostannard  %i32 = bitcast float %a to i32
14444706bd4Sostannard  %cmp = icmp eq i32 %i32, 4286578688
14544706bd4Sostannard  ret i1 %cmp
14644706bd4Sostannard}
14744706bd4Sostannard
148c8ca98a2SYingwei Zhengdefine i1 @f32_fcposzero(float %a) {
149c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposzero(
150c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
151c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 64)
152c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
153c8ca98a2SYingwei Zheng;
154c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
155c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %i32, 0
156c8ca98a2SYingwei Zheng  ret i1 %cmp
157c8ca98a2SYingwei Zheng}
158c8ca98a2SYingwei Zheng
15944706bd4Sostannarddefine i1 @f32_fcposzero_strictfp(float %a) strictfp {
16044706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposzero_strictfp(
16144706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
16244706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 64)
16344706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
16444706bd4Sostannard;
16544706bd4Sostannard  %i32 = bitcast float %a to i32
16644706bd4Sostannard  %cmp = icmp eq i32 %i32, 0
16744706bd4Sostannard  ret i1 %cmp
16844706bd4Sostannard}
16944706bd4Sostannard
170c8ca98a2SYingwei Zhengdefine i1 @f32_fcnegzero(float %a) {
171c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnegzero(
172c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
173c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 32)
174c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
175c8ca98a2SYingwei Zheng;
176c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
177c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %i32, 2147483648
178c8ca98a2SYingwei Zheng  ret i1 %cmp
179c8ca98a2SYingwei Zheng}
180c8ca98a2SYingwei Zheng
18144706bd4Sostannarddefine i1 @f32_fcnegzero_strictfp(float %a) strictfp {
18244706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnegzero_strictfp(
18344706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
18444706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 32)
18544706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
18644706bd4Sostannard;
18744706bd4Sostannard  %i32 = bitcast float %a to i32
18844706bd4Sostannard  %cmp = icmp eq i32 %i32, 2147483648
18944706bd4Sostannard  ret i1 %cmp
19044706bd4Sostannard}
19144706bd4Sostannard
192c8ca98a2SYingwei Zhengdefine i1 @f32_fczero(float %a) {
193c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fczero(
194c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
195c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[A]], 0.000000e+00
196c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
197c8ca98a2SYingwei Zheng;
198c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
199c8ca98a2SYingwei Zheng  %and = and i32 %i32, 2147483647
200c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %and, 0
201c8ca98a2SYingwei Zheng  ret i1 %cmp
202c8ca98a2SYingwei Zheng}
203c8ca98a2SYingwei Zheng
20444706bd4Sostannarddefine i1 @f32_fczero_strictfp(float %a) strictfp {
20544706bd4Sostannard; CHECK-LABEL: define i1 @f32_fczero_strictfp(
20644706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
20744706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 96)
20844706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
20944706bd4Sostannard;
21044706bd4Sostannard  %i32 = bitcast float %a to i32
21144706bd4Sostannard  %and = and i32 %i32, 2147483647
21244706bd4Sostannard  %cmp = icmp eq i32 %and, 0
21344706bd4Sostannard  ret i1 %cmp
21444706bd4Sostannard}
21544706bd4Sostannard
216c8ca98a2SYingwei Zheng; TODO: handle more fpclass check idioms
217390b9974SYingwei Zhengdefine i1 @f32_fcnan(float %a) {
218390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan(
219390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
220dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RES:%.*]] = fcmp uno float [[A]], 0.000000e+00
221390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[RES]]
222390b9974SYingwei Zheng;
223390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
224390b9974SYingwei Zheng  %and1 = and i32 %i32, 2139095040
225390b9974SYingwei Zheng  %cmp1 = icmp eq i32 %and1, 2139095040
226390b9974SYingwei Zheng  %and2 = and i32 %i32, 8388607
227390b9974SYingwei Zheng  %cmp2 = icmp ne i32 %and2, 0
228390b9974SYingwei Zheng  %res = and i1 %cmp1, %cmp2
229390b9974SYingwei Zheng  ret i1 %res
230390b9974SYingwei Zheng}
231390b9974SYingwei Zheng
23244706bd4Sostannarddefine i1 @f32_fcnan_strictfp(float %a) strictfp {
23344706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_strictfp(
23444706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
23544706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
23644706bd4Sostannard; CHECK-NEXT:    [[AND1:%.*]] = and i32 [[I32]], 2139095040
23744706bd4Sostannard; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[AND1]], 2139095040
23844706bd4Sostannard; CHECK-NEXT:    [[AND2:%.*]] = and i32 [[I32]], 8388607
23944706bd4Sostannard; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i32 [[AND2]], 0
24044706bd4Sostannard; CHECK-NEXT:    [[RES:%.*]] = and i1 [[CMP1]], [[CMP2]]
24144706bd4Sostannard; CHECK-NEXT:    ret i1 [[RES]]
242390b9974SYingwei Zheng;
243390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
24444706bd4Sostannard  %and1 = and i32 %i32, 2139095040
24544706bd4Sostannard  %cmp1 = icmp eq i32 %and1, 2139095040
24644706bd4Sostannard  %and2 = and i32 %i32, 8388607
24744706bd4Sostannard  %cmp2 = icmp ne i32 %and2, 0
24844706bd4Sostannard  %res = and i1 %cmp1, %cmp2
24944706bd4Sostannard  ret i1 %res
250390b9974SYingwei Zheng}
251390b9974SYingwei Zheng
252390b9974SYingwei Zhengdefine <2 x i1> @f32_fcnan_fcinf_vec(<2 x float> %a) {
253390b9974SYingwei Zheng; CHECK-LABEL: define <2 x i1> @f32_fcnan_fcinf_vec(
254390b9974SYingwei Zheng; CHECK-SAME: <2 x float> [[A:%.*]]) {
255390b9974SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[A]])
256*38fffa63SPaul Walker; CHECK-NEXT:    [[CMP:%.*]] = fcmp ueq <2 x float> [[TMP1]], splat (float 0x7FF0000000000000)
257390b9974SYingwei Zheng; CHECK-NEXT:    ret <2 x i1> [[CMP]]
258390b9974SYingwei Zheng;
259390b9974SYingwei Zheng  %i32 = bitcast <2 x float> %a to <2 x i32>
260390b9974SYingwei Zheng  %and = and <2 x i32> %i32, <i32 2139095040, i32 2139095040>
261390b9974SYingwei Zheng  %cmp = icmp eq <2 x i32> %and, <i32 2139095040, i32 2139095040>
262390b9974SYingwei Zheng  ret <2 x i1> %cmp
263390b9974SYingwei Zheng}
264390b9974SYingwei Zheng
26544706bd4Sostannarddefine <2 x i1> @f32_fcnan_fcinf_vec_strictfp(<2 x float> %a) strictfp {
26644706bd4Sostannard; CHECK-LABEL: define <2 x i1> @f32_fcnan_fcinf_vec_strictfp(
26744706bd4Sostannard; CHECK-SAME: <2 x float> [[A:%.*]]) #[[ATTR0]] {
26844706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[A]], i32 519)
26944706bd4Sostannard; CHECK-NEXT:    ret <2 x i1> [[CMP]]
27044706bd4Sostannard;
27144706bd4Sostannard  %i32 = bitcast <2 x float> %a to <2 x i32>
27244706bd4Sostannard  %and = and <2 x i32> %i32, <i32 2139095040, i32 2139095040>
27344706bd4Sostannard  %cmp = icmp eq <2 x i32> %and, <i32 2139095040, i32 2139095040>
27444706bd4Sostannard  ret <2 x i1> %cmp
27544706bd4Sostannard}
27644706bd4Sostannard
277c8ca98a2SYingwei Zhengdefine <2 x i1> @f32_fcinf_vec(<2 x float> %a) {
278c8ca98a2SYingwei Zheng; CHECK-LABEL: define <2 x i1> @f32_fcinf_vec(
279c8ca98a2SYingwei Zheng; CHECK-SAME: <2 x float> [[A:%.*]]) {
280c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[A]])
281*38fffa63SPaul Walker; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq <2 x float> [[TMP1]], splat (float 0x7FF0000000000000)
282c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret <2 x i1> [[CMP]]
283c8ca98a2SYingwei Zheng;
284c8ca98a2SYingwei Zheng  %i32 = bitcast <2 x float> %a to <2 x i32>
285c8ca98a2SYingwei Zheng  %and = and <2 x i32> %i32, <i32 2147483647, i32 2147483647>
286c8ca98a2SYingwei Zheng  %cmp = icmp eq <2 x i32> %and, <i32 2139095040, i32 2139095040>
287c8ca98a2SYingwei Zheng  ret <2 x i1> %cmp
288c8ca98a2SYingwei Zheng}
289c8ca98a2SYingwei Zheng
29044706bd4Sostannarddefine <2 x i1> @f32_fcinf_vec_strictfp(<2 x float> %a) strictfp {
29144706bd4Sostannard; CHECK-LABEL: define <2 x i1> @f32_fcinf_vec_strictfp(
29244706bd4Sostannard; CHECK-SAME: <2 x float> [[A:%.*]]) #[[ATTR0]] {
29344706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[A]], i32 516)
29444706bd4Sostannard; CHECK-NEXT:    ret <2 x i1> [[CMP]]
29544706bd4Sostannard;
29644706bd4Sostannard  %i32 = bitcast <2 x float> %a to <2 x i32>
29744706bd4Sostannard  %and = and <2 x i32> %i32, <i32 2147483647, i32 2147483647>
29844706bd4Sostannard  %cmp = icmp eq <2 x i32> %and, <i32 2139095040, i32 2139095040>
29944706bd4Sostannard  ret <2 x i1> %cmp
30044706bd4Sostannard}
30144706bd4Sostannard
302390b9974SYingwei Zheng; Negative tests
303390b9974SYingwei Zheng
304390b9974SYingwei Zhengdefine i1 @f32_fcnan_fcinf_wrong_mask1(float %a) {
305390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_mask1(
306390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
307390b9974SYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
308390b9974SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i32 [[I32]], 2139095041
309390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 2139095040
310390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
311390b9974SYingwei Zheng;
312390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
313390b9974SYingwei Zheng  %and = and i32 %i32, 2139095041
314390b9974SYingwei Zheng  %cmp = icmp eq i32 %and, 2139095040
315390b9974SYingwei Zheng  ret i1 %cmp
316390b9974SYingwei Zheng}
317390b9974SYingwei Zheng
31844706bd4Sostannarddefine i1 @f32_fcnan_fcinf_wrong_mask1_strictfp(float %a) strictfp {
31944706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_mask1_strictfp(
32044706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
32144706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
32244706bd4Sostannard; CHECK-NEXT:    [[AND:%.*]] = and i32 [[I32]], 2139095041
32344706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 2139095040
32444706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
32544706bd4Sostannard;
32644706bd4Sostannard  %i32 = bitcast float %a to i32
32744706bd4Sostannard  %and = and i32 %i32, 2139095041
32844706bd4Sostannard  %cmp = icmp eq i32 %and, 2139095040
32944706bd4Sostannard  ret i1 %cmp
33044706bd4Sostannard}
33144706bd4Sostannard
332390b9974SYingwei Zhengdefine i1 @f32_fcnan_fcinf_wrong_mask2(float %a) {
333390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_mask2(
334390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
335390b9974SYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
336390b9974SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i32 [[I32]], 2139095040
337390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 2130706432
338390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
339390b9974SYingwei Zheng;
340390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
341390b9974SYingwei Zheng  %and = and i32 %i32, 2139095040
342390b9974SYingwei Zheng  %cmp = icmp eq i32 %and, 2130706432
343390b9974SYingwei Zheng  ret i1 %cmp
344390b9974SYingwei Zheng}
345390b9974SYingwei Zheng
34644706bd4Sostannarddefine i1 @f32_fcnan_fcinf_wrong_mask2_strictfp(float %a) strictfp {
34744706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_mask2_strictfp(
34844706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
34944706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
35044706bd4Sostannard; CHECK-NEXT:    [[AND:%.*]] = and i32 [[I32]], 2139095040
35144706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 2130706432
35244706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
35344706bd4Sostannard;
35444706bd4Sostannard  %i32 = bitcast float %a to i32
35544706bd4Sostannard  %and = and i32 %i32, 2139095040
35644706bd4Sostannard  %cmp = icmp eq i32 %and, 2130706432
35744706bd4Sostannard  ret i1 %cmp
35844706bd4Sostannard}
35944706bd4Sostannard
360390b9974SYingwei Zhengdefine i1 @f64_fcnan_fcinf_wrong_mask3(double %a) {
361390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f64_fcnan_fcinf_wrong_mask3(
362390b9974SYingwei Zheng; CHECK-SAME: double [[A:%.*]]) {
363390b9974SYingwei Zheng; CHECK-NEXT:    [[I64:%.*]] = bitcast double [[A]] to i64
364390b9974SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i64 [[I64]], 2139095040
365390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[AND]], 2139095040
366390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
367390b9974SYingwei Zheng;
368390b9974SYingwei Zheng  %i64 = bitcast double %a to i64
369390b9974SYingwei Zheng  %and = and i64 %i64, 2139095040
370390b9974SYingwei Zheng  %cmp = icmp eq i64 %and, 2139095040
371390b9974SYingwei Zheng  ret i1 %cmp
372390b9974SYingwei Zheng}
373390b9974SYingwei Zheng
37444706bd4Sostannarddefine i1 @f64_fcnan_fcinf_wrong_mask3_strictfp(double %a) strictfp {
37544706bd4Sostannard; CHECK-LABEL: define i1 @f64_fcnan_fcinf_wrong_mask3_strictfp(
37644706bd4Sostannard; CHECK-SAME: double [[A:%.*]]) #[[ATTR0]] {
37744706bd4Sostannard; CHECK-NEXT:    [[I64:%.*]] = bitcast double [[A]] to i64
37844706bd4Sostannard; CHECK-NEXT:    [[AND:%.*]] = and i64 [[I64]], 2139095040
37944706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[AND]], 2139095040
38044706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
38144706bd4Sostannard;
38244706bd4Sostannard  %i64 = bitcast double %a to i64
38344706bd4Sostannard  %and = and i64 %i64, 2139095040
38444706bd4Sostannard  %cmp = icmp eq i64 %and, 2139095040
38544706bd4Sostannard  ret i1 %cmp
38644706bd4Sostannard}
38744706bd4Sostannard
388390b9974SYingwei Zhengdefine i1 @f32_fcnan_fcinf_wrong_pred(float %a) {
389390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_pred(
390390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
391390b9974SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[A]])
392390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp one float [[TMP1]], 0x7FF0000000000000
393390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
394390b9974SYingwei Zheng;
395390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
396390b9974SYingwei Zheng  %and = and i32 %i32, 2139095040
397390b9974SYingwei Zheng  %cmp = icmp slt i32 %and, 2139095040
398390b9974SYingwei Zheng  ret i1 %cmp
399390b9974SYingwei Zheng}
400390b9974SYingwei Zheng
40144706bd4Sostannarddefine i1 @f32_fcnan_fcinf_wrong_pred_strictfp(float %a) strictfp {
40244706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_pred_strictfp(
40344706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
40444706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 504)
40544706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
40644706bd4Sostannard;
40744706bd4Sostannard  %i32 = bitcast float %a to i32
40844706bd4Sostannard  %and = and i32 %i32, 2139095040
40944706bd4Sostannard  %cmp = icmp slt i32 %and, 2139095040
41044706bd4Sostannard  ret i1 %cmp
41144706bd4Sostannard}
41244706bd4Sostannard
413c8ca98a2SYingwei Zhengdefine i1 @f32_fcposzero_wrong_pred(float %a) {
414c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposzero_wrong_pred(
415c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
416c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
417c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0
418c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
419c8ca98a2SYingwei Zheng;
420c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
421c8ca98a2SYingwei Zheng  %cmp = icmp slt i32 %i32, 0
422c8ca98a2SYingwei Zheng  ret i1 %cmp
423c8ca98a2SYingwei Zheng}
424c8ca98a2SYingwei Zheng
42544706bd4Sostannarddefine i1 @f32_fcposzero_wrong_pred_strictfp(float %a) strictfp {
42644706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposzero_wrong_pred_strictfp(
42744706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
42844706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
42944706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0
43044706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
43144706bd4Sostannard;
43244706bd4Sostannard  %i32 = bitcast float %a to i32
43344706bd4Sostannard  %cmp = icmp slt i32 %i32, 0
43444706bd4Sostannard  ret i1 %cmp
43544706bd4Sostannard}
43644706bd4Sostannard
437390b9974SYingwei Zhengdefine i1 @f32_fcnan_fcinf_wrong_type1(<2 x float> %a) {
438390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_type1(
439390b9974SYingwei Zheng; CHECK-SAME: <2 x float> [[A:%.*]]) {
440390b9974SYingwei Zheng; CHECK-NEXT:    [[I64:%.*]] = bitcast <2 x float> [[A]] to i64
441390b9974SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i64 [[I64]], 2139095040
442390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[AND]], 2139095040
443390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
444390b9974SYingwei Zheng;
445390b9974SYingwei Zheng  %i64 = bitcast <2 x float> %a to i64
446390b9974SYingwei Zheng  %and = and i64 %i64, 2139095040
447390b9974SYingwei Zheng  %cmp = icmp eq i64 %and, 2139095040
448390b9974SYingwei Zheng  ret i1 %cmp
449390b9974SYingwei Zheng}
450390b9974SYingwei Zheng
45144706bd4Sostannarddefine i1 @f32_fcnan_fcinf_wrong_type1_strictfp(<2 x float> %a) strictfp {
45244706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_type1_strictfp(
45344706bd4Sostannard; CHECK-SAME: <2 x float> [[A:%.*]]) #[[ATTR0]] {
45444706bd4Sostannard; CHECK-NEXT:    [[I64:%.*]] = bitcast <2 x float> [[A]] to i64
45544706bd4Sostannard; CHECK-NEXT:    [[AND:%.*]] = and i64 [[I64]], 2139095040
45644706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[AND]], 2139095040
45744706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
45844706bd4Sostannard;
45944706bd4Sostannard  %i64 = bitcast <2 x float> %a to i64
46044706bd4Sostannard  %and = and i64 %i64, 2139095040
46144706bd4Sostannard  %cmp = icmp eq i64 %and, 2139095040
46244706bd4Sostannard  ret i1 %cmp
46344706bd4Sostannard}
46444706bd4Sostannard
465c8ca98a2SYingwei Zhengdefine i1 @f32_fcposinf_wrong_type1(<2 x float> %a) {
466c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposinf_wrong_type1(
467c8ca98a2SYingwei Zheng; CHECK-SAME: <2 x float> [[A:%.*]]) {
468c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[I64:%.*]] = bitcast <2 x float> [[A]] to i64
469c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[I64]], 2139095040
470c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
471c8ca98a2SYingwei Zheng;
472c8ca98a2SYingwei Zheng  %i64 = bitcast <2 x float> %a to i64
473c8ca98a2SYingwei Zheng  %cmp = icmp eq i64 %i64, 2139095040
474c8ca98a2SYingwei Zheng  ret i1 %cmp
475c8ca98a2SYingwei Zheng}
476c8ca98a2SYingwei Zheng
47744706bd4Sostannarddefine i1 @f32_fcposinf_wrong_type1_strictfp(<2 x float> %a) strictfp {
47844706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposinf_wrong_type1_strictfp(
47944706bd4Sostannard; CHECK-SAME: <2 x float> [[A:%.*]]) #[[ATTR0]] {
48044706bd4Sostannard; CHECK-NEXT:    [[I64:%.*]] = bitcast <2 x float> [[A]] to i64
48144706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[I64]], 2139095040
48244706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
48344706bd4Sostannard;
48444706bd4Sostannard  %i64 = bitcast <2 x float> %a to i64
48544706bd4Sostannard  %cmp = icmp eq i64 %i64, 2139095040
48644706bd4Sostannard  ret i1 %cmp
48744706bd4Sostannard}
48844706bd4Sostannard
489390b9974SYingwei Zhengdefine i1 @f32_fcnan_fcinf_wrong_type2(x86_fp80 %a) {
490390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_type2(
491390b9974SYingwei Zheng; CHECK-SAME: x86_fp80 [[A:%.*]]) {
492390b9974SYingwei Zheng; CHECK-NEXT:    [[I80:%.*]] = bitcast x86_fp80 [[A]] to i80
493390b9974SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i80 [[I80]], 2139095040
494390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i80 [[AND]], 2139095040
495390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
496390b9974SYingwei Zheng;
497390b9974SYingwei Zheng  %i80 = bitcast x86_fp80 %a to i80
498390b9974SYingwei Zheng  %and = and i80 %i80, 2139095040
499390b9974SYingwei Zheng  %cmp = icmp eq i80 %and, 2139095040
500390b9974SYingwei Zheng  ret i1 %cmp
501390b9974SYingwei Zheng}
502390b9974SYingwei Zheng
50344706bd4Sostannarddefine i1 @f32_fcnan_fcinf_wrong_type2_strictfp(x86_fp80 %a) strictfp {
50444706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_type2_strictfp(
50544706bd4Sostannard; CHECK-SAME: x86_fp80 [[A:%.*]]) #[[ATTR0]] {
50644706bd4Sostannard; CHECK-NEXT:    [[I80:%.*]] = bitcast x86_fp80 [[A]] to i80
50744706bd4Sostannard; CHECK-NEXT:    [[AND:%.*]] = and i80 [[I80]], 2139095040
50844706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i80 [[AND]], 2139095040
50944706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
51044706bd4Sostannard;
51144706bd4Sostannard  %i80 = bitcast x86_fp80 %a to i80
51244706bd4Sostannard  %and = and i80 %i80, 2139095040
51344706bd4Sostannard  %cmp = icmp eq i80 %and, 2139095040
51444706bd4Sostannard  ret i1 %cmp
51544706bd4Sostannard}
51644706bd4Sostannard
517c8ca98a2SYingwei Zhengdefine i1 @f32_fcposzero_wrong_type2(x86_fp80 %a) {
518c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposzero_wrong_type2(
519c8ca98a2SYingwei Zheng; CHECK-SAME: x86_fp80 [[A:%.*]]) {
520c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[I80:%.*]] = bitcast x86_fp80 [[A]] to i80
521c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i80 [[I80]], 0
522c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
523c8ca98a2SYingwei Zheng;
524c8ca98a2SYingwei Zheng  %i80 = bitcast x86_fp80 %a to i80
525c8ca98a2SYingwei Zheng  %cmp = icmp eq i80 %i80, 0
526c8ca98a2SYingwei Zheng  ret i1 %cmp
527c8ca98a2SYingwei Zheng}
528c8ca98a2SYingwei Zheng
52944706bd4Sostannarddefine i1 @f32_fcposzero_wrong_type2_strictfp(x86_fp80 %a) strictfp {
53044706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposzero_wrong_type2_strictfp(
53144706bd4Sostannard; CHECK-SAME: x86_fp80 [[A:%.*]]) #[[ATTR0]] {
53244706bd4Sostannard; CHECK-NEXT:    [[I80:%.*]] = bitcast x86_fp80 [[A]] to i80
53344706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i80 [[I80]], 0
53444706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
53544706bd4Sostannard;
53644706bd4Sostannard  %i80 = bitcast x86_fp80 %a to i80
53744706bd4Sostannard  %cmp = icmp eq i80 %i80, 0
53844706bd4Sostannard  ret i1 %cmp
53944706bd4Sostannard}
54044706bd4Sostannard
541390b9974SYingwei Zhengdefine i1 @f32_fcnan_fcinf_noimplicitfloat(float %a) #0 {
542390b9974SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcnan_fcinf_noimplicitfloat(
543390b9974SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) #[[ATTR1:[0-9]+]] {
544390b9974SYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
545390b9974SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i32 [[I32]], 2139095040
546390b9974SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 2139095040
547390b9974SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
548390b9974SYingwei Zheng;
549390b9974SYingwei Zheng  %i32 = bitcast float %a to i32
550390b9974SYingwei Zheng  %and = and i32 %i32, 2139095040
551390b9974SYingwei Zheng  %cmp = icmp eq i32 %and, 2139095040
552390b9974SYingwei Zheng  ret i1 %cmp
553390b9974SYingwei Zheng}
554390b9974SYingwei Zheng
55544706bd4Sostannarddefine i1 @f32_fcnan_fcinf_noimplicitfloat_strictfp(float %a) strictfp #0 {
55644706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcnan_fcinf_noimplicitfloat_strictfp(
55744706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR2:[0-9]+]] {
55844706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
55944706bd4Sostannard; CHECK-NEXT:    [[AND:%.*]] = and i32 [[I32]], 2139095040
56044706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 2139095040
56144706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
56244706bd4Sostannard;
56344706bd4Sostannard  %i32 = bitcast float %a to i32
56444706bd4Sostannard  %and = and i32 %i32, 2139095040
56544706bd4Sostannard  %cmp = icmp eq i32 %and, 2139095040
56644706bd4Sostannard  ret i1 %cmp
56744706bd4Sostannard}
56844706bd4Sostannard
569c8ca98a2SYingwei Zhengdefine i1 @f32_fcposinf_noimplicitfloat(float %a) #0 {
570c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposinf_noimplicitfloat(
571c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) #[[ATTR1]] {
572c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
573c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I32]], 2139095040
574c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
575c8ca98a2SYingwei Zheng;
576c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
577c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %i32, 2139095040
578c8ca98a2SYingwei Zheng  ret i1 %cmp
579c8ca98a2SYingwei Zheng}
580c8ca98a2SYingwei Zheng
58144706bd4Sostannarddefine i1 @f32_fcposinf_noimplicitfloat_strictfp(float %a) strictfp #0 {
58244706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposinf_noimplicitfloat_strictfp(
58344706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR2]] {
58444706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
58544706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I32]], 2139095040
58644706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
58744706bd4Sostannard;
58844706bd4Sostannard  %i32 = bitcast float %a to i32
58944706bd4Sostannard  %cmp = icmp eq i32 %i32, 2139095040
59044706bd4Sostannard  ret i1 %cmp
59144706bd4Sostannard}
59244706bd4Sostannard
593c8ca98a2SYingwei Zhengdefine i1 @f32_fcposnan(float %a) {
594c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposnan(
595c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
596c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
597c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I32]], 2139095041
598c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
599c8ca98a2SYingwei Zheng;
600c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
601c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %i32, 2139095041
602c8ca98a2SYingwei Zheng  ret i1 %cmp
603c8ca98a2SYingwei Zheng}
604c8ca98a2SYingwei Zheng
60544706bd4Sostannarddefine i1 @f32_fcposnan_strictfp(float %a) strictfp {
60644706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposnan_strictfp(
60744706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
60844706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
60944706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I32]], 2139095041
61044706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
61144706bd4Sostannard;
61244706bd4Sostannard  %i32 = bitcast float %a to i32
61344706bd4Sostannard  %cmp = icmp eq i32 %i32, 2139095041
61444706bd4Sostannard  ret i1 %cmp
61544706bd4Sostannard}
61644706bd4Sostannard
617c8ca98a2SYingwei Zhengdefine i1 @f32_fcposinf_multiuse(float %a) {
618c8ca98a2SYingwei Zheng; CHECK-LABEL: define i1 @f32_fcposinf_multiuse(
619c8ca98a2SYingwei Zheng; CHECK-SAME: float [[A:%.*]]) {
620c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
621c8ca98a2SYingwei Zheng; CHECK-NEXT:    call void @usei32(i32 [[I32]])
622c8ca98a2SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I32]], 2139095040
623c8ca98a2SYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP]]
624c8ca98a2SYingwei Zheng;
625c8ca98a2SYingwei Zheng  %i32 = bitcast float %a to i32
626c8ca98a2SYingwei Zheng  call void @usei32(i32 %i32)
627c8ca98a2SYingwei Zheng  %cmp = icmp eq i32 %i32, 2139095040
628c8ca98a2SYingwei Zheng  ret i1 %cmp
629c8ca98a2SYingwei Zheng}
630c8ca98a2SYingwei Zheng
63144706bd4Sostannarddefine i1 @f32_fcposinf_multiuse_strictfp(float %a) strictfp {
63244706bd4Sostannard; CHECK-LABEL: define i1 @f32_fcposinf_multiuse_strictfp(
63344706bd4Sostannard; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] {
63444706bd4Sostannard; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[A]] to i32
63544706bd4Sostannard; CHECK-NEXT:    call void @usei32(i32 [[I32]])
63644706bd4Sostannard; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I32]], 2139095040
63744706bd4Sostannard; CHECK-NEXT:    ret i1 [[CMP]]
63844706bd4Sostannard;
63944706bd4Sostannard  %i32 = bitcast float %a to i32
64044706bd4Sostannard  call void @usei32(i32 %i32)
64144706bd4Sostannard  %cmp = icmp eq i32 %i32, 2139095040
64244706bd4Sostannard  ret i1 %cmp
64344706bd4Sostannard}
64444706bd4Sostannard
645dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom(double %x) {
646dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom(
647dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
648dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = fcmp uno double [[X]], 0.000000e+00
649dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
650dba3dfa2SYingwei Zheng;
651dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
652dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
653dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
654dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
655dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
656dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
657dba3dfa2SYingwei Zheng  ret i1 %ret
658dba3dfa2SYingwei Zheng}
659dba3dfa2SYingwei Zheng
660dba3dfa2SYingwei Zhengdefine <2 x i1> @isnan_idiom_vec(<2 x double> %x) {
661dba3dfa2SYingwei Zheng; CHECK-LABEL: define <2 x i1> @isnan_idiom_vec(
662dba3dfa2SYingwei Zheng; CHECK-SAME: <2 x double> [[X:%.*]]) {
663dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = fcmp uno <2 x double> [[X]], zeroinitializer
664dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret <2 x i1> [[RET]]
665dba3dfa2SYingwei Zheng;
666dba3dfa2SYingwei Zheng  %bits = bitcast <2 x double> %x to <2 x i64>
667dba3dfa2SYingwei Zheng  %mask1 = and <2 x i64> %bits, splat(i64 9218868437227405312)
668dba3dfa2SYingwei Zheng  %cond1 = icmp eq <2 x i64> %mask1, splat(i64 9218868437227405312)
669dba3dfa2SYingwei Zheng  %mask2 = and <2 x i64> %bits, splat(i64 4503599627370495)
670dba3dfa2SYingwei Zheng  %cond2 = icmp ne <2 x i64> %mask2, zeroinitializer
671dba3dfa2SYingwei Zheng  %ret = and <2 x i1> %cond1, %cond2
672dba3dfa2SYingwei Zheng  ret <2 x i1> %ret
673dba3dfa2SYingwei Zheng}
674dba3dfa2SYingwei Zheng
675dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_commuted(double %x) {
676dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_commuted(
677dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
678dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = fcmp uno double [[X]], 0.000000e+00
679dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
680dba3dfa2SYingwei Zheng;
681dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
682dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
683dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
684dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
685dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
686dba3dfa2SYingwei Zheng  %ret = and i1 %cond2, %cond1
687dba3dfa2SYingwei Zheng  ret i1 %ret
688dba3dfa2SYingwei Zheng}
689dba3dfa2SYingwei Zheng
690dba3dfa2SYingwei Zhengdefine i1 @isnotnan_idiom(double %x) {
691dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnotnan_idiom(
692dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
693dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = fcmp ord double [[X]], 0.000000e+00
694dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
695dba3dfa2SYingwei Zheng;
696dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
697dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
698dba3dfa2SYingwei Zheng  %cond1 = icmp ne i64 %mask1, 9218868437227405312
699dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
700dba3dfa2SYingwei Zheng  %cond2 = icmp eq i64 %mask2, 0
701dba3dfa2SYingwei Zheng  %ret = or i1 %cond1, %cond2
702dba3dfa2SYingwei Zheng  ret i1 %ret
703dba3dfa2SYingwei Zheng}
704dba3dfa2SYingwei Zheng
705dba3dfa2SYingwei Zheng; negative tests
706dba3dfa2SYingwei Zheng
707dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_strictfp(double %x) strictfp {
708dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_strictfp(
709dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) #[[ATTR0]] {
710dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast double [[X]] to i64
711dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i64 [[BITS]], 9218868437227405312
712dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i64 [[MASK1]], 9218868437227405312
713dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK2:%.*]] = and i64 [[BITS]], 4503599627370495
714dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i64 [[MASK2]], 0
715dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = and i1 [[COND1]], [[COND2]]
716dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
717dba3dfa2SYingwei Zheng;
718dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
719dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
720dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
721dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
722dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
723dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
724dba3dfa2SYingwei Zheng  ret i1 %ret
725dba3dfa2SYingwei Zheng}
726dba3dfa2SYingwei Zheng
727dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_wrong_pred1(double %x) {
728dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_wrong_pred1(
729dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
730dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast double [[X]] to i64
731dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i64 [[BITS]], 9218868437227405312
732dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp ne i64 [[MASK1]], 9218868437227405312
733dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK2:%.*]] = and i64 [[BITS]], 4503599627370495
734dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i64 [[MASK2]], 0
735dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = and i1 [[COND1]], [[COND2]]
736dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
737dba3dfa2SYingwei Zheng;
738dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
739dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
740dba3dfa2SYingwei Zheng  %cond1 = icmp ne i64 %mask1, 9218868437227405312
741dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
742dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
743dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
744dba3dfa2SYingwei Zheng  ret i1 %ret
745dba3dfa2SYingwei Zheng}
746dba3dfa2SYingwei Zheng
747dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_wrong_pred2(double %x) {
748dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_wrong_pred2(
749dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
750dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X]])
751dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = fcmp oeq double [[TMP1]], 0x7FF0000000000000
752dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
753dba3dfa2SYingwei Zheng;
754dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
755dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
756dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
757dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
758dba3dfa2SYingwei Zheng  %cond2 = icmp eq i64 %mask2, 0
759dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
760dba3dfa2SYingwei Zheng  ret i1 %ret
761dba3dfa2SYingwei Zheng}
762dba3dfa2SYingwei Zheng
763dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_wrong_pred3(double %x) {
764dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_wrong_pred3(
765dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
766dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast double [[X]] to i64
767dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i64 [[BITS]], 9218868437227405312
768dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i64 [[MASK1]], 9218868437227405312
769dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK2:%.*]] = and i64 [[BITS]], 4503599627370495
770dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i64 [[MASK2]], 0
771dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = or i1 [[COND1]], [[COND2]]
772dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
773dba3dfa2SYingwei Zheng;
774dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
775dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
776dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
777dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
778dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
779dba3dfa2SYingwei Zheng  %ret = or i1 %cond1, %cond2
780dba3dfa2SYingwei Zheng  ret i1 %ret
781dba3dfa2SYingwei Zheng}
782dba3dfa2SYingwei Zheng
783dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_wrong_mask1(double %x) {
784dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_wrong_mask1(
785dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
786dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast double [[X]] to i64
787dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i64 [[BITS]], 9218868437227405311
788dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i64 [[MASK1]], 9218868437227405311
789dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[COND1]]
790dba3dfa2SYingwei Zheng;
791dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
792dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405311
793dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405311
794dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
795dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
796dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
797dba3dfa2SYingwei Zheng  ret i1 %ret
798dba3dfa2SYingwei Zheng}
799dba3dfa2SYingwei Zheng
800dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_wrong_mask2(double %x) {
801dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_wrong_mask2(
802dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
803dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast double [[X]] to i64
804dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i64 [[BITS]], 9218868437227405312
805dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i64 [[MASK1]], 9218868437227405312
806dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK2:%.*]] = and i64 [[BITS]], 4503599627370494
807dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i64 [[MASK2]], 0
808dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = and i1 [[COND1]], [[COND2]]
809dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
810dba3dfa2SYingwei Zheng;
811dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
812dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
813dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
814dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370494
815dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
816dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
817dba3dfa2SYingwei Zheng  ret i1 %ret
818dba3dfa2SYingwei Zheng}
819dba3dfa2SYingwei Zheng
820dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_wrong_mask3(double %x) {
821dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_wrong_mask3(
822dba3dfa2SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
823dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast double [[X]] to i64
824dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i64 [[BITS]], 9218868437227405312
825dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i64 [[MASK1]], 9218868437227405312
826dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK2:%.*]] = and i64 [[BITS]], 4503599627370495
827dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i64 [[MASK2]], 4503599627370495
828dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = and i1 [[COND1]], [[COND2]]
829dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
830dba3dfa2SYingwei Zheng;
831dba3dfa2SYingwei Zheng  %bits = bitcast double %x to i64
832dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
833dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
834dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
835dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 4503599627370495
836dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
837dba3dfa2SYingwei Zheng  ret i1 %ret
838dba3dfa2SYingwei Zheng}
839dba3dfa2SYingwei Zheng
840dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_invalid_bitcast(<2 x float> %x) {
841dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_invalid_bitcast(
842dba3dfa2SYingwei Zheng; CHECK-SAME: <2 x float> [[X:%.*]]) {
843dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast <2 x float> [[X]] to i64
844dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i64 [[BITS]], 9218868437227405312
845dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i64 [[MASK1]], 9218868437227405312
846dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK2:%.*]] = and i64 [[BITS]], 4503599627370495
847dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i64 [[MASK2]], 0
848dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = and i1 [[COND1]], [[COND2]]
849dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
850dba3dfa2SYingwei Zheng;
851dba3dfa2SYingwei Zheng  %bits = bitcast <2 x float> %x to i64
852dba3dfa2SYingwei Zheng  %mask1 = and i64 %bits, 9218868437227405312
853dba3dfa2SYingwei Zheng  %cond1 = icmp eq i64 %mask1, 9218868437227405312
854dba3dfa2SYingwei Zheng  %mask2 = and i64 %bits, 4503599627370495
855dba3dfa2SYingwei Zheng  %cond2 = icmp ne i64 %mask2, 0
856dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
857dba3dfa2SYingwei Zheng  ret i1 %ret
858dba3dfa2SYingwei Zheng}
859dba3dfa2SYingwei Zheng
860dba3dfa2SYingwei Zhengdefine i1 @isnan_idiom_ppc_fp128(ppc_fp128 %x) {
861dba3dfa2SYingwei Zheng; CHECK-LABEL: define i1 @isnan_idiom_ppc_fp128(
862dba3dfa2SYingwei Zheng; CHECK-SAME: ppc_fp128 [[X:%.*]]) {
863dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[BITS:%.*]] = bitcast ppc_fp128 [[X]] to i128
864dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK1:%.*]] = and i128 [[BITS]], 170058106710732674489630815774616584192
865dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i128 [[MASK1]], 170058106710732674489630815774616584192
866dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[MASK2:%.*]] = and i128 [[BITS]], 83076749736557242056487941267521535
867dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i128 [[MASK2]], 0
868dba3dfa2SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = and i1 [[COND1]], [[COND2]]
869dba3dfa2SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
870dba3dfa2SYingwei Zheng;
871dba3dfa2SYingwei Zheng  %bits = bitcast ppc_fp128 %x to i128
872dba3dfa2SYingwei Zheng  %mask1 = and i128 %bits, 170058106710732674489630815774616584192
873dba3dfa2SYingwei Zheng  %cond1 = icmp eq i128 %mask1, 170058106710732674489630815774616584192
874dba3dfa2SYingwei Zheng  %mask2 = and i128 %bits, 83076749736557242056487941267521535
875dba3dfa2SYingwei Zheng  %cond2 = icmp ne i128 %mask2, 0
876dba3dfa2SYingwei Zheng  %ret = and i1 %cond1, %cond2
877dba3dfa2SYingwei Zheng  ret i1 %ret
878dba3dfa2SYingwei Zheng}
879dba3dfa2SYingwei Zheng
880c8ca98a2SYingwei Zhengdeclare void @usei32(i32)
881c8ca98a2SYingwei Zheng
882390b9974SYingwei Zhengattributes #0 = { noimplicitfloat }
883