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