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