1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 4target triple = "x86_64-apple-macosx10.8.0" 5 6define i1 @test1(float %x, float %y) { 7; CHECK-LABEL: @test1( 8; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 9; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 10; CHECK-NEXT: ret i1 [[CMP]] 11; 12 %x.ext = fpext float %x to double 13 %ceil = call double @ceil(double %x.ext) nounwind readnone 14 %ext.y = fpext float %y to double 15 %cmp = fcmp oeq double %ceil, %ext.y 16 ret i1 %cmp 17} 18 19define i1 @test1_intrin(float %x, float %y) { 20; CHECK-LABEL: @test1_intrin( 21; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 22; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 23; CHECK-NEXT: ret i1 [[CMP]] 24; 25 %x.ext = fpext float %x to double 26 %ceil = call double @llvm.ceil.f64(double %x.ext) nounwind readnone 27 %ext.y = fpext float %y to double 28 %cmp = fcmp oeq double %ceil, %ext.y 29 ret i1 %cmp 30} 31 32define i1 @test2(float %x, float %y) { 33; CHECK-LABEL: @test2( 34; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]]) 35; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 36; CHECK-NEXT: ret i1 [[CMP]] 37; 38 %x.ext = fpext float %x to double 39 %fabs = call double @fabs(double %x.ext) nounwind readnone 40 %y.ext = fpext float %y to double 41 %cmp = fcmp oeq double %fabs, %y.ext 42 ret i1 %cmp 43} 44 45define i1 @test2_intrin(float %x, float %y) { 46; CHECK-LABEL: @test2_intrin( 47; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]]) 48; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 49; CHECK-NEXT: ret i1 [[CMP]] 50; 51 %x.ext = fpext float %x to double 52 %fabs = call double @llvm.fabs.f64(double %x.ext) nounwind readnone 53 %y.ext = fpext float %y to double 54 %cmp = fcmp oeq double %fabs, %y.ext 55 ret i1 %cmp 56} 57 58define i1 @fmf_test2(float %x, float %y) { 59; CHECK-LABEL: @fmf_test2( 60; CHECK-NEXT: [[TMP1:%.*]] = call nnan float @llvm.fabs.f32(float [[X:%.*]]) 61; CHECK-NEXT: [[TMP2:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 62; CHECK-NEXT: ret i1 [[TMP2]] 63; 64 %1 = fpext float %x to double 65 %2 = call nnan double @fabs(double %1) nounwind readnone 66 %3 = fpext float %y to double 67 %4 = fcmp oeq double %2, %3 68 ret i1 %4 69} 70 71define i1 @test3(float %x, float %y) { 72; CHECK-LABEL: @test3( 73; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 74; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 75; CHECK-NEXT: ret i1 [[CMP]] 76; 77 %x.ext = fpext float %x to double 78 %floor = call double @floor(double %x.ext) nounwind readnone 79 %y.ext = fpext float %y to double 80 %cmp = fcmp oeq double %floor, %y.ext 81 ret i1 %cmp 82} 83 84 85define i1 @test3_intrin(float %x, float %y) { 86; CHECK-LABEL: @test3_intrin( 87; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 88; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 89; CHECK-NEXT: ret i1 [[CMP]] 90; 91 %x.ext = fpext float %x to double 92 %floor = call double @llvm.floor.f64(double %x.ext) nounwind readnone 93 %y.ext = fpext float %y to double 94 %cmp = fcmp oeq double %floor, %y.ext 95 ret i1 %cmp 96} 97 98define i1 @test4(float %x, float %y) { 99; CHECK-LABEL: @test4( 100; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 101; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 102; CHECK-NEXT: ret i1 [[CMP]] 103; 104 %x.ext = fpext float %x to double 105 %nearbyint = call double @nearbyint(double %x.ext) nounwind 106 %y.ext = fpext float %y to double 107 %cmp = fcmp oeq double %nearbyint, %y.ext 108 ret i1 %cmp 109} 110 111define i1 @shrink_nearbyint_intrin(float %x, float %y) { 112; CHECK-LABEL: @shrink_nearbyint_intrin( 113; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 114; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 115; CHECK-NEXT: ret i1 [[CMP]] 116; 117 %x.ext = fpext float %x to double 118 %nearbyint = call double @llvm.nearbyint.f64(double %x.ext) nounwind 119 %y.ext = fpext float %y to double 120 %cmp = fcmp oeq double %nearbyint, %y.ext 121 ret i1 %cmp 122} 123 124define i1 @test5(float %x, float %y) { 125; CHECK-LABEL: @test5( 126; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 127; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 128; CHECK-NEXT: ret i1 [[CMP]] 129; 130 %x.ext = fpext float %x to double 131 %rint = call double @rint(double %x.ext) nounwind 132 %y.ext = fpext float %y to double 133 %cmp = fcmp oeq double %rint, %y.ext 134 ret i1 %cmp 135} 136 137define i1 @test6(float %x, float %y) { 138; CHECK-LABEL: @test6( 139; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 140; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 141; CHECK-NEXT: ret i1 [[CMP]] 142; 143 %x.ext = fpext float %x to double 144 %round = call double @round(double %x.ext) nounwind readnone 145 %y.ext = fpext float %y to double 146 %cmp = fcmp oeq double %round, %y.ext 147 ret i1 %cmp 148} 149 150define i1 @test6_intrin(float %x, float %y) { 151; CHECK-LABEL: @test6_intrin( 152; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 153; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 154; CHECK-NEXT: ret i1 [[CMP]] 155; 156 %x.ext = fpext float %x to double 157 %round = call double @llvm.round.f64(double %x.ext) nounwind readnone 158 %y.ext = fpext float %y to double 159 %cmp = fcmp oeq double %round, %y.ext 160 ret i1 %cmp 161} 162 163define i1 @test6a(float %x, float %y) { 164; CHECK-LABEL: @test6a( 165; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 166; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 167; CHECK-NEXT: ret i1 [[CMP]] 168; 169 %x.ext = fpext float %x to double 170 %round = call double @roundeven(double %x.ext) nounwind readnone 171 %y.ext = fpext float %y to double 172 %cmp = fcmp oeq double %round, %y.ext 173 ret i1 %cmp 174} 175 176define i1 @test6a_intrin(float %x, float %y) { 177; CHECK-LABEL: @test6a_intrin( 178; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 179; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 180; CHECK-NEXT: ret i1 [[CMP]] 181; 182 %x.ext = fpext float %x to double 183 %round = call double @llvm.roundeven.f64(double %x.ext) nounwind readnone 184 %y.ext = fpext float %y to double 185 %cmp = fcmp oeq double %round, %y.ext 186 ret i1 %cmp 187} 188 189define i1 @test7(float %x, float %y) { 190; CHECK-LABEL: @test7( 191; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 192; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 193; CHECK-NEXT: ret i1 [[CMP]] 194; 195 %x.ext = fpext float %x to double 196 %trunc = call double @trunc(double %x.ext) nounwind 197 %y.ext = fpext float %y to double 198 %cmp = fcmp oeq double %trunc, %y.ext 199 ret i1 %cmp 200} 201 202define i1 @test7_intrin(float %x, float %y) { 203; CHECK-LABEL: @test7_intrin( 204; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 205; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 206; CHECK-NEXT: ret i1 [[CMP]] 207; 208 %x.ext = fpext float %x to double 209 %trunc = call double @llvm.trunc.f64(double %x.ext) nounwind 210 %y.ext = fpext float %y to double 211 %cmp = fcmp oeq double %trunc, %y.ext 212 ret i1 %cmp 213} 214 215define i1 @test8(float %x, float %y) { 216; CHECK-LABEL: @test8( 217; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 218; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 219; CHECK-NEXT: ret i1 [[CMP]] 220; 221 %x.ext = fpext float %x to double 222 %y.ext = fpext float %y to double 223 %ceil = call double @ceil(double %x.ext) nounwind readnone 224 %cmp = fcmp oeq double %y.ext, %ceil 225 ret i1 %cmp 226} 227 228define i1 @test8_intrin(float %x, float %y) { 229; CHECK-LABEL: @test8_intrin( 230; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 231; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 232; CHECK-NEXT: ret i1 [[CMP]] 233; 234 %x.ext = fpext float %x to double 235 %y.ext = fpext float %y to double 236 %ceil = call double @llvm.ceil.f64(double %x.ext) nounwind readnone 237 %cmp = fcmp oeq double %y.ext, %ceil 238 ret i1 %cmp 239} 240 241define i1 @test9(float %x, float %y) { 242; CHECK-LABEL: @test9( 243; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]]) 244; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 245; CHECK-NEXT: ret i1 [[CMP]] 246; 247 %x.ext = fpext float %x to double 248 %y.ext = fpext float %y to double 249 %fabs = call double @fabs(double %x.ext) nounwind readnone 250 %cmp = fcmp oeq double %y.ext, %fabs 251 ret i1 %cmp 252} 253 254define i1 @test9_intrin(float %x, float %y) { 255; CHECK-LABEL: @test9_intrin( 256; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]]) 257; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 258; CHECK-NEXT: ret i1 [[CMP]] 259; 260 %x.ext = fpext float %x to double 261 %y.ext = fpext float %y to double 262 %fabs = call double @llvm.fabs.f64(double %x.ext) nounwind readnone 263 %cmp = fcmp oeq double %y.ext, %fabs 264 ret i1 %cmp 265} 266 267define i1 @test10(float %x, float %y) { 268; CHECK-LABEL: @test10( 269; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 270; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 271; CHECK-NEXT: ret i1 [[CMP]] 272; 273 %x.ext = fpext float %x to double 274 %y.ext = fpext float %y to double 275 %floor = call double @floor(double %x.ext) nounwind readnone 276 %cmp = fcmp oeq double %floor, %y.ext 277 ret i1 %cmp 278} 279 280define i1 @test10_intrin(float %x, float %y) { 281; CHECK-LABEL: @test10_intrin( 282; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 283; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 284; CHECK-NEXT: ret i1 [[CMP]] 285; 286 %x.ext = fpext float %x to double 287 %y.ext = fpext float %y to double 288 %floor = call double @llvm.floor.f64(double %x.ext) nounwind readnone 289 %cmp = fcmp oeq double %floor, %y.ext 290 ret i1 %cmp 291} 292 293define i1 @test11(float %x, float %y) { 294; CHECK-LABEL: @test11( 295; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 296; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 297; CHECK-NEXT: ret i1 [[CMP]] 298; 299 %x.ext = fpext float %x to double 300 %y.ext = fpext float %y to double 301 %nearbyint = call double @nearbyint(double %x.ext) nounwind 302 %cmp = fcmp oeq double %nearbyint, %y.ext 303 ret i1 %cmp 304} 305 306define i1 @test11_intrin(float %x, float %y) { 307; CHECK-LABEL: @test11_intrin( 308; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]]) 309; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[TMP1]], [[Y:%.*]] 310; CHECK-NEXT: ret i1 [[CMP]] 311; 312 %x.ext = fpext float %x to double 313 %y.ext = fpext float %y to double 314 %nearbyint = call double @llvm.nearbyint.f64(double %x.ext) nounwind 315 %cmp = fcmp oeq double %nearbyint, %y.ext 316 ret i1 %cmp 317} 318 319define i1 @test12(float %x, float %y) { 320; CHECK-LABEL: @test12( 321; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.rint.f32(float [[X:%.*]]) 322; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 323; CHECK-NEXT: ret i1 [[CMP]] 324; 325 %x.ext = fpext float %x to double 326 %y.ext = fpext float %y to double 327 %rint = call double @rint(double %x.ext) nounwind 328 %cmp = fcmp oeq double %y.ext, %rint 329 ret i1 %cmp 330} 331 332define i1 @test13(float %x, float %y) { 333; CHECK-LABEL: @test13( 334; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 335; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 336; CHECK-NEXT: ret i1 [[CMP]] 337; 338 %x.ext = fpext float %x to double 339 %y.ext = fpext float %y to double 340 %round = call double @round(double %x.ext) nounwind readnone 341 %cmp = fcmp oeq double %y.ext, %round 342 ret i1 %cmp 343} 344 345define i1 @test13_intrin(float %x, float %y) { 346; CHECK-LABEL: @test13_intrin( 347; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.round.f32(float [[X:%.*]]) 348; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 349; CHECK-NEXT: ret i1 [[CMP]] 350; 351 %x.ext = fpext float %x to double 352 %y.ext = fpext float %y to double 353 %round = call double @llvm.round.f64(double %x.ext) nounwind readnone 354 %cmp = fcmp oeq double %y.ext, %round 355 ret i1 %cmp 356} 357 358define i1 @test13a(float %x, float %y) { 359; CHECK-LABEL: @test13a( 360; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 361; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 362; CHECK-NEXT: ret i1 [[CMP]] 363; 364 %x.ext = fpext float %x to double 365 %y.ext = fpext float %y to double 366 %round = call double @roundeven(double %x.ext) nounwind readnone 367 %cmp = fcmp oeq double %y.ext, %round 368 ret i1 %cmp 369} 370 371define i1 @test13a_intrin(float %x, float %y) { 372; CHECK-LABEL: @test13a_intrin( 373; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]]) 374; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 375; CHECK-NEXT: ret i1 [[CMP]] 376; 377 %x.ext = fpext float %x to double 378 %y.ext = fpext float %y to double 379 %round = call double @llvm.roundeven.f64(double %x.ext) nounwind readnone 380 %cmp = fcmp oeq double %y.ext, %round 381 ret i1 %cmp 382} 383 384define i1 @test14(float %x, float %y) { 385; CHECK-LABEL: @test14( 386; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 387; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 388; CHECK-NEXT: ret i1 [[CMP]] 389; 390 %x.ext = fpext float %x to double 391 %y.ext = fpext float %y to double 392 %trunc = call double @trunc(double %x.ext) nounwind 393 %cmp = fcmp oeq double %y.ext, %trunc 394 ret i1 %cmp 395} 396 397define i1 @test14_intrin(float %x, float %y) { 398; CHECK-LABEL: @test14_intrin( 399; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]]) 400; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y:%.*]], [[TMP1]] 401; CHECK-NEXT: ret i1 [[CMP]] 402; 403 %x.ext = fpext float %x to double 404 %y.ext = fpext float %y to double 405 %trunc = call double @llvm.trunc.f64(double %x.ext) nounwind 406 %cmp = fcmp oeq double %y.ext, %trunc 407 ret i1 %cmp 408} 409 410define i1 @test15(float %x, float %y, float %z) { 411; CHECK-LABEL: @test15( 412; CHECK-NEXT: [[FMINF:%.*]] = call nsz float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]]) 413; CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq float [[FMINF]], [[Z:%.*]] 414; CHECK-NEXT: ret i1 [[TMP1]] 415; 416 %1 = fpext float %x to double 417 %2 = fpext float %y to double 418 %3 = call double @fmin(double %1, double %2) nounwind 419 %4 = fpext float %z to double 420 %5 = fcmp oeq double %3, %4 421 ret i1 %5 422} 423 424define i1 @test16(float %x, float %y, float %z) { 425; CHECK-LABEL: @test16( 426; CHECK-NEXT: [[FMINF:%.*]] = call nsz float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]]) 427; CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq float [[Z:%.*]], [[FMINF]] 428; CHECK-NEXT: ret i1 [[TMP1]] 429; 430 %1 = fpext float %z to double 431 %2 = fpext float %x to double 432 %3 = fpext float %y to double 433 %4 = call double @fmin(double %2, double %3) nounwind 434 %5 = fcmp oeq double %1, %4 435 ret i1 %5 436} 437 438define i1 @test17(float %x, float %y, float %z) { 439; CHECK-LABEL: @test17( 440; CHECK-NEXT: [[FMAXF:%.*]] = call nsz float @llvm.maxnum.f32(float [[X:%.*]], float [[Y:%.*]]) 441; CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq float [[FMAXF]], [[Z:%.*]] 442; CHECK-NEXT: ret i1 [[TMP1]] 443; 444 %1 = fpext float %x to double 445 %2 = fpext float %y to double 446 %3 = call double @fmax(double %1, double %2) nounwind 447 %4 = fpext float %z to double 448 %5 = fcmp oeq double %3, %4 449 ret i1 %5 450} 451 452define i1 @test18(float %x, float %y, float %z) { 453; CHECK-LABEL: @test18( 454; CHECK-NEXT: [[FMAXF:%.*]] = call nsz float @llvm.maxnum.f32(float [[X:%.*]], float [[Y:%.*]]) 455; CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq float [[Z:%.*]], [[FMAXF]] 456; CHECK-NEXT: ret i1 [[TMP1]] 457; 458 %1 = fpext float %z to double 459 %2 = fpext float %x to double 460 %3 = fpext float %y to double 461 %4 = call double @fmax(double %2, double %3) nounwind 462 %5 = fcmp oeq double %1, %4 463 ret i1 %5 464} 465 466define i1 @test19(float %x, float %y, float %z) { 467; CHECK-LABEL: @test19( 468; CHECK-NEXT: [[COPYSIGNF:%.*]] = call float @copysignf(float [[X:%.*]], float [[Y:%.*]]) #[[ATTR0:[0-9]+]] 469; CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq float [[COPYSIGNF]], [[Z:%.*]] 470; CHECK-NEXT: ret i1 [[TMP1]] 471; 472 %1 = fpext float %x to double 473 %2 = fpext float %y to double 474 %3 = call double @copysign(double %1, double %2) nounwind 475 %4 = fpext float %z to double 476 %5 = fcmp oeq double %3, %4 477 ret i1 %5 478} 479 480define i1 @test20(float %x, float %y) { 481; CHECK-LABEL: @test20( 482; CHECK-NEXT: [[FMINF:%.*]] = call nsz float @llvm.minnum.f32(float [[X:%.*]], float 1.000000e+00) 483; CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq float [[Y:%.*]], [[FMINF]] 484; CHECK-NEXT: ret i1 [[TMP1]] 485; 486 %1 = fpext float %y to double 487 %2 = fpext float %x to double 488 %3 = call double @fmin(double 1.000000e+00, double %2) nounwind 489 %4 = fcmp oeq double %1, %3 490 ret i1 %4 491} 492 493; should not be changed to fminf as the constant would lose precision 494 495define i1 @test21(float %x, float %y) { 496; CHECK-LABEL: @test21( 497; CHECK-NEXT: [[TMP1:%.*]] = fpext float [[Y:%.*]] to double 498; CHECK-NEXT: [[TMP2:%.*]] = fpext float [[X:%.*]] to double 499; CHECK-NEXT: [[TMP3:%.*]] = call nsz double @llvm.minnum.f64(double [[TMP2]], double 1.300000e+00) 500; CHECK-NEXT: [[TMP4:%.*]] = fcmp oeq double [[TMP3]], [[TMP1]] 501; CHECK-NEXT: ret i1 [[TMP4]] 502; 503 %1 = fpext float %y to double 504 %2 = fpext float %x to double 505 %3 = call double @fmin(double 1.300000e+00, double %2) nounwind 506 %4 = fcmp oeq double %1, %3 507 ret i1 %4 508} 509 510declare double @fabs(double) nounwind readnone 511declare double @ceil(double) nounwind readnone 512declare double @copysign(double, double) nounwind readnone 513declare double @floor(double) nounwind readnone 514declare double @nearbyint(double) nounwind readnone 515declare double @rint(double) nounwind readnone 516declare double @round(double) nounwind readnone 517declare double @roundeven(double) nounwind readnone 518declare double @trunc(double) nounwind readnone 519declare double @fmin(double, double) nounwind readnone 520declare double @fmax(double, double) nounwind readnone 521 522declare double @llvm.fabs.f64(double) nounwind readnone 523declare double @llvm.ceil.f64(double) nounwind readnone 524declare double @llvm.floor.f64(double) nounwind readnone 525declare double @llvm.nearbyint.f64(double) nounwind readnone 526declare double @llvm.round.f64(double) nounwind readnone 527declare double @llvm.roundeven.f64(double) nounwind readnone 528declare double @llvm.trunc.f64(double) nounwind readnone 529