1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instsimplify < %s | FileCheck %s 3 4declare i32 @llvm.fptosi.sat.i32.f64(double) 5declare i32 @llvm.fptoui.sat.i32.f64(double) 6declare i32 @llvm.fptosi.sat.i32.f32(float) 7declare i32 @llvm.fptoui.sat.i32.f32(float) 8 9declare <2 x i32> @llvm.fptosi.sat.v2i32.v2f64(<2 x double>) 10declare <2 x i32> @llvm.fptoui.sat.v2i32.v2f64(<2 x double>) 11declare <2 x i32> @llvm.fptosi.sat.v2i32.v2f32(<2 x float>) 12declare <2 x i32> @llvm.fptoui.sat.v2i32.v2f32(<2 x float>) 13 14; 15; 16; F64 -> I32 17; 18; 19 20define i32 @fptosi_f64_to_i32_poison() { 21; CHECK-LABEL: @fptosi_f64_to_i32_poison( 22; CHECK-NEXT: ret i32 0 23; 24 %r = call i32 @llvm.fptosi.sat.i32.f64(double poison) 25 ret i32 %r 26} 27 28define i32 @fptosi_f64_to_i32_undef() { 29; CHECK-LABEL: @fptosi_f64_to_i32_undef( 30; CHECK-NEXT: ret i32 0 31; 32 %r = call i32 @llvm.fptosi.sat.i32.f64(double undef) 33 ret i32 %r 34} 35 36define i32 @fptosi_f64_to_i32_pos_zero() { 37; CHECK-LABEL: @fptosi_f64_to_i32_pos_zero( 38; CHECK-NEXT: ret i32 0 39; 40 %r = call i32 @llvm.fptosi.sat.i32.f64(double 0.0) 41 ret i32 %r 42} 43 44define i32 @fptosi_f64_to_i32_neg_zero() { 45; CHECK-LABEL: @fptosi_f64_to_i32_neg_zero( 46; CHECK-NEXT: ret i32 0 47; 48 %r = call i32 @llvm.fptosi.sat.i32.f64(double -0.0) 49 ret i32 %r 50} 51 52define i32 @fptosi_f64_to_i32_exact() { 53; CHECK-LABEL: @fptosi_f64_to_i32_exact( 54; CHECK-NEXT: ret i32 42 55; 56 %r = call i32 @llvm.fptosi.sat.i32.f64(double 42.0) 57 ret i32 %r 58} 59 60define i32 @fptosi_f64_to_i32_trunc() { 61; CHECK-LABEL: @fptosi_f64_to_i32_trunc( 62; CHECK-NEXT: ret i32 42 63; 64 %r = call i32 @llvm.fptosi.sat.i32.f64(double 42.9) 65 ret i32 %r 66} 67 68define i32 @fptosi_f64_to_i32_trunc_neg() { 69; CHECK-LABEL: @fptosi_f64_to_i32_trunc_neg( 70; CHECK-NEXT: ret i32 -42 71; 72 %r = call i32 @llvm.fptosi.sat.i32.f64(double -42.9) 73 ret i32 %r 74} 75 76define i32 @fptosi_f64_to_i32_max_minus_1() { 77; CHECK-LABEL: @fptosi_f64_to_i32_max_minus_1( 78; CHECK-NEXT: ret i32 2147483646 79; 80 %r = call i32 @llvm.fptosi.sat.i32.f64(double 2147483646.0) 81 ret i32 %r 82} 83 84define i32 @fptosi_f64_to_i32_max() { 85; CHECK-LABEL: @fptosi_f64_to_i32_max( 86; CHECK-NEXT: ret i32 2147483647 87; 88 %r = call i32 @llvm.fptosi.sat.i32.f64(double 2147483647.0) 89 ret i32 %r 90} 91 92define i32 @fptosi_f64_to_i32_max_plus_1() { 93; CHECK-LABEL: @fptosi_f64_to_i32_max_plus_1( 94; CHECK-NEXT: ret i32 2147483647 95; 96 %r = call i32 @llvm.fptosi.sat.i32.f64(double 2147483648.0) 97 ret i32 %r 98} 99 100define i32 @fptosi_f64_to_i32_min_plus_1() { 101; CHECK-LABEL: @fptosi_f64_to_i32_min_plus_1( 102; CHECK-NEXT: ret i32 -2147483647 103; 104 %r = call i32 @llvm.fptosi.sat.i32.f64(double -2147483647.0) 105 ret i32 %r 106} 107 108define i32 @fptosi_f64_to_i32_min() { 109; CHECK-LABEL: @fptosi_f64_to_i32_min( 110; CHECK-NEXT: ret i32 -2147483648 111; 112 %r = call i32 @llvm.fptosi.sat.i32.f64(double -2147483648.0) 113 ret i32 %r 114} 115 116define i32 @fptosi_f64_to_i32_min_minus_1() { 117; CHECK-LABEL: @fptosi_f64_to_i32_min_minus_1( 118; CHECK-NEXT: ret i32 -2147483648 119; 120 %r = call i32 @llvm.fptosi.sat.i32.f64(double -2147483649.0) 121 ret i32 %r 122} 123 124define i32 @fptosi_f64_to_i32_inf() { 125; CHECK-LABEL: @fptosi_f64_to_i32_inf( 126; CHECK-NEXT: ret i32 2147483647 127; 128 %r = call i32 @llvm.fptosi.sat.i32.f64(double 0x7ff0000000000000) 129 ret i32 %r 130} 131 132define i32 @fptosi_f64_to_i32_neg_inf() { 133; CHECK-LABEL: @fptosi_f64_to_i32_neg_inf( 134; CHECK-NEXT: ret i32 -2147483648 135; 136 %r = call i32 @llvm.fptosi.sat.i32.f64(double 0xfff0000000000000) 137 ret i32 %r 138} 139 140define i32 @fptosi_f64_to_i32_nan1() { 141; CHECK-LABEL: @fptosi_f64_to_i32_nan1( 142; CHECK-NEXT: ret i32 0 143; 144 %r = call i32 @llvm.fptosi.sat.i32.f64(double 0x7ff8000000000000) 145 ret i32 %r 146} 147 148define i32 @fptosi_f64_to_i32_nan2() { 149; CHECK-LABEL: @fptosi_f64_to_i32_nan2( 150; CHECK-NEXT: ret i32 0 151; 152 %r = call i32 @llvm.fptosi.sat.i32.f64(double 0x7ff4000000000000) 153 ret i32 %r 154} 155 156define i32 @fptosi_f64_to_i32_nan3() { 157; CHECK-LABEL: @fptosi_f64_to_i32_nan3( 158; CHECK-NEXT: ret i32 0 159; 160 %r = call i32 @llvm.fptosi.sat.i32.f64(double 0xfff8000000000000) 161 ret i32 %r 162} 163 164define i32 @fptosi_f64_to_i32_nan4() { 165; CHECK-LABEL: @fptosi_f64_to_i32_nan4( 166; CHECK-NEXT: ret i32 0 167; 168 %r = call i32 @llvm.fptosi.sat.i32.f64(double 0xfff4000000000000) 169 ret i32 %r 170} 171 172define <2 x i32> @fptosi_f64_to_i32_vec() { 173; CHECK-LABEL: @fptosi_f64_to_i32_vec( 174; CHECK-NEXT: ret <2 x i32> <i32 42, i32 -42> 175; 176 %r = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f64(<2 x double> <double 42.9, double -42.9>) 177 ret <2 x i32> %r 178} 179 180; 181; 182; F64 -> U32 183; 184; 185 186define i32 @fptoui_f64_to_i32_poison() { 187; CHECK-LABEL: @fptoui_f64_to_i32_poison( 188; CHECK-NEXT: ret i32 0 189; 190 %r = call i32 @llvm.fptoui.sat.i32.f64(double poison) 191 ret i32 %r 192} 193 194define i32 @fptoui_f64_to_i32_undef() { 195; CHECK-LABEL: @fptoui_f64_to_i32_undef( 196; CHECK-NEXT: ret i32 0 197; 198 %r = call i32 @llvm.fptoui.sat.i32.f64(double undef) 199 ret i32 %r 200} 201 202define i32 @fptoui_f64_to_i32_pos_zero() { 203; CHECK-LABEL: @fptoui_f64_to_i32_pos_zero( 204; CHECK-NEXT: ret i32 0 205; 206 %r = call i32 @llvm.fptoui.sat.i32.f64(double 0.0) 207 ret i32 %r 208} 209 210define i32 @fptoui_f64_to_i32_neg_zero() { 211; CHECK-LABEL: @fptoui_f64_to_i32_neg_zero( 212; CHECK-NEXT: ret i32 0 213; 214 %r = call i32 @llvm.fptoui.sat.i32.f64(double -0.0) 215 ret i32 %r 216} 217 218define i32 @fptoui_f64_to_i32_exact() { 219; CHECK-LABEL: @fptoui_f64_to_i32_exact( 220; CHECK-NEXT: ret i32 42 221; 222 %r = call i32 @llvm.fptoui.sat.i32.f64(double 42.0) 223 ret i32 %r 224} 225 226define i32 @fptoui_f64_to_i32_trunc() { 227; CHECK-LABEL: @fptoui_f64_to_i32_trunc( 228; CHECK-NEXT: ret i32 42 229; 230 %r = call i32 @llvm.fptoui.sat.i32.f64(double 42.9) 231 ret i32 %r 232} 233 234define i32 @fptoui_f64_to_i32_trunc_neg() { 235; CHECK-LABEL: @fptoui_f64_to_i32_trunc_neg( 236; CHECK-NEXT: ret i32 0 237; 238 %r = call i32 @llvm.fptoui.sat.i32.f64(double -42.9) 239 ret i32 %r 240} 241 242define i32 @fptoui_f64_to_i32_max_minus_1() { 243; CHECK-LABEL: @fptoui_f64_to_i32_max_minus_1( 244; CHECK-NEXT: ret i32 -2 245; 246 %r = call i32 @llvm.fptoui.sat.i32.f64(double 4294967294.0) 247 ret i32 %r 248} 249 250define i32 @fptoui_f64_to_i32_max() { 251; CHECK-LABEL: @fptoui_f64_to_i32_max( 252; CHECK-NEXT: ret i32 -1 253; 254 %r = call i32 @llvm.fptoui.sat.i32.f64(double 4294967295.0) 255 ret i32 %r 256} 257 258define i32 @fptoui_f64_to_i32_max_plus_1() { 259; CHECK-LABEL: @fptoui_f64_to_i32_max_plus_1( 260; CHECK-NEXT: ret i32 -1 261; 262 %r = call i32 @llvm.fptoui.sat.i32.f64(double 4294967296.0) 263 ret i32 %r 264} 265 266define i32 @fptoui_f64_to_i32_inf() { 267; CHECK-LABEL: @fptoui_f64_to_i32_inf( 268; CHECK-NEXT: ret i32 -1 269; 270 %r = call i32 @llvm.fptoui.sat.i32.f64(double 0x7ff0000000000000) 271 ret i32 %r 272} 273 274define i32 @fptoui_f64_to_i32_neg_inf() { 275; CHECK-LABEL: @fptoui_f64_to_i32_neg_inf( 276; CHECK-NEXT: ret i32 0 277; 278 %r = call i32 @llvm.fptoui.sat.i32.f64(double 0xfff0000000000000) 279 ret i32 %r 280} 281 282define i32 @fptoui_f64_to_i32_nan1() { 283; CHECK-LABEL: @fptoui_f64_to_i32_nan1( 284; CHECK-NEXT: ret i32 0 285; 286 %r = call i32 @llvm.fptoui.sat.i32.f64(double 0x7ff8000000000000) 287 ret i32 %r 288} 289 290define i32 @fptoui_f64_to_i32_nan2() { 291; CHECK-LABEL: @fptoui_f64_to_i32_nan2( 292; CHECK-NEXT: ret i32 0 293; 294 %r = call i32 @llvm.fptoui.sat.i32.f64(double 0x7ff4000000000000) 295 ret i32 %r 296} 297 298define i32 @fptoui_f64_to_i32_nan3() { 299; CHECK-LABEL: @fptoui_f64_to_i32_nan3( 300; CHECK-NEXT: ret i32 0 301; 302 %r = call i32 @llvm.fptoui.sat.i32.f64(double 0xfff8000000000000) 303 ret i32 %r 304} 305 306define i32 @fptoui_f64_to_i32_nan4() { 307; CHECK-LABEL: @fptoui_f64_to_i32_nan4( 308; CHECK-NEXT: ret i32 0 309; 310 %r = call i32 @llvm.fptoui.sat.i32.f64(double 0xfff4000000000000) 311 ret i32 %r 312} 313 314define <2 x i32> @fptoui_f64_to_i32_vec() { 315; CHECK-LABEL: @fptoui_f64_to_i32_vec( 316; CHECK-NEXT: ret <2 x i32> <i32 42, i32 0> 317; 318 %r = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f64(<2 x double> <double 42.9, double -42.9>) 319 ret <2 x i32> %r 320} 321 322; 323; 324; F32 -> I32 325; 326; 327 328define i32 @fptosi_f32_to_i32_poison() { 329; CHECK-LABEL: @fptosi_f32_to_i32_poison( 330; CHECK-NEXT: ret i32 0 331; 332 %r = call i32 @llvm.fptosi.sat.i32.f32(float poison) 333 ret i32 %r 334} 335 336define i32 @fptosi_f32_to_i32_undef() { 337; CHECK-LABEL: @fptosi_f32_to_i32_undef( 338; CHECK-NEXT: ret i32 0 339; 340 %r = call i32 @llvm.fptosi.sat.i32.f32(float undef) 341 ret i32 %r 342} 343 344define i32 @fptosi_f32_to_i32_pos_zero() { 345; CHECK-LABEL: @fptosi_f32_to_i32_pos_zero( 346; CHECK-NEXT: ret i32 0 347; 348 %r = call i32 @llvm.fptosi.sat.i32.f32(float 0.0) 349 ret i32 %r 350} 351 352define i32 @fptosi_f32_to_i32_neg_zero() { 353; CHECK-LABEL: @fptosi_f32_to_i32_neg_zero( 354; CHECK-NEXT: ret i32 0 355; 356 %r = call i32 @llvm.fptosi.sat.i32.f32(float -0.0) 357 ret i32 %r 358} 359 360define i32 @fptosi_f32_to_i32_exact() { 361; CHECK-LABEL: @fptosi_f32_to_i32_exact( 362; CHECK-NEXT: ret i32 42 363; 364 %r = call i32 @llvm.fptosi.sat.i32.f32(float 42.0) 365 ret i32 %r 366} 367 368define i32 @fptosi_f32_to_i32_trunc() { 369; CHECK-LABEL: @fptosi_f32_to_i32_trunc( 370; CHECK-NEXT: ret i32 42 371; 372 %r = call i32 @llvm.fptosi.sat.i32.f32(float 42.5) 373 ret i32 %r 374} 375 376define i32 @fptosi_f32_to_i32_trunc_neg() { 377; CHECK-LABEL: @fptosi_f32_to_i32_trunc_neg( 378; CHECK-NEXT: ret i32 -42 379; 380 %r = call i32 @llvm.fptosi.sat.i32.f32(float -42.5) 381 ret i32 %r 382} 383 384define i32 @fptosi_f32_to_i32_below_max() { 385; CHECK-LABEL: @fptosi_f32_to_i32_below_max( 386; CHECK-NEXT: ret i32 2147483520 387; 388 %r = call i32 @llvm.fptosi.sat.i32.f32(float 2147483520.0) 389 ret i32 %r 390} 391 392define i32 @fptosi_f32_to_i32_above_max() { 393; CHECK-LABEL: @fptosi_f32_to_i32_above_max( 394; CHECK-NEXT: ret i32 2147483647 395; 396 %r = call i32 @llvm.fptosi.sat.i32.f32(float 2147483648.0) 397 ret i32 %r 398} 399 400define i32 @fptosi_f32_to_i32_above_min() { 401; CHECK-LABEL: @fptosi_f32_to_i32_above_min( 402; CHECK-NEXT: ret i32 -2147483520 403; 404 %r = call i32 @llvm.fptosi.sat.i32.f32(float -2147483520.0) 405 ret i32 %r 406} 407 408define i32 @fptosi_f32_to_i32_min() { 409; CHECK-LABEL: @fptosi_f32_to_i32_min( 410; CHECK-NEXT: ret i32 -2147483648 411; 412 %r = call i32 @llvm.fptosi.sat.i32.f32(float -2147483648.0) 413 ret i32 %r 414} 415 416define i32 @fptosi_f32_to_i32_below_min() { 417; CHECK-LABEL: @fptosi_f32_to_i32_below_min( 418; CHECK-NEXT: ret i32 -2147483648 419; 420 %r = call i32 @llvm.fptosi.sat.i32.f32(float -2147483904.0) 421 ret i32 %r 422} 423 424define i32 @fptosi_f32_to_i32_inf() { 425; CHECK-LABEL: @fptosi_f32_to_i32_inf( 426; CHECK-NEXT: ret i32 2147483647 427; 428 %r = call i32 @llvm.fptosi.sat.i32.f32(float 0x7ff0000000000000) 429 ret i32 %r 430} 431 432define i32 @fptosi_f32_to_i32_neg_inf() { 433; CHECK-LABEL: @fptosi_f32_to_i32_neg_inf( 434; CHECK-NEXT: ret i32 -2147483648 435; 436 %r = call i32 @llvm.fptosi.sat.i32.f32(float 0xfff0000000000000) 437 ret i32 %r 438} 439 440define i32 @fptosi_f32_to_i32_nan1() { 441; CHECK-LABEL: @fptosi_f32_to_i32_nan1( 442; CHECK-NEXT: ret i32 0 443; 444 %r = call i32 @llvm.fptosi.sat.i32.f32(float 0x7ff8000000000000) 445 ret i32 %r 446} 447 448define i32 @fptosi_f32_to_i32_nan2() { 449; CHECK-LABEL: @fptosi_f32_to_i32_nan2( 450; CHECK-NEXT: ret i32 0 451; 452 %r = call i32 @llvm.fptosi.sat.i32.f32(float 0x7ff4000000000000) 453 ret i32 %r 454} 455 456define i32 @fptosi_f32_to_i32_nan3() { 457; CHECK-LABEL: @fptosi_f32_to_i32_nan3( 458; CHECK-NEXT: ret i32 0 459; 460 %r = call i32 @llvm.fptosi.sat.i32.f32(float 0xfff8000000000000) 461 ret i32 %r 462} 463 464define i32 @fptosi_f32_to_i32_nan4() { 465; CHECK-LABEL: @fptosi_f32_to_i32_nan4( 466; CHECK-NEXT: ret i32 0 467; 468 %r = call i32 @llvm.fptosi.sat.i32.f32(float 0xfff4000000000000) 469 ret i32 %r 470} 471 472define <2 x i32> @fptosi_f32_to_i32_vec() { 473; CHECK-LABEL: @fptosi_f32_to_i32_vec( 474; CHECK-NEXT: ret <2 x i32> <i32 42, i32 -42> 475; 476 %r = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f32(<2 x float> <float 42.5, float -42.5>) 477 ret <2 x i32> %r 478} 479 480; 481; 482; F32 -> U32 483; 484; 485 486define i32 @fptoui_f32_to_i32_poison() { 487; CHECK-LABEL: @fptoui_f32_to_i32_poison( 488; CHECK-NEXT: ret i32 0 489; 490 %r = call i32 @llvm.fptoui.sat.i32.f32(float poison) 491 ret i32 %r 492} 493 494define i32 @fptoui_f32_to_i32_undef() { 495; CHECK-LABEL: @fptoui_f32_to_i32_undef( 496; CHECK-NEXT: ret i32 0 497; 498 %r = call i32 @llvm.fptoui.sat.i32.f32(float undef) 499 ret i32 %r 500} 501 502define i32 @fptoui_f32_to_i32_pos_zero() { 503; CHECK-LABEL: @fptoui_f32_to_i32_pos_zero( 504; CHECK-NEXT: ret i32 0 505; 506 %r = call i32 @llvm.fptoui.sat.i32.f32(float 0.0) 507 ret i32 %r 508} 509 510define i32 @fptoui_f32_to_i32_neg_zero() { 511; CHECK-LABEL: @fptoui_f32_to_i32_neg_zero( 512; CHECK-NEXT: ret i32 0 513; 514 %r = call i32 @llvm.fptoui.sat.i32.f32(float -0.0) 515 ret i32 %r 516} 517 518define i32 @fptoui_f32_to_i32_exact() { 519; CHECK-LABEL: @fptoui_f32_to_i32_exact( 520; CHECK-NEXT: ret i32 42 521; 522 %r = call i32 @llvm.fptoui.sat.i32.f32(float 42.0) 523 ret i32 %r 524} 525 526define i32 @fptoui_f32_to_i32_trunc() { 527; CHECK-LABEL: @fptoui_f32_to_i32_trunc( 528; CHECK-NEXT: ret i32 42 529; 530 %r = call i32 @llvm.fptoui.sat.i32.f32(float 42.5) 531 ret i32 %r 532} 533 534define i32 @fptoui_f32_to_i32_trunc_neg() { 535; CHECK-LABEL: @fptoui_f32_to_i32_trunc_neg( 536; CHECK-NEXT: ret i32 0 537; 538 %r = call i32 @llvm.fptoui.sat.i32.f32(float -42.5) 539 ret i32 %r 540} 541 542define i32 @fptoui_f32_to_i32_below_max() { 543; CHECK-LABEL: @fptoui_f32_to_i32_below_max( 544; CHECK-NEXT: ret i32 -256 545; 546 %r = call i32 @llvm.fptoui.sat.i32.f32(float 4294967040.0) 547 ret i32 %r 548} 549 550define i32 @fptoui_f32_to_i32_above_max() { 551; CHECK-LABEL: @fptoui_f32_to_i32_above_max( 552; CHECK-NEXT: ret i32 -1 553; 554 %r = call i32 @llvm.fptoui.sat.i32.f32(float 4294967296.0) 555 ret i32 %r 556} 557 558define i32 @fptoui_f32_to_i32_inf() { 559; CHECK-LABEL: @fptoui_f32_to_i32_inf( 560; CHECK-NEXT: ret i32 -1 561; 562 %r = call i32 @llvm.fptoui.sat.i32.f32(float 0x7ff0000000000000) 563 ret i32 %r 564} 565 566define i32 @fptoui_f32_to_i32_neg_inf() { 567; CHECK-LABEL: @fptoui_f32_to_i32_neg_inf( 568; CHECK-NEXT: ret i32 0 569; 570 %r = call i32 @llvm.fptoui.sat.i32.f32(float 0xfff0000000000000) 571 ret i32 %r 572} 573 574define i32 @fptoui_f32_to_i32_nan1() { 575; CHECK-LABEL: @fptoui_f32_to_i32_nan1( 576; CHECK-NEXT: ret i32 0 577; 578 %r = call i32 @llvm.fptoui.sat.i32.f32(float 0x7ff8000000000000) 579 ret i32 %r 580} 581 582define i32 @fptoui_f32_to_i32_nan2() { 583; CHECK-LABEL: @fptoui_f32_to_i32_nan2( 584; CHECK-NEXT: ret i32 0 585; 586 %r = call i32 @llvm.fptoui.sat.i32.f32(float 0x7ff4000000000000) 587 ret i32 %r 588} 589 590define i32 @fptoui_f32_to_i32_nan3() { 591; CHECK-LABEL: @fptoui_f32_to_i32_nan3( 592; CHECK-NEXT: ret i32 0 593; 594 %r = call i32 @llvm.fptoui.sat.i32.f32(float 0xfff8000000000000) 595 ret i32 %r 596} 597 598define i32 @fptoui_f32_to_i32_nan4() { 599; CHECK-LABEL: @fptoui_f32_to_i32_nan4( 600; CHECK-NEXT: ret i32 0 601; 602 %r = call i32 @llvm.fptoui.sat.i32.f32(float 0xfff4000000000000) 603 ret i32 %r 604} 605 606define <2 x i32> @fptoui_f32_to_i32_vec() { 607; CHECK-LABEL: @fptoui_f32_to_i32_vec( 608; CHECK-NEXT: ret <2 x i32> <i32 42, i32 0> 609; 610 %r = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f32(<2 x float> <float 42.5, float -42.5>) 611 ret <2 x i32> %r 612} 613