635 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4declare void @use(i32)5 6; These exercise all combinations of signed comparison7; for each of the three values produced by your typical8; 3way compare function (-1, 0, 1)9 10define void @test_low_sgt(i64 %a, i64 %b) {11; CHECK-LABEL: define void @test_low_sgt12; 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 void17; 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 void21;22 %eq = icmp eq i64 %a, %b23 %slt = icmp slt i64 %a, %b24 %. = select i1 %slt, i32 -1, i32 125 %result = select i1 %eq, i32 0, i32 %.26 %cmp = icmp sgt i32 %result, -127 br i1 %cmp, label %unreached, label %normal28normal:29 ret void30unreached:31 call void @use(i32 %result)32 ret void33}34 35define void @test_low_slt(i64 %a, i64 %b) {36; CHECK-LABEL: define void @test_low_slt37; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {38; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]39; CHECK: normal:40; CHECK-NEXT: ret void41; CHECK: unreached:42; CHECK-NEXT: ret void43;44 %eq = icmp eq i64 %a, %b45 %slt = icmp slt i64 %a, %b46 %. = select i1 %slt, i32 -1, i32 147 %result = select i1 %eq, i32 0, i32 %.48 %cmp = icmp slt i32 %result, -149 br i1 %cmp, label %unreached, label %normal50normal:51 ret void52unreached:53 call void @use(i32 %result)54 ret void55}56 57define void @test_low_sge(i64 %a, i64 %b) {58; CHECK-LABEL: define void @test_low_sge59; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {60; CHECK-NEXT: br i1 true, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]61; CHECK: normal:62; CHECK-NEXT: ret void63; 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 void67;68 %eq = icmp eq i64 %a, %b69 %slt = icmp slt i64 %a, %b70 %. = select i1 %slt, i32 -1, i32 171 %result = select i1 %eq, i32 0, i32 %.72 %cmp = icmp sge i32 %result, -173 br i1 %cmp, label %unreached, label %normal74normal:75 ret void76unreached:77 call void @use(i32 %result)78 ret void79}80 81define void @test_low_sle(i64 %a, i64 %b) {82; CHECK-LABEL: define void @test_low_sle83; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {84; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[A]], [[B]]85; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]86; CHECK: normal:87; CHECK-NEXT: ret void88; CHECK: unreached:89; CHECK-NEXT: call void @use(i32 -1)90; CHECK-NEXT: ret void91;92 %eq = icmp eq i64 %a, %b93 %slt = icmp slt i64 %a, %b94 %. = select i1 %slt, i32 -1, i32 195 %result = select i1 %eq, i32 0, i32 %.96 %cmp = icmp sle i32 %result, -197 br i1 %cmp, label %unreached, label %normal98normal:99 ret void100unreached:101 call void @use(i32 %result)102 ret void103}104 105define void @test_low_ne(i64 %a, i64 %b) {106; CHECK-LABEL: define void @test_low_ne107; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {108; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i64 [[A]], [[B]]109; CHECK-NEXT: br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]110; CHECK: normal:111; CHECK-NEXT: ret void112; 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 void116;117 %eq = icmp eq i64 %a, %b118 %slt = icmp slt i64 %a, %b119 %. = select i1 %slt, i32 -1, i32 1120 %result = select i1 %eq, i32 0, i32 %.121 %cmp = icmp ne i32 %result, -1122 br i1 %cmp, label %unreached, label %normal123normal:124 ret void125unreached:126 call void @use(i32 %result)127 ret void128}129 130define void @test_low_eq(i64 %a, i64 %b) {131; CHECK-LABEL: define void @test_low_eq132; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {133; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[A]], [[B]]134; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]135; CHECK: normal:136; CHECK-NEXT: ret void137; CHECK: unreached:138; CHECK-NEXT: call void @use(i32 -1)139; CHECK-NEXT: ret void140;141 %eq = icmp eq i64 %a, %b142 %slt = icmp slt i64 %a, %b143 %. = select i1 %slt, i32 -1, i32 1144 %result = select i1 %eq, i32 0, i32 %.145 %cmp = icmp eq i32 %result, -1146 br i1 %cmp, label %unreached, label %normal147normal:148 ret void149unreached:150 call void @use(i32 %result)151 ret void152}153 154define void @test_mid_sgt(i64 %a, i64 %b) {155; CHECK-LABEL: define void @test_mid_sgt156; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {157; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[A]], [[B]]158; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]159; CHECK: normal:160; CHECK-NEXT: ret void161; CHECK: unreached:162; CHECK-NEXT: call void @use(i32 1)163; CHECK-NEXT: ret void164;165 %eq = icmp eq i64 %a, %b166 %slt = icmp slt i64 %a, %b167 %. = select i1 %slt, i32 -1, i32 1168 %result = select i1 %eq, i32 0, i32 %.169 %cmp = icmp sgt i32 %result, 0170 br i1 %cmp, label %unreached, label %normal171normal:172 ret void173unreached:174 call void @use(i32 %result)175 ret void176}177 178define void @test_mid_slt(i64 %a, i64 %b) {179; CHECK-LABEL: define void @test_mid_slt180; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {181; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[A]], [[B]]182; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]183; CHECK: normal:184; CHECK-NEXT: ret void185; CHECK: unreached:186; CHECK-NEXT: call void @use(i32 -1)187; CHECK-NEXT: ret void188;189 %eq = icmp eq i64 %a, %b190 %slt = icmp slt i64 %a, %b191 %. = select i1 %slt, i32 -1, i32 1192 %result = select i1 %eq, i32 0, i32 %.193 %cmp = icmp slt i32 %result, 0194 br i1 %cmp, label %unreached, label %normal195normal:196 ret void197unreached:198 call void @use(i32 %result)199 ret void200}201 202define void @test_mid_sge(i64 %a, i64 %b) {203; CHECK-LABEL: define void @test_mid_sge204; 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 void209; 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 void213;214 %eq = icmp eq i64 %a, %b215 %slt = icmp slt i64 %a, %b216 %. = select i1 %slt, i32 -1, i32 1217 %result = select i1 %eq, i32 0, i32 %.218 %cmp = icmp sge i32 %result, 0219 br i1 %cmp, label %unreached, label %normal220normal:221 ret void222unreached:223 call void @use(i32 %result)224 ret void225}226 227define void @test_mid_sle(i64 %a, i64 %b) {228; CHECK-LABEL: define void @test_mid_sle229; 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 void234; 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 void238;239 %eq = icmp eq i64 %a, %b240 %slt = icmp slt i64 %a, %b241 %. = select i1 %slt, i32 -1, i32 1242 %result = select i1 %eq, i32 0, i32 %.243 %cmp = icmp sle i32 %result, 0244 br i1 %cmp, label %unreached, label %normal245normal:246 ret void247unreached:248 call void @use(i32 %result)249 ret void250}251 252define void @test_mid_ne(i64 %a, i64 %b) {253; CHECK-LABEL: define void @test_mid_ne254; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {255; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i64 [[A]], [[B]]256; CHECK-NEXT: br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]257; CHECK: normal:258; CHECK-NEXT: ret void259; 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 void263;264 %eq = icmp eq i64 %a, %b265 %slt = icmp slt i64 %a, %b266 %. = select i1 %slt, i32 -1, i32 1267 %result = select i1 %eq, i32 0, i32 %.268 %cmp = icmp ne i32 %result, 0269 br i1 %cmp, label %unreached, label %normal270normal:271 ret void272unreached:273 call void @use(i32 %result)274 ret void275}276 277define void @test_mid_eq(i64 %a, i64 %b) {278; CHECK-LABEL: define void @test_mid_eq279; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {280; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[A]], [[B]]281; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]282; CHECK: normal:283; CHECK-NEXT: ret void284; CHECK: unreached:285; CHECK-NEXT: call void @use(i32 0)286; CHECK-NEXT: ret void287;288 %eq = icmp eq i64 %a, %b289 %slt = icmp slt i64 %a, %b290 %. = select i1 %slt, i32 -1, i32 1291 %result = select i1 %eq, i32 0, i32 %.292 %cmp = icmp eq i32 %result, 0293 br i1 %cmp, label %unreached, label %normal294normal:295 ret void296unreached:297 call void @use(i32 %result)298 ret void299}300 301define void @test_high_sgt(i64 %a, i64 %b) {302; CHECK-LABEL: define void @test_high_sgt303; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {304; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]305; CHECK: normal:306; CHECK-NEXT: ret void307; CHECK: unreached:308; CHECK-NEXT: ret void309;310 %eq = icmp eq i64 %a, %b311 %slt = icmp slt i64 %a, %b312 %. = select i1 %slt, i32 -1, i32 1313 %result = select i1 %eq, i32 0, i32 %.314 %cmp = icmp sgt i32 %result, 1315 br i1 %cmp, label %unreached, label %normal316normal:317 ret void318unreached:319 call void @use(i32 %result)320 ret void321}322 323define void @test_high_slt(i64 %a, i64 %b) {324; CHECK-LABEL: define void @test_high_slt325; 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 void330; 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 void334;335 %eq = icmp eq i64 %a, %b336 %slt = icmp slt i64 %a, %b337 %. = select i1 %slt, i32 -1, i32 1338 %result = select i1 %eq, i32 0, i32 %.339 %cmp = icmp slt i32 %result, 1340 br i1 %cmp, label %unreached, label %normal341normal:342 ret void343unreached:344 call void @use(i32 %result)345 ret void346}347 348define void @test_high_sge(i64 %a, i64 %b) {349; CHECK-LABEL: define void @test_high_sge350; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {351; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[A]], [[B]]352; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]353; CHECK: normal:354; CHECK-NEXT: ret void355; CHECK: unreached:356; CHECK-NEXT: call void @use(i32 1)357; CHECK-NEXT: ret void358;359 %eq = icmp eq i64 %a, %b360 %slt = icmp slt i64 %a, %b361 %. = select i1 %slt, i32 -1, i32 1362 %result = select i1 %eq, i32 0, i32 %.363 %cmp = icmp sge i32 %result, 1364 br i1 %cmp, label %unreached, label %normal365normal:366 ret void367unreached:368 call void @use(i32 %result)369 ret void370}371 372define void @test_high_sle(i64 %a, i64 %b) {373; CHECK-LABEL: define void @test_high_sle374; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {375; CHECK-NEXT: br i1 true, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]376; CHECK: normal:377; CHECK-NEXT: ret void378; 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 void382;383 %eq = icmp eq i64 %a, %b384 %slt = icmp slt i64 %a, %b385 %. = select i1 %slt, i32 -1, i32 1386 %result = select i1 %eq, i32 0, i32 %.387 %cmp = icmp sle i32 %result, 1388 br i1 %cmp, label %unreached, label %normal389normal:390 ret void391unreached:392 call void @use(i32 %result)393 ret void394}395 396define void @test_high_ne(i64 %a, i64 %b) {397; CHECK-LABEL: define void @test_high_ne398; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {399; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i64 [[A]], [[B]]400; CHECK-NEXT: br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]401; CHECK: normal:402; CHECK-NEXT: ret void403; 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 void407;408 %eq = icmp eq i64 %a, %b409 %slt = icmp slt i64 %a, %b410 %. = select i1 %slt, i32 -1, i32 1411 %result = select i1 %eq, i32 0, i32 %.412 %cmp = icmp ne i32 %result, 1413 br i1 %cmp, label %unreached, label %normal414normal:415 ret void416unreached:417 call void @use(i32 %result)418 ret void419}420 421define void @test_high_eq(i64 %a, i64 %b) {422; CHECK-LABEL: define void @test_high_eq423; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {424; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[A]], [[B]]425; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]426; CHECK: normal:427; CHECK-NEXT: ret void428; CHECK: unreached:429; CHECK-NEXT: call void @use(i32 1)430; CHECK-NEXT: ret void431;432 %eq = icmp eq i64 %a, %b433 %slt = icmp slt i64 %a, %b434 %. = select i1 %slt, i32 -1, i32 1435 %result = select i1 %eq, i32 0, i32 %.436 %cmp = icmp eq i32 %result, 1437 br i1 %cmp, label %unreached, label %normal438normal:439 ret void440unreached:441 call void @use(i32 %result)442 ret void443}444 445; These five make sure we didn't accidentally hard code one of the446; produced values447 448define void @non_standard_low(i64 %a, i64 %b) {449; CHECK-LABEL: define void @non_standard_low450; 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 void455; CHECK: unreached:456; CHECK-NEXT: call void @use(i32 -3)457; CHECK-NEXT: ret void458;459 %eq = icmp eq i64 %a, %b460 %slt = icmp slt i64 %a, %b461 %. = select i1 %slt, i32 -3, i32 -1462 %result = select i1 %eq, i32 -2, i32 %.463 %cmp = icmp eq i32 %result, -3464 br i1 %cmp, label %unreached, label %normal465normal:466 ret void467unreached:468 call void @use(i32 %result)469 ret void470}471 472define void @non_standard_mid(i64 %a, i64 %b) {473; CHECK-LABEL: define void @non_standard_mid474; 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 void479; CHECK: unreached:480; CHECK-NEXT: call void @use(i32 -2)481; CHECK-NEXT: ret void482;483 %eq = icmp eq i64 %a, %b484 %slt = icmp slt i64 %a, %b485 %. = select i1 %slt, i32 -3, i32 -1486 %result = select i1 %eq, i32 -2, i32 %.487 %cmp = icmp eq i32 %result, -2488 br i1 %cmp, label %unreached, label %normal489normal:490 ret void491unreached:492 call void @use(i32 %result)493 ret void494}495 496define void @non_standard_high(i64 %a, i64 %b) {497; CHECK-LABEL: define void @non_standard_high498; 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 void503; CHECK: unreached:504; CHECK-NEXT: call void @use(i32 -1)505; CHECK-NEXT: ret void506;507 %eq = icmp eq i64 %a, %b508 %slt = icmp slt i64 %a, %b509 %. = select i1 %slt, i32 -3, i32 -1510 %result = select i1 %eq, i32 -2, i32 %.511 %cmp = icmp eq i32 %result, -1512 br i1 %cmp, label %unreached, label %normal513normal:514 ret void515unreached:516 call void @use(i32 %result)517 ret void518}519 520define void @non_standard_bound1(i64 %a, i64 %b) {521; CHECK-LABEL: define void @non_standard_bound1522; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {523; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]524; CHECK: normal:525; CHECK-NEXT: ret void526; CHECK: unreached:527; CHECK-NEXT: ret void528;529 %eq = icmp eq i64 %a, %b530 %slt = icmp slt i64 %a, %b531 %. = select i1 %slt, i32 -3, i32 -1532 %result = select i1 %eq, i32 -2, i32 %.533 %cmp = icmp eq i32 %result, -20534 br i1 %cmp, label %unreached, label %normal535normal:536 ret void537unreached:538 call void @use(i32 %result)539 ret void540}541 542define void @non_standard_bound2(i64 %a, i64 %b) {543; CHECK-LABEL: define void @non_standard_bound2544; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {545; CHECK-NEXT: br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]546; CHECK: normal:547; CHECK-NEXT: ret void548; CHECK: unreached:549; CHECK-NEXT: ret void550;551 %eq = icmp eq i64 %a, %b552 %slt = icmp slt i64 %a, %b553 %. = select i1 %slt, i32 -3, i32 -1554 %result = select i1 %eq, i32 -2, i32 %.555 %cmp = icmp eq i32 %result, 0556 br i1 %cmp, label %unreached, label %normal557normal:558 ret void559unreached:560 call void @use(i32 %result)561 ret void562}563 564define i32 @smax_smin_to_scmp(i32 %x) {565; CHECK-LABEL: define i32 @smax_smin_to_scmp566; CHECK-SAME: (i32 [[X:%.*]]) {567; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[X]], i32 0)568; CHECK-NEXT: ret i32 [[COND5]]569;570 %cond = call i32 @llvm.smax.i32(i32 %x, i32 -1)571 %cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)572 ret i32 %cond5573}574 575define i16 @smax_smin_to_scmp_i16(i16 %x) {576; CHECK-LABEL: define i16 @smax_smin_to_scmp_i16577; CHECK-SAME: (i16 [[X:%.*]]) {578; CHECK-NEXT: [[COND5:%.*]] = call i16 @llvm.scmp.i16.i16(i16 [[X]], i16 0)579; CHECK-NEXT: ret i16 [[COND5]]580;581 %cond = call i16 @llvm.smax.i16(i16 %x, i16 -1)582 %cond5 = call i16 @llvm.smin.i16(i16 %cond, i16 1)583 ret i16 %cond5584}585 586; Test the reversed pattern: smax(smin(X, 1), -1) -> scmp(X, 0)587define i32 @smin_smax_to_scmp(i32 %x) {588; CHECK-LABEL: define i32 @smin_smax_to_scmp589; CHECK-SAME: (i32 [[X:%.*]]) {590; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[X]], i32 0)591; CHECK-NEXT: ret i32 [[COND5]]592;593 %cond = call i32 @llvm.smin.i32(i32 %x, i32 1)594 %cond5 = call i32 @llvm.smax.i32(i32 %cond, i32 -1)595 ret i32 %cond5596}597 598define i32 @test_max_min_neg(i32 %x) {599; CHECK-LABEL: define i32 @test_max_min_neg600; CHECK-SAME: (i32 [[X:%.*]]) {601; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -2)602; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)603; CHECK-NEXT: ret i32 [[COND5]]604;605 %cond = call i32 @llvm.smax.i32(i32 %x, i32 -2)606 %cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)607 ret i32 %cond5608}609 610define i32 @test_max_min_neg_2(i32 %x) {611; CHECK-LABEL: define i32 @test_max_min_neg_2612; CHECK-SAME: (i32 [[X:%.*]]) {613; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)614; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 2)615; CHECK-NEXT: ret i32 [[COND5]]616;617 %cond = call i32 @llvm.smax.i32(i32 %x, i32 -1)618 %cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 2)619 ret i32 %cond5620}621 622define i32 @test_multiple_uses(i32 %x) {623; CHECK-LABEL: define i32 @test_multiple_uses624; CHECK-SAME: (i32 [[X:%.*]]) {625; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)626; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)627; CHECK-NEXT: [[SUM:%.*]] = add i32 [[COND]], [[COND5]]628; CHECK-NEXT: ret i32 [[SUM]]629;630 %cond = call i32 @llvm.smax.i32(i32 %x, i32 -1)631 %cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)632 %sum = add i32 %cond, %cond5633 ret i32 %sum634}635