1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 4define i1 @test1(float %x) { 5; CHECK-LABEL: define i1 @test1( 6; CHECK-SAME: float [[X:%.*]]) { 7; CHECK-NEXT: entry: 8; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00 9; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 10; CHECK: if.then: 11; CHECK-NEXT: ret i1 false 12; CHECK: if.else: 13; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780) 14; CHECK-NEXT: ret i1 [[RET]] 15; 16entry: 17 %cond = fcmp ueq float %x, 0.000000e+00 18 br i1 %cond, label %if.then, label %if.else 19 20if.then: 21 ret i1 false 22 23if.else: 24 %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783) 25 ret i1 %ret 26} 27 28define i1 @test2(double %x) { 29; CHECK-LABEL: define i1 @test2( 30; CHECK-SAME: double [[X:%.*]]) { 31; CHECK-NEXT: entry: 32; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000 33; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 34; CHECK: if.then: 35; CHECK-NEXT: ret i1 false 36; CHECK: if.end: 37; CHECK-NEXT: ret i1 false 38; 39entry: 40 %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000 41 br i1 %cmp, label %if.then, label %if.end 42if.then: 43 ret i1 false 44if.end: 45 %cmp.i = fcmp oeq double %x, 0.000000e+00 46 ret i1 %cmp.i 47} 48 49define i1 @test2_or(double %x, i1 %cond) { 50; CHECK-LABEL: define i1 @test2_or( 51; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) { 52; CHECK-NEXT: entry: 53; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000 54; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[COND]] 55; CHECK-NEXT: br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 56; CHECK: if.then: 57; CHECK-NEXT: ret i1 false 58; CHECK: if.end: 59; CHECK-NEXT: ret i1 false 60; 61entry: 62 %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000 63 %or = or i1 %cmp, %cond 64 br i1 %or, label %if.then, label %if.end 65 66if.then: 67 ret i1 false 68 69if.end: 70 %cmp.i = fcmp oeq double %x, 0.000000e+00 71 ret i1 %cmp.i 72} 73 74define i1 @test3(float %x) { 75; CHECK-LABEL: define i1 @test3( 76; CHECK-SAME: float [[X:%.*]]) { 77; CHECK-NEXT: entry: 78; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], 3.000000e+00 79; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 80; CHECK: if.then: 81; CHECK-NEXT: [[RET:%.*]] = fcmp oeq float [[X]], 0x7FF0000000000000 82; CHECK-NEXT: ret i1 [[RET]] 83; CHECK: if.else: 84; CHECK-NEXT: ret i1 false 85; 86entry: 87 %cmp = fcmp ogt float %x, 3.000000e+00 88 br i1 %cmp, label %if.then, label %if.else 89if.then: 90 %abs = call float @llvm.fabs.f32(float %x) 91 %ret = fcmp oeq float %abs, 0x7FF0000000000000 92 ret i1 %ret 93if.else: 94 ret i1 false 95} 96 97define float @test4(float %x) { 98; CHECK-LABEL: define float @test4( 99; CHECK-SAME: float [[X:%.*]]) { 100; CHECK-NEXT: entry: 101; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X]], 0x3EB0C6F7A0000000 102; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 103; CHECK: if.then: 104; CHECK-NEXT: ret float 1.000000e+00 105; CHECK: if.end: 106; CHECK-NEXT: [[DIV:%.*]] = fdiv float 1.000000e+00, [[X]] 107; CHECK-NEXT: ret float [[DIV]] 108; 109entry: 110 %cmp = fcmp olt float %x, 0x3EB0C6F7A0000000 111 br i1 %cmp, label %if.then, label %if.end 112 113if.then: 114 ret float 1.0 115 116if.end: 117 %cmp.i = fcmp oeq float %x, 0.000000e+00 118 %div = fdiv float 1.000000e+00, %x 119 %ret = select i1 %cmp.i, float 1.000000e+00, float %div 120 ret float %ret 121} 122 123define i1 @test5(double %x, i1 %cond) { 124; CHECK-LABEL: define i1 @test5( 125; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) { 126; CHECK-NEXT: entry: 127; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]] 128; CHECK: if: 129; CHECK-NEXT: [[CMP:%.*]] = fcmp uno double [[X]], 0.000000e+00 130; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 131; CHECK: if.then: 132; CHECK-NEXT: ret i1 false 133; CHECK: if.end: 134; CHECK-NEXT: br label [[EXIT]] 135; CHECK: exit: 136; CHECK-NEXT: [[Y:%.*]] = phi double [ -1.000000e+00, [[ENTRY:%.*]] ], [ [[X]], [[IF_END]] ] 137; CHECK-NEXT: [[RET:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[Y]], i32 408) 138; CHECK-NEXT: ret i1 [[RET]] 139; 140entry: 141 br i1 %cond, label %if, label %exit 142if: 143 %cmp = fcmp uno double %x, 0.000000e+00 144 br i1 %cmp, label %if.then, label %if.end 145if.then: 146 ret i1 false 147if.end: 148 br label %exit 149exit: 150 %y = phi double [ -1.000000e+00, %entry ], [ %x, %if.end ] 151 %ret = tail call i1 @llvm.is.fpclass.f64(double %y, i32 411) 152 ret i1 %ret 153} 154 155define i1 @test6(double %x) { 156; CHECK-LABEL: define i1 @test6( 157; CHECK-SAME: double [[X:%.*]]) { 158; CHECK-NEXT: entry: 159; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00 160; CHECK-NEXT: br i1 [[CMP]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]] 161; CHECK: land.rhs: 162; CHECK-NEXT: [[CMP_I:%.*]] = fcmp oeq double [[X]], 0x7FF0000000000000 163; CHECK-NEXT: br label [[LAND_END]] 164; CHECK: land.end: 165; CHECK-NEXT: [[RET:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP_I]], [[LAND_RHS]] ] 166; CHECK-NEXT: ret i1 [[RET]] 167; 168entry: 169 %cmp = fcmp ogt double %x, 0.000000e+00 170 br i1 %cmp, label %land.rhs, label %land.end 171 172land.rhs: 173 %abs = tail call double @llvm.fabs.f64(double %x) 174 %and.i = bitcast double %abs to i64 175 %cmp.i = icmp eq i64 %and.i, 9218868437227405312 176 br label %land.end 177 178land.end: 179 %ret = phi i1 [ false, %entry ], [ %cmp.i, %land.rhs ] 180 ret i1 %ret 181} 182 183define i1 @test7(float %x) { 184; CHECK-LABEL: define i1 @test7( 185; CHECK-SAME: float [[X:%.*]]) { 186; CHECK-NEXT: [[COND:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 345) 187; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 188; CHECK: if.then: 189; CHECK-NEXT: [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 328) 190; CHECK-NEXT: ret i1 [[RET1]] 191; CHECK: if.else: 192; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 128) 193; CHECK-NEXT: ret i1 [[RET2]] 194; 195 %cond = call i1 @llvm.is.fpclass.f32(float %x, i32 345) 196 br i1 %cond, label %if.then, label %if.else 197if.then: 198 %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 456) 199 ret i1 %ret1 200if.else: 201 %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 456) 202 ret i1 %ret2 203} 204 205; TODO: These two is.fpclass can be simplified. 206define i1 @test8(float %x) { 207; CHECK-LABEL: define i1 @test8( 208; CHECK-SAME: float [[X:%.*]]) { 209; CHECK-NEXT: [[ABS:%.*]] = call float @llvm.fabs.f32(float [[X]]) 210; CHECK-NEXT: [[COND:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000 211; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 212; CHECK: if.then: 213; CHECK-NEXT: ret i1 true 214; CHECK: if.else: 215; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 59) 216; CHECK-NEXT: ret i1 [[RET2]] 217; 218 %abs = call float @llvm.fabs.f32(float %x) 219 %cond = fcmp oeq float %abs, 0x7FF0000000000000 220 br i1 %cond, label %if.then, label %if.else 221if.then: 222 %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 575) 223 ret i1 %ret1 224if.else: 225 %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 575) 226 ret i1 %ret2 227} 228 229define i1 @test9(float %x) { 230; CHECK-LABEL: define i1 @test9( 231; CHECK-SAME: float [[X:%.*]]) { 232; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00 233; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 234; CHECK: if.then: 235; CHECK-NEXT: ret i1 false 236; CHECK: if.else: 237; CHECK-NEXT: ret i1 false 238; 239 %cond = fcmp olt float %x, -1.0 240 br i1 %cond, label %if.then, label %if.else 241if.then: 242 %ret1 = fcmp oeq float %x, 0x7FF0000000000000 243 ret i1 %ret1 244if.else: 245 ret i1 false 246} 247 248define i1 @test10(float %x) { 249; CHECK-LABEL: define i1 @test10( 250; CHECK-SAME: float [[X:%.*]]) { 251; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00 252; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 253; CHECK: if.then: 254; CHECK-NEXT: ret i1 false 255; CHECK: if.else: 256; CHECK-NEXT: ret i1 false 257; 258 %cond = fcmp olt float %x, -1.0 259 %neg = fneg float %x 260 br i1 %cond, label %if.then, label %if.else 261if.then: 262 %ret1 = fcmp oeq float %neg, 0xFFF0000000000000 263 ret i1 %ret1 264if.else: 265 ret i1 false 266} 267 268define i1 @test11_and(float %x, i1 %cond2) { 269; CHECK-LABEL: define i1 @test11_and( 270; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) { 271; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00 272; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND]], [[COND2]] 273; CHECK-NEXT: br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 274; CHECK: if.then: 275; CHECK-NEXT: ret i1 false 276; CHECK: if.else: 277; CHECK-NEXT: ret i1 false 278; 279 %cond = fcmp olt float %x, -1.0 280 %neg = fneg float %x 281 %and = and i1 %cond, %cond2 282 br i1 %and, label %if.then, label %if.else 283if.then: 284 %ret1 = fcmp oeq float %neg, 0xFFF0000000000000 285 ret i1 %ret1 286if.else: 287 ret i1 false 288} 289 290define i1 @test12_or(float %x, i1 %cond2) { 291; CHECK-LABEL: define i1 @test12_or( 292; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) { 293; CHECK-NEXT: entry: 294; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00 295; CHECK-NEXT: [[OR:%.*]] = or i1 [[COND]], [[COND2]] 296; CHECK-NEXT: br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 297; CHECK: if.then: 298; CHECK-NEXT: ret i1 false 299; CHECK: if.else: 300; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780) 301; CHECK-NEXT: ret i1 [[RET]] 302; 303entry: 304 %cond = fcmp ueq float %x, 0.000000e+00 305 %or = or i1 %cond, %cond2 306 br i1 %or, label %if.then, label %if.else 307 308if.then: 309 ret i1 false 310 311if.else: 312 %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783) 313 ret i1 %ret 314} 315 316define i1 @test1_no_dominating(float %x, i1 %c) { 317; CHECK-LABEL: define i1 @test1_no_dominating( 318; CHECK-SAME: float [[X:%.*]], i1 [[C:%.*]]) { 319; CHECK-NEXT: entry0: 320; CHECK-NEXT: br i1 [[C]], label [[ENTRY:%.*]], label [[IF_ELSE:%.*]] 321; CHECK: entry: 322; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00 323; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE]] 324; CHECK: if.then: 325; CHECK-NEXT: ret i1 false 326; CHECK: if.else: 327; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783) 328; CHECK-NEXT: ret i1 [[RET]] 329; 330entry0: 331 br i1 %c, label %entry, label %if.else 332 333entry: 334 %cond = fcmp ueq float %x, 0.000000e+00 335 br i1 %cond, label %if.then, label %if.else 336 337if.then: 338 ret i1 false 339 340if.else: 341 %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783) 342 ret i1 %ret 343} 344 345define float @test_signbit_check(float %x, i1 %cond) { 346; CHECK-LABEL: define float @test_signbit_check( 347; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) { 348; CHECK-NEXT: [[I32:%.*]] = bitcast float [[X]] to i32 349; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I32]], 0 350; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]] 351; CHECK: if.then1: 352; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] 353; CHECK-NEXT: br label [[IF_END:%.*]] 354; CHECK: if.else: 355; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]] 356; CHECK: if.then2: 357; CHECK-NEXT: br label [[IF_END]] 358; CHECK: if.end: 359; CHECK-NEXT: [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ] 360; CHECK-NEXT: ret float [[VALUE]] 361; 362 %i32 = bitcast float %x to i32 363 %cmp = icmp slt i32 %i32, 0 364 br i1 %cmp, label %if.then1, label %if.else 365 366if.then1: 367 %fneg = fneg float %x 368 br label %if.end 369 370if.else: 371 br i1 %cond, label %if.then2, label %if.end 372 373if.then2: 374 br label %if.end 375 376if.end: 377 %value = phi float [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ] 378 %ret = call float @llvm.fabs.f32(float %value) 379 ret float %ret 380} 381 382define float @test_signbit_check_fail(float %x, i1 %cond) { 383; CHECK-LABEL: define float @test_signbit_check_fail( 384; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) { 385; CHECK-NEXT: [[I32:%.*]] = bitcast float [[X]] to i32 386; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I32]], 0 387; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]] 388; CHECK: if.then1: 389; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] 390; CHECK-NEXT: br label [[IF_END:%.*]] 391; CHECK: if.else: 392; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]] 393; CHECK: if.then2: 394; CHECK-NEXT: [[FNEG2:%.*]] = fneg float [[X]] 395; CHECK-NEXT: br label [[IF_END]] 396; CHECK: if.end: 397; CHECK-NEXT: [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[FNEG2]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ] 398; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fabs.f32(float [[VALUE]]) 399; CHECK-NEXT: ret float [[RET]] 400; 401 %i32 = bitcast float %x to i32 402 %cmp = icmp slt i32 %i32, 0 403 br i1 %cmp, label %if.then1, label %if.else 404 405if.then1: 406 %fneg = fneg float %x 407 br label %if.end 408 409if.else: 410 br i1 %cond, label %if.then2, label %if.end 411 412if.then2: 413 %fneg2 = fneg float %x 414 br label %if.end 415 416if.end: 417 %value = phi float [ %fneg, %if.then1 ], [ %fneg2, %if.then2 ], [ %x, %if.else ] 418 %ret = call float @llvm.fabs.f32(float %value) 419 ret float %ret 420} 421 422define <2 x float> @test_signbit_check_wrong_type(<2 x float> %x, i1 %cond) { 423; CHECK-LABEL: define <2 x float> @test_signbit_check_wrong_type( 424; CHECK-SAME: <2 x float> [[X:%.*]], i1 [[COND:%.*]]) { 425; CHECK-NEXT: [[I32:%.*]] = bitcast <2 x float> [[X]] to i64 426; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[I32]], 0 427; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]] 428; CHECK: if.then1: 429; CHECK-NEXT: [[FNEG:%.*]] = fneg <2 x float> [[X]] 430; CHECK-NEXT: br label [[IF_END:%.*]] 431; CHECK: if.else: 432; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]] 433; CHECK: if.then2: 434; CHECK-NEXT: br label [[IF_END]] 435; CHECK: if.end: 436; CHECK-NEXT: [[VALUE:%.*]] = phi <2 x float> [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ] 437; CHECK-NEXT: [[RET:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[VALUE]]) 438; CHECK-NEXT: ret <2 x float> [[RET]] 439; 440 %i32 = bitcast <2 x float> %x to i64 441 %cmp = icmp slt i64 %i32, 0 442 br i1 %cmp, label %if.then1, label %if.else 443 444if.then1: 445 %fneg = fneg <2 x float> %x 446 br label %if.end 447 448if.else: 449 br i1 %cond, label %if.then2, label %if.end 450 451if.then2: 452 br label %if.end 453 454if.end: 455 %value = phi <2 x float> [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ] 456 %ret = call <2 x float> @llvm.fabs.v2f32(<2 x float> %value) 457 ret <2 x float> %ret 458} 459 460define i1 @pr118257(half %v0, half %v1) { 461; CHECK-LABEL: define i1 @pr118257( 462; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) { 463; CHECK-NEXT: entry: 464; CHECK-NEXT: [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000 465; CHECK-NEXT: [[CAST0:%.*]] = bitcast half [[V0]] to i16 466; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[CAST0]], 0 467; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]] 468; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]] 469; CHECK: if.else: 470; CHECK-NEXT: [[CAST1:%.*]] = bitcast half [[V1]] to i16 471; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0 472; CHECK-NEXT: ret i1 [[CMP3]] 473; CHECK: if.end: 474; CHECK-NEXT: ret i1 false 475; 476entry: 477 %cmp1 = fcmp une half %v1, 0.000000e+00 478 %cast0 = bitcast half %v0 to i16 479 %cmp2 = icmp slt i16 %cast0, 0 480 %or.cond = or i1 %cmp1, %cmp2 481 br i1 %or.cond, label %if.end, label %if.else 482 483if.else: 484 %cast1 = bitcast half %v1 to i16 485 %cmp3 = icmp slt i16 %cast1, 0 486 ret i1 %cmp3 487 488if.end: 489 ret i1 false 490} 491 492define i1 @pr118257_is_fpclass(half %v0, half %v1) { 493; CHECK-LABEL: define i1 @pr118257_is_fpclass( 494; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) { 495; CHECK-NEXT: entry: 496; CHECK-NEXT: [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000 497; CHECK-NEXT: [[CMP2:%.*]] = call i1 @llvm.is.fpclass.f16(half [[V0]], i32 35) 498; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]] 499; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]] 500; CHECK: if.else: 501; CHECK-NEXT: [[CAST1:%.*]] = bitcast half [[V1]] to i16 502; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0 503; CHECK-NEXT: ret i1 [[CMP3]] 504; CHECK: if.end: 505; CHECK-NEXT: ret i1 false 506; 507entry: 508 %cmp1 = fcmp une half %v1, 0.000000e+00 509 %cmp2 = call i1 @llvm.is.fpclass.half(half %v0, i32 35) 510 %or.cond = or i1 %cmp1, %cmp2 511 br i1 %or.cond, label %if.end, label %if.else 512 513if.else: 514 %cast1 = bitcast half %v1 to i16 515 %cmp3 = icmp slt i16 %cast1, 0 516 ret i1 %cmp3 517 518if.end: 519 ret i1 false 520} 521