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