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 6 define 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 15 define 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 24 define 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 33 define 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 42 define 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 51 define 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 60 define 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 69 define 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 78 define 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 87 define 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 96 define 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 105 define 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 114 define 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 123 define 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 132 define 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 141 define 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 150 define 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 159 define 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 168 define 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 177 define 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 186 define 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 195 define 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 203 define 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 212 define 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 221 define 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 230 define 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 239 define 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 248 define 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 258 define 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 271 define 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 280 define 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 296 define 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 308 define 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 318 define 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 327 define 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 336 define 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 346 define 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 356 define 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 366 define 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 376 define 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 386 define 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 395 define 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 403 define 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 411 define 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 419 define 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 427 define 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 435 define 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 443 define 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 451 define 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 459 define 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 467 define 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 475 define 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 486 define 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