1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instsimplify %s | FileCheck %s 3 4define float @sitofp_floor(i32 %arg) { 5; CHECK-LABEL: @sitofp_floor( 6; CHECK-NEXT: [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float 7; CHECK-NEXT: ret float [[CVT]] 8; 9 %cvt = sitofp i32 %arg to float 10 %round = call float @llvm.floor.f32(float %cvt) 11 ret float %round 12} 13 14define float @uitofp_floor(i32 %arg) { 15; CHECK-LABEL: @uitofp_floor( 16; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float 17; CHECK-NEXT: ret float [[CVT]] 18; 19 %cvt = uitofp i32 %arg to float 20 %round = call float @llvm.floor.f32(float %cvt) 21 ret float %round 22} 23 24define float @sitofp_trunc(i32 %arg) { 25; CHECK-LABEL: @sitofp_trunc( 26; CHECK-NEXT: [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float 27; CHECK-NEXT: ret float [[CVT]] 28; 29 %cvt = sitofp i32 %arg to float 30 %round = call float @llvm.trunc.f32(float %cvt) 31 ret float %round 32} 33 34define float @uitofp_trunc(i32 %arg) { 35; CHECK-LABEL: @uitofp_trunc( 36; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float 37; CHECK-NEXT: ret float [[CVT]] 38; 39 %cvt = uitofp i32 %arg to float 40 %round = call float @llvm.trunc.f32(float %cvt) 41 ret float %round 42} 43 44define float @sitofp_ceil(i32 %arg) { 45; CHECK-LABEL: @sitofp_ceil( 46; CHECK-NEXT: [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float 47; CHECK-NEXT: ret float [[CVT]] 48; 49 %cvt = sitofp i32 %arg to float 50 %round = call float @llvm.ceil.f32(float %cvt) 51 ret float %round 52} 53 54define float @uitofp_ceil(i32 %arg) { 55; CHECK-LABEL: @uitofp_ceil( 56; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float 57; CHECK-NEXT: ret float [[CVT]] 58; 59 %cvt = uitofp i32 %arg to float 60 %round = call float @llvm.ceil.f32(float %cvt) 61 ret float %round 62} 63 64define float @sitofp_round(i32 %arg) { 65; CHECK-LABEL: @sitofp_round( 66; CHECK-NEXT: [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float 67; CHECK-NEXT: ret float [[CVT]] 68; 69 %cvt = sitofp i32 %arg to float 70 %round = call float @llvm.round.f32(float %cvt) 71 ret float %round 72} 73 74define float @uitofp_round(i32 %arg) { 75; CHECK-LABEL: @uitofp_round( 76; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float 77; CHECK-NEXT: ret float [[CVT]] 78; 79 %cvt = uitofp i32 %arg to float 80 %round = call float @llvm.round.f32(float %cvt) 81 ret float %round 82} 83 84define float @uitofp_roundeven(i32 %arg) { 85; CHECK-LABEL: @uitofp_roundeven( 86; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float 87; CHECK-NEXT: ret float [[CVT]] 88; 89 %cvt = uitofp i32 %arg to float 90 %round = call float @llvm.roundeven.f32(float %cvt) 91 ret float %round 92} 93 94define float @sitofp_nearbyint(i32 %arg) { 95; CHECK-LABEL: @sitofp_nearbyint( 96; CHECK-NEXT: [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float 97; CHECK-NEXT: ret float [[CVT]] 98; 99 %cvt = sitofp i32 %arg to float 100 %nearbyint = call float @llvm.nearbyint.f32(float %cvt) 101 ret float %nearbyint 102} 103 104define float @uitofp_nearbyint(i32 %arg) { 105; CHECK-LABEL: @uitofp_nearbyint( 106; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float 107; CHECK-NEXT: ret float [[CVT]] 108; 109 %cvt = uitofp i32 %arg to float 110 %nearbyint = call float @llvm.nearbyint.f32(float %cvt) 111 ret float %nearbyint 112} 113 114define float @sitofp_rint(i32 %arg) { 115; CHECK-LABEL: @sitofp_rint( 116; CHECK-NEXT: [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float 117; CHECK-NEXT: ret float [[CVT]] 118; 119 %cvt = sitofp i32 %arg to float 120 %rint = call float @llvm.rint.f32(float %cvt) 121 ret float %rint 122} 123 124define float @uitofp_rint(i32 %arg) { 125; CHECK-LABEL: @uitofp_rint( 126; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float 127; CHECK-NEXT: ret float [[CVT]] 128; 129 %cvt = uitofp i32 %arg to float 130 %rint = call float @llvm.rint.f32(float %cvt) 131 ret float %rint 132} 133 134define float @floor_trunc(float %x) { 135; CHECK-LABEL: @floor_trunc( 136; CHECK-NEXT: [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 137; CHECK-NEXT: ret float [[A]] 138; 139 %a = call float @llvm.floor.f32(float %x) 140 %r = call float @llvm.trunc.f32(float %a) 141 ret float %r 142} 143 144define float @floor_ceil(float %x) { 145; CHECK-LABEL: @floor_ceil( 146; CHECK-NEXT: [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 147; CHECK-NEXT: ret float [[A]] 148; 149 %a = call float @llvm.floor.f32(float %x) 150 %r = call float @llvm.ceil.f32(float %a) 151 ret float %r 152} 153 154define float @floor_round(float %x) { 155; CHECK-LABEL: @floor_round( 156; CHECK-NEXT: [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 157; CHECK-NEXT: ret float [[A]] 158; 159 %a = call float @llvm.floor.f32(float %x) 160 %r = call float @llvm.round.f32(float %a) 161 ret float %r 162} 163 164define float @floor_roundeven(float %x) { 165; CHECK-LABEL: @floor_roundeven( 166; CHECK-NEXT: [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 167; CHECK-NEXT: ret float [[A]] 168; 169 %a = call float @llvm.floor.f32(float %x) 170 %r = call float @llvm.roundeven.f32(float %a) 171 ret float %r 172} 173 174define float @floor_nearbyint(float %x) { 175; CHECK-LABEL: @floor_nearbyint( 176; CHECK-NEXT: [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 177; CHECK-NEXT: ret float [[A]] 178; 179 %a = call float @llvm.floor.f32(float %x) 180 %r = call float @llvm.nearbyint.f32(float %a) 181 ret float %r 182} 183 184define float @floor_rint(float %x) { 185; CHECK-LABEL: @floor_rint( 186; CHECK-NEXT: [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 187; CHECK-NEXT: ret float [[A]] 188; 189 %a = call float @llvm.floor.f32(float %x) 190 %r = call float @llvm.rint.f32(float %a) 191 ret float %r 192} 193 194define float @trunc_floor(float %x) { 195; CHECK-LABEL: @trunc_floor( 196; CHECK-NEXT: [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 197; CHECK-NEXT: ret float [[A]] 198; 199 %a = call float @llvm.trunc.f32(float %x) 200 %r = call float @llvm.floor.f32(float %a) 201 ret float %r 202} 203 204define float @trunc_ceil(float %x) { 205; CHECK-LABEL: @trunc_ceil( 206; CHECK-NEXT: [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 207; CHECK-NEXT: ret float [[A]] 208; 209 %a = call float @llvm.trunc.f32(float %x) 210 %r = call float @llvm.ceil.f32(float %a) 211 ret float %r 212} 213 214define float @trunc_round(float %x) { 215; CHECK-LABEL: @trunc_round( 216; CHECK-NEXT: [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 217; CHECK-NEXT: ret float [[A]] 218; 219 %a = call float @llvm.trunc.f32(float %x) 220 %r = call float @llvm.round.f32(float %a) 221 ret float %r 222} 223 224define float @trunc_roundeven(float %x) { 225; CHECK-LABEL: @trunc_roundeven( 226; CHECK-NEXT: [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 227; CHECK-NEXT: ret float [[A]] 228; 229 %a = call float @llvm.trunc.f32(float %x) 230 %r = call float @llvm.roundeven.f32(float %a) 231 ret float %r 232} 233 234define float @trunc_nearbyint(float %x) { 235; CHECK-LABEL: @trunc_nearbyint( 236; CHECK-NEXT: [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 237; CHECK-NEXT: ret float [[A]] 238; 239 %a = call float @llvm.trunc.f32(float %x) 240 %r = call float @llvm.nearbyint.f32(float %a) 241 ret float %r 242} 243 244define float @trunc_rint(float %x) { 245; CHECK-LABEL: @trunc_rint( 246; CHECK-NEXT: [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 247; CHECK-NEXT: ret float [[A]] 248; 249 %a = call float @llvm.trunc.f32(float %x) 250 %r = call float @llvm.rint.f32(float %a) 251 ret float %r 252} 253 254define float @ceil_floor(float %x) { 255; CHECK-LABEL: @ceil_floor( 256; CHECK-NEXT: [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 257; CHECK-NEXT: ret float [[A]] 258; 259 %a = call float @llvm.ceil.f32(float %x) 260 %r = call float @llvm.floor.f32(float %a) 261 ret float %r 262} 263 264define float @ceil_trunc(float %x) { 265; CHECK-LABEL: @ceil_trunc( 266; CHECK-NEXT: [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 267; CHECK-NEXT: ret float [[A]] 268; 269 %a = call float @llvm.ceil.f32(float %x) 270 %r = call float @llvm.trunc.f32(float %a) 271 ret float %r 272} 273 274define float @ceil_round(float %x) { 275; CHECK-LABEL: @ceil_round( 276; CHECK-NEXT: [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 277; CHECK-NEXT: ret float [[A]] 278; 279 %a = call float @llvm.ceil.f32(float %x) 280 %r = call float @llvm.round.f32(float %a) 281 ret float %r 282} 283 284define float @ceil_roundeven(float %x) { 285; CHECK-LABEL: @ceil_roundeven( 286; CHECK-NEXT: [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 287; CHECK-NEXT: ret float [[A]] 288; 289 %a = call float @llvm.ceil.f32(float %x) 290 %r = call float @llvm.roundeven.f32(float %a) 291 ret float %r 292} 293 294define float @ceil_nearbyint(float %x) { 295; CHECK-LABEL: @ceil_nearbyint( 296; CHECK-NEXT: [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 297; CHECK-NEXT: ret float [[A]] 298; 299 %a = call float @llvm.ceil.f32(float %x) 300 %r = call float @llvm.nearbyint.f32(float %a) 301 ret float %r 302} 303 304define float @ceil_rint(float %x) { 305; CHECK-LABEL: @ceil_rint( 306; CHECK-NEXT: [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 307; CHECK-NEXT: ret float [[A]] 308; 309 %a = call float @llvm.ceil.f32(float %x) 310 %r = call float @llvm.rint.f32(float %a) 311 ret float %r 312} 313 314define float @round_floor(float %x) { 315; CHECK-LABEL: @round_floor( 316; CHECK-NEXT: [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 317; CHECK-NEXT: ret float [[A]] 318; 319 %a = call float @llvm.round.f32(float %x) 320 %r = call float @llvm.floor.f32(float %a) 321 ret float %r 322} 323 324define float @round_trunc(float %x) { 325; CHECK-LABEL: @round_trunc( 326; CHECK-NEXT: [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 327; CHECK-NEXT: ret float [[A]] 328; 329 %a = call float @llvm.round.f32(float %x) 330 %r = call float @llvm.trunc.f32(float %a) 331 ret float %r 332} 333 334define float @round_ceil(float %x) { 335; CHECK-LABEL: @round_ceil( 336; CHECK-NEXT: [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 337; CHECK-NEXT: ret float [[A]] 338; 339 %a = call float @llvm.round.f32(float %x) 340 %r = call float @llvm.ceil.f32(float %a) 341 ret float %r 342} 343 344define float @round_roundeven(float %x) { 345; CHECK-LABEL: @round_roundeven( 346; CHECK-NEXT: [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 347; CHECK-NEXT: ret float [[A]] 348; 349 %a = call float @llvm.round.f32(float %x) 350 %r = call float @llvm.roundeven.f32(float %a) 351 ret float %r 352} 353 354define float @round_nearbyint(float %x) { 355; CHECK-LABEL: @round_nearbyint( 356; CHECK-NEXT: [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 357; CHECK-NEXT: ret float [[A]] 358; 359 %a = call float @llvm.round.f32(float %x) 360 %r = call float @llvm.nearbyint.f32(float %a) 361 ret float %r 362} 363 364define float @round_rint(float %x) { 365; CHECK-LABEL: @round_rint( 366; CHECK-NEXT: [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 367; CHECK-NEXT: ret float [[A]] 368; 369 %a = call float @llvm.round.f32(float %x) 370 %r = call float @llvm.rint.f32(float %a) 371 ret float %r 372} 373 374define float @roundeven_floor(float %x) { 375; CHECK-LABEL: @roundeven_floor( 376; CHECK-NEXT: [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 377; CHECK-NEXT: ret float [[A]] 378; 379 %a = call float @llvm.roundeven.f32(float %x) 380 %r = call float @llvm.floor.f32(float %a) 381 ret float %r 382} 383 384define float @roundeven_trunc(float %x) { 385; CHECK-LABEL: @roundeven_trunc( 386; CHECK-NEXT: [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 387; CHECK-NEXT: ret float [[A]] 388; 389 %a = call float @llvm.roundeven.f32(float %x) 390 %r = call float @llvm.trunc.f32(float %a) 391 ret float %r 392} 393 394define float @roundeven_ceil(float %x) { 395; CHECK-LABEL: @roundeven_ceil( 396; CHECK-NEXT: [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 397; CHECK-NEXT: ret float [[A]] 398; 399 %a = call float @llvm.roundeven.f32(float %x) 400 %r = call float @llvm.ceil.f32(float %a) 401 ret float %r 402} 403 404define float @roundeven_round(float %x) { 405; CHECK-LABEL: @roundeven_round( 406; CHECK-NEXT: [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 407; CHECK-NEXT: ret float [[A]] 408; 409 %a = call float @llvm.roundeven.f32(float %x) 410 %r = call float @llvm.round.f32(float %a) 411 ret float %r 412} 413 414define float @roundeven_nearbyint(float %x) { 415; CHECK-LABEL: @roundeven_nearbyint( 416; CHECK-NEXT: [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 417; CHECK-NEXT: ret float [[A]] 418; 419 %a = call float @llvm.roundeven.f32(float %x) 420 %r = call float @llvm.nearbyint.f32(float %a) 421 ret float %r 422} 423 424define float @roundeven_rint(float %x) { 425; CHECK-LABEL: @roundeven_rint( 426; CHECK-NEXT: [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 427; CHECK-NEXT: ret float [[A]] 428; 429 %a = call float @llvm.roundeven.f32(float %x) 430 %r = call float @llvm.rint.f32(float %a) 431 ret float %r 432} 433 434define float @nearbyint_floor(float %x) { 435; CHECK-LABEL: @nearbyint_floor( 436; CHECK-NEXT: [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 437; CHECK-NEXT: ret float [[A]] 438; 439 %a = call float @llvm.nearbyint.f32(float %x) 440 %r = call float @llvm.floor.f32(float %a) 441 ret float %r 442} 443 444define float @nearbyint_trunc(float %x) { 445; CHECK-LABEL: @nearbyint_trunc( 446; CHECK-NEXT: [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 447; CHECK-NEXT: ret float [[A]] 448; 449 %a = call float @llvm.nearbyint.f32(float %x) 450 %r = call float @llvm.trunc.f32(float %a) 451 ret float %r 452} 453 454define float @nearbyint_ceil(float %x) { 455; CHECK-LABEL: @nearbyint_ceil( 456; CHECK-NEXT: [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 457; CHECK-NEXT: ret float [[A]] 458; 459 %a = call float @llvm.nearbyint.f32(float %x) 460 %r = call float @llvm.ceil.f32(float %a) 461 ret float %r 462} 463 464define float @nearbyint_round(float %x) { 465; CHECK-LABEL: @nearbyint_round( 466; CHECK-NEXT: [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 467; CHECK-NEXT: ret float [[A]] 468; 469 %a = call float @llvm.nearbyint.f32(float %x) 470 %r = call float @llvm.round.f32(float %a) 471 ret float %r 472} 473 474define float @nearbyint_roundeven(float %x) { 475; CHECK-LABEL: @nearbyint_roundeven( 476; CHECK-NEXT: [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 477; CHECK-NEXT: ret float [[A]] 478; 479 %a = call float @llvm.nearbyint.f32(float %x) 480 %r = call float @llvm.roundeven.f32(float %a) 481 ret float %r 482} 483 484define float @nearbyint_rint(float %x) { 485; CHECK-LABEL: @nearbyint_rint( 486; CHECK-NEXT: [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 487; CHECK-NEXT: ret float [[A]] 488; 489 %a = call float @llvm.nearbyint.f32(float %x) 490 %r = call float @llvm.rint.f32(float %a) 491 ret float %r 492} 493 494define float @rint_floor(float %x) { 495; CHECK-LABEL: @rint_floor( 496; CHECK-NEXT: [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 497; CHECK-NEXT: ret float [[A]] 498; 499 %a = call float @llvm.rint.f32(float %x) 500 %r = call float @llvm.floor.f32(float %a) 501 ret float %r 502} 503 504define float @rint_trunc(float %x) { 505; CHECK-LABEL: @rint_trunc( 506; CHECK-NEXT: [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 507; CHECK-NEXT: ret float [[A]] 508; 509 %a = call float @llvm.rint.f32(float %x) 510 %r = call float @llvm.trunc.f32(float %a) 511 ret float %r 512} 513 514define float @rint_ceil(float %x) { 515; CHECK-LABEL: @rint_ceil( 516; CHECK-NEXT: [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 517; CHECK-NEXT: ret float [[A]] 518; 519 %a = call float @llvm.rint.f32(float %x) 520 %r = call float @llvm.ceil.f32(float %a) 521 ret float %r 522} 523 524define float @rint_round(float %x) { 525; CHECK-LABEL: @rint_round( 526; CHECK-NEXT: [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 527; CHECK-NEXT: ret float [[A]] 528; 529 %a = call float @llvm.rint.f32(float %x) 530 %r = call float @llvm.round.f32(float %a) 531 ret float %r 532} 533 534define float @rint_roundeven(float %x) { 535; CHECK-LABEL: @rint_roundeven( 536; CHECK-NEXT: [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 537; CHECK-NEXT: ret float [[A]] 538; 539 %a = call float @llvm.rint.f32(float %x) 540 %r = call float @llvm.roundeven.f32(float %a) 541 ret float %r 542} 543 544define float @rint_nearbyint(float %x) { 545; CHECK-LABEL: @rint_nearbyint( 546; CHECK-NEXT: [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 547; CHECK-NEXT: ret float [[A]] 548; 549 %a = call float @llvm.rint.f32(float %x) 550 %r = call float @llvm.nearbyint.f32(float %a) 551 ret float %r 552} 553 554declare float @llvm.floor.f32(float) #0 555declare float @llvm.trunc.f32(float) #0 556declare float @llvm.ceil.f32(float) #0 557declare float @llvm.round.f32(float) #0 558declare float @llvm.roundeven.f32(float) #0 559declare float @llvm.nearbyint.f32(float) #0 560declare float @llvm.rint.f32(float) #0 561 562attributes #0 = { nounwind readnone speculatable } 563