1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 4declare void @use(i32) 5 6; These 18 exercise all combinations of signed comparison 7; for each of the three values produced by your typical 8; 3way compare function (-1, 0, 1) 9 10define void @test_low_sgt(i64 %a, i64 %b) { 11; CHECK-LABEL: define void @test_low_sgt 12; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 13; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i64 [[A]], [[B]] 14; CHECK-NEXT: br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]] 15; CHECK: normal: 16; CHECK-NEXT: ret void 17; CHECK: unreached: 18; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 19; CHECK-NEXT: call void @use(i32 [[RESULT]]) 20; CHECK-NEXT: ret void 21; 22 %eq = icmp eq i64 %a, %b 23 %slt = icmp slt i64 %a, %b 24 %. = select i1 %slt, i32 -1, i32 1 25 %result = select i1 %eq, i32 0, i32 %. 26 %cmp = icmp sgt i32 %result, -1 27 br i1 %cmp, label %unreached, label %normal 28normal: 29 ret void 30unreached: 31 call void @use(i32 %result) 32 ret void 33} 34 35define void @test_low_slt(i64 %a, i64 %b) { 36; CHECK-LABEL: define void @test_low_slt 37; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 38; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 39; CHECK: normal: 40; CHECK-NEXT: ret void 41; CHECK: unreached: 42; CHECK-NEXT: ret void 43; 44 %eq = icmp eq i64 %a, %b 45 %slt = icmp slt i64 %a, %b 46 %. = select i1 %slt, i32 -1, i32 1 47 %result = select i1 %eq, i32 0, i32 %. 48 %cmp = icmp slt i32 %result, -1 49 br i1 %cmp, label %unreached, label %normal 50normal: 51 ret void 52unreached: 53 call void @use(i32 %result) 54 ret void 55} 56 57define void @test_low_sge(i64 %a, i64 %b) { 58; CHECK-LABEL: define void @test_low_sge 59; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 60; CHECK-NEXT: br i1 true, label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 61; CHECK: normal: 62; CHECK-NEXT: ret void 63; CHECK: unreached: 64; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 65; CHECK-NEXT: call void @use(i32 [[RESULT]]) 66; CHECK-NEXT: ret void 67; 68 %eq = icmp eq i64 %a, %b 69 %slt = icmp slt i64 %a, %b 70 %. = select i1 %slt, i32 -1, i32 1 71 %result = select i1 %eq, i32 0, i32 %. 72 %cmp = icmp sge i32 %result, -1 73 br i1 %cmp, label %unreached, label %normal 74normal: 75 ret void 76unreached: 77 call void @use(i32 %result) 78 ret void 79} 80 81define void @test_low_sle(i64 %a, i64 %b) { 82; CHECK-LABEL: define void @test_low_sle 83; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 84; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]] 85; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 86; CHECK: normal: 87; CHECK-NEXT: ret void 88; CHECK: unreached: 89; CHECK-NEXT: call void @use(i32 -1) 90; CHECK-NEXT: ret void 91; 92 %eq = icmp eq i64 %a, %b 93 %slt = icmp slt i64 %a, %b 94 %. = select i1 %slt, i32 -1, i32 1 95 %result = select i1 %eq, i32 0, i32 %. 96 %cmp = icmp sle i32 %result, -1 97 br i1 %cmp, label %unreached, label %normal 98normal: 99 ret void 100unreached: 101 call void @use(i32 %result) 102 ret void 103} 104 105define void @test_low_ne(i64 %a, i64 %b) { 106; CHECK-LABEL: define void @test_low_ne 107; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 108; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]] 109; CHECK-NEXT: br i1 [[TMP1]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]] 110; CHECK: normal: 111; CHECK-NEXT: ret void 112; CHECK: unreached: 113; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 114; CHECK-NEXT: call void @use(i32 [[RESULT]]) 115; CHECK-NEXT: ret void 116; 117 %eq = icmp eq i64 %a, %b 118 %slt = icmp slt i64 %a, %b 119 %. = select i1 %slt, i32 -1, i32 1 120 %result = select i1 %eq, i32 0, i32 %. 121 %cmp = icmp ne i32 %result, -1 122 br i1 %cmp, label %unreached, label %normal 123normal: 124 ret void 125unreached: 126 call void @use(i32 %result) 127 ret void 128} 129 130define void @test_low_eq(i64 %a, i64 %b) { 131; CHECK-LABEL: define void @test_low_eq 132; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 133; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]] 134; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 135; CHECK: normal: 136; CHECK-NEXT: ret void 137; CHECK: unreached: 138; CHECK-NEXT: call void @use(i32 -1) 139; CHECK-NEXT: ret void 140; 141 %eq = icmp eq i64 %a, %b 142 %slt = icmp slt i64 %a, %b 143 %. = select i1 %slt, i32 -1, i32 1 144 %result = select i1 %eq, i32 0, i32 %. 145 %cmp = icmp eq i32 %result, -1 146 br i1 %cmp, label %unreached, label %normal 147normal: 148 ret void 149unreached: 150 call void @use(i32 %result) 151 ret void 152} 153 154define void @test_mid_sgt(i64 %a, i64 %b) { 155; CHECK-LABEL: define void @test_mid_sgt 156; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 157; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]] 158; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 159; CHECK: normal: 160; CHECK-NEXT: ret void 161; CHECK: unreached: 162; CHECK-NEXT: call void @use(i32 1) 163; CHECK-NEXT: ret void 164; 165 %eq = icmp eq i64 %a, %b 166 %slt = icmp slt i64 %a, %b 167 %. = select i1 %slt, i32 -1, i32 1 168 %result = select i1 %eq, i32 0, i32 %. 169 %cmp = icmp sgt i32 %result, 0 170 br i1 %cmp, label %unreached, label %normal 171normal: 172 ret void 173unreached: 174 call void @use(i32 %result) 175 ret void 176} 177 178define void @test_mid_slt(i64 %a, i64 %b) { 179; CHECK-LABEL: define void @test_mid_slt 180; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 181; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]] 182; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 183; CHECK: normal: 184; CHECK-NEXT: ret void 185; CHECK: unreached: 186; CHECK-NEXT: call void @use(i32 -1) 187; CHECK-NEXT: ret void 188; 189 %eq = icmp eq i64 %a, %b 190 %slt = icmp slt i64 %a, %b 191 %. = select i1 %slt, i32 -1, i32 1 192 %result = select i1 %eq, i32 0, i32 %. 193 %cmp = icmp slt i32 %result, 0 194 br i1 %cmp, label %unreached, label %normal 195normal: 196 ret void 197unreached: 198 call void @use(i32 %result) 199 ret void 200} 201 202define void @test_mid_sge(i64 %a, i64 %b) { 203; CHECK-LABEL: define void @test_mid_sge 204; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 205; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i64 [[A]], [[B]] 206; CHECK-NEXT: br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]] 207; CHECK: normal: 208; CHECK-NEXT: ret void 209; CHECK: unreached: 210; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 211; CHECK-NEXT: call void @use(i32 [[RESULT]]) 212; CHECK-NEXT: ret void 213; 214 %eq = icmp eq i64 %a, %b 215 %slt = icmp slt i64 %a, %b 216 %. = select i1 %slt, i32 -1, i32 1 217 %result = select i1 %eq, i32 0, i32 %. 218 %cmp = icmp sge i32 %result, 0 219 br i1 %cmp, label %unreached, label %normal 220normal: 221 ret void 222unreached: 223 call void @use(i32 %result) 224 ret void 225} 226 227define void @test_mid_sle(i64 %a, i64 %b) { 228; CHECK-LABEL: define void @test_mid_sle 229; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 230; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i64 [[A]], [[B]] 231; CHECK-NEXT: br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]] 232; CHECK: normal: 233; CHECK-NEXT: ret void 234; CHECK: unreached: 235; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 236; CHECK-NEXT: call void @use(i32 [[RESULT]]) 237; CHECK-NEXT: ret void 238; 239 %eq = icmp eq i64 %a, %b 240 %slt = icmp slt i64 %a, %b 241 %. = select i1 %slt, i32 -1, i32 1 242 %result = select i1 %eq, i32 0, i32 %. 243 %cmp = icmp sle i32 %result, 0 244 br i1 %cmp, label %unreached, label %normal 245normal: 246 ret void 247unreached: 248 call void @use(i32 %result) 249 ret void 250} 251 252define void @test_mid_ne(i64 %a, i64 %b) { 253; CHECK-LABEL: define void @test_mid_ne 254; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 255; CHECK-NEXT: [[EQ:%.*]] = icmp eq i64 [[A]], [[B]] 256; CHECK-NEXT: br i1 [[EQ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]] 257; CHECK: normal: 258; CHECK-NEXT: ret void 259; CHECK: unreached: 260; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 261; CHECK-NEXT: call void @use(i32 [[RESULT]]) 262; CHECK-NEXT: ret void 263; 264 %eq = icmp eq i64 %a, %b 265 %slt = icmp slt i64 %a, %b 266 %. = select i1 %slt, i32 -1, i32 1 267 %result = select i1 %eq, i32 0, i32 %. 268 %cmp = icmp ne i32 %result, 0 269 br i1 %cmp, label %unreached, label %normal 270normal: 271 ret void 272unreached: 273 call void @use(i32 %result) 274 ret void 275} 276 277define void @test_mid_eq(i64 %a, i64 %b) { 278; CHECK-LABEL: define void @test_mid_eq 279; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 280; CHECK-NEXT: [[EQ:%.*]] = icmp eq i64 [[A]], [[B]] 281; CHECK-NEXT: br i1 [[EQ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 282; CHECK: normal: 283; CHECK-NEXT: ret void 284; CHECK: unreached: 285; CHECK-NEXT: call void @use(i32 0) 286; CHECK-NEXT: ret void 287; 288 %eq = icmp eq i64 %a, %b 289 %slt = icmp slt i64 %a, %b 290 %. = select i1 %slt, i32 -1, i32 1 291 %result = select i1 %eq, i32 0, i32 %. 292 %cmp = icmp eq i32 %result, 0 293 br i1 %cmp, label %unreached, label %normal 294normal: 295 ret void 296unreached: 297 call void @use(i32 %result) 298 ret void 299} 300 301define void @test_high_sgt(i64 %a, i64 %b) { 302; CHECK-LABEL: define void @test_high_sgt 303; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 304; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 305; CHECK: normal: 306; CHECK-NEXT: ret void 307; CHECK: unreached: 308; CHECK-NEXT: ret void 309; 310 %eq = icmp eq i64 %a, %b 311 %slt = icmp slt i64 %a, %b 312 %. = select i1 %slt, i32 -1, i32 1 313 %result = select i1 %eq, i32 0, i32 %. 314 %cmp = icmp sgt i32 %result, 1 315 br i1 %cmp, label %unreached, label %normal 316normal: 317 ret void 318unreached: 319 call void @use(i32 %result) 320 ret void 321} 322 323define void @test_high_slt(i64 %a, i64 %b) { 324; CHECK-LABEL: define void @test_high_slt 325; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 326; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i64 [[A]], [[B]] 327; CHECK-NEXT: br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]] 328; CHECK: normal: 329; CHECK-NEXT: ret void 330; CHECK: unreached: 331; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 332; CHECK-NEXT: call void @use(i32 [[RESULT]]) 333; CHECK-NEXT: ret void 334; 335 %eq = icmp eq i64 %a, %b 336 %slt = icmp slt i64 %a, %b 337 %. = select i1 %slt, i32 -1, i32 1 338 %result = select i1 %eq, i32 0, i32 %. 339 %cmp = icmp slt i32 %result, 1 340 br i1 %cmp, label %unreached, label %normal 341normal: 342 ret void 343unreached: 344 call void @use(i32 %result) 345 ret void 346} 347 348define void @test_high_sge(i64 %a, i64 %b) { 349; CHECK-LABEL: define void @test_high_sge 350; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 351; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]] 352; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 353; CHECK: normal: 354; CHECK-NEXT: ret void 355; CHECK: unreached: 356; CHECK-NEXT: call void @use(i32 1) 357; CHECK-NEXT: ret void 358; 359 %eq = icmp eq i64 %a, %b 360 %slt = icmp slt i64 %a, %b 361 %. = select i1 %slt, i32 -1, i32 1 362 %result = select i1 %eq, i32 0, i32 %. 363 %cmp = icmp sge i32 %result, 1 364 br i1 %cmp, label %unreached, label %normal 365normal: 366 ret void 367unreached: 368 call void @use(i32 %result) 369 ret void 370} 371 372define void @test_high_sle(i64 %a, i64 %b) { 373; CHECK-LABEL: define void @test_high_sle 374; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 375; CHECK-NEXT: br i1 true, label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 376; CHECK: normal: 377; CHECK-NEXT: ret void 378; CHECK: unreached: 379; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 380; CHECK-NEXT: call void @use(i32 [[RESULT]]) 381; CHECK-NEXT: ret void 382; 383 %eq = icmp eq i64 %a, %b 384 %slt = icmp slt i64 %a, %b 385 %. = select i1 %slt, i32 -1, i32 1 386 %result = select i1 %eq, i32 0, i32 %. 387 %cmp = icmp sle i32 %result, 1 388 br i1 %cmp, label %unreached, label %normal 389normal: 390 ret void 391unreached: 392 call void @use(i32 %result) 393 ret void 394} 395 396define void @test_high_ne(i64 %a, i64 %b) { 397; CHECK-LABEL: define void @test_high_ne 398; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 399; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]] 400; CHECK-NEXT: br i1 [[TMP1]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]] 401; CHECK: normal: 402; CHECK-NEXT: ret void 403; CHECK: unreached: 404; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]]) 405; CHECK-NEXT: call void @use(i32 [[RESULT]]) 406; CHECK-NEXT: ret void 407; 408 %eq = icmp eq i64 %a, %b 409 %slt = icmp slt i64 %a, %b 410 %. = select i1 %slt, i32 -1, i32 1 411 %result = select i1 %eq, i32 0, i32 %. 412 %cmp = icmp ne i32 %result, 1 413 br i1 %cmp, label %unreached, label %normal 414normal: 415 ret void 416unreached: 417 call void @use(i32 %result) 418 ret void 419} 420 421define void @test_high_eq(i64 %a, i64 %b) { 422; CHECK-LABEL: define void @test_high_eq 423; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 424; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]] 425; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 426; CHECK: normal: 427; CHECK-NEXT: ret void 428; CHECK: unreached: 429; CHECK-NEXT: call void @use(i32 1) 430; CHECK-NEXT: ret void 431; 432 %eq = icmp eq i64 %a, %b 433 %slt = icmp slt i64 %a, %b 434 %. = select i1 %slt, i32 -1, i32 1 435 %result = select i1 %eq, i32 0, i32 %. 436 %cmp = icmp eq i32 %result, 1 437 br i1 %cmp, label %unreached, label %normal 438normal: 439 ret void 440unreached: 441 call void @use(i32 %result) 442 ret void 443} 444 445; These five make sure we didn't accidentally hard code one of the 446; produced values 447 448define void @non_standard_low(i64 %a, i64 %b) { 449; CHECK-LABEL: define void @non_standard_low 450; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 451; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]] 452; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 453; CHECK: normal: 454; CHECK-NEXT: ret void 455; CHECK: unreached: 456; CHECK-NEXT: call void @use(i32 -3) 457; CHECK-NEXT: ret void 458; 459 %eq = icmp eq i64 %a, %b 460 %slt = icmp slt i64 %a, %b 461 %. = select i1 %slt, i32 -3, i32 -1 462 %result = select i1 %eq, i32 -2, i32 %. 463 %cmp = icmp eq i32 %result, -3 464 br i1 %cmp, label %unreached, label %normal 465normal: 466 ret void 467unreached: 468 call void @use(i32 %result) 469 ret void 470} 471 472define void @non_standard_mid(i64 %a, i64 %b) { 473; CHECK-LABEL: define void @non_standard_mid 474; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 475; CHECK-NEXT: [[EQ:%.*]] = icmp eq i64 [[A]], [[B]] 476; CHECK-NEXT: br i1 [[EQ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 477; CHECK: normal: 478; CHECK-NEXT: ret void 479; CHECK: unreached: 480; CHECK-NEXT: call void @use(i32 -2) 481; CHECK-NEXT: ret void 482; 483 %eq = icmp eq i64 %a, %b 484 %slt = icmp slt i64 %a, %b 485 %. = select i1 %slt, i32 -3, i32 -1 486 %result = select i1 %eq, i32 -2, i32 %. 487 %cmp = icmp eq i32 %result, -2 488 br i1 %cmp, label %unreached, label %normal 489normal: 490 ret void 491unreached: 492 call void @use(i32 %result) 493 ret void 494} 495 496define void @non_standard_high(i64 %a, i64 %b) { 497; CHECK-LABEL: define void @non_standard_high 498; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 499; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]] 500; CHECK-NEXT: br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 501; CHECK: normal: 502; CHECK-NEXT: ret void 503; CHECK: unreached: 504; CHECK-NEXT: call void @use(i32 -1) 505; CHECK-NEXT: ret void 506; 507 %eq = icmp eq i64 %a, %b 508 %slt = icmp slt i64 %a, %b 509 %. = select i1 %slt, i32 -3, i32 -1 510 %result = select i1 %eq, i32 -2, i32 %. 511 %cmp = icmp eq i32 %result, -1 512 br i1 %cmp, label %unreached, label %normal 513normal: 514 ret void 515unreached: 516 call void @use(i32 %result) 517 ret void 518} 519 520define void @non_standard_bound1(i64 %a, i64 %b) { 521; CHECK-LABEL: define void @non_standard_bound1 522; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 523; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 524; CHECK: normal: 525; CHECK-NEXT: ret void 526; CHECK: unreached: 527; CHECK-NEXT: ret void 528; 529 %eq = icmp eq i64 %a, %b 530 %slt = icmp slt i64 %a, %b 531 %. = select i1 %slt, i32 -3, i32 -1 532 %result = select i1 %eq, i32 -2, i32 %. 533 %cmp = icmp eq i32 %result, -20 534 br i1 %cmp, label %unreached, label %normal 535normal: 536 ret void 537unreached: 538 call void @use(i32 %result) 539 ret void 540} 541 542define void @non_standard_bound2(i64 %a, i64 %b) { 543; CHECK-LABEL: define void @non_standard_bound2 544; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) { 545; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]] 546; CHECK: normal: 547; CHECK-NEXT: ret void 548; CHECK: unreached: 549; CHECK-NEXT: ret void 550; 551 %eq = icmp eq i64 %a, %b 552 %slt = icmp slt i64 %a, %b 553 %. = select i1 %slt, i32 -3, i32 -1 554 %result = select i1 %eq, i32 -2, i32 %. 555 %cmp = icmp eq i32 %result, 0 556 br i1 %cmp, label %unreached, label %normal 557normal: 558 ret void 559unreached: 560 call void @use(i32 %result) 561 ret void 562} 563