brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.9 KiB · f5bbe0c Raw
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