brintos

brintos / llvm-project-archived public Read only

0
0
Text · 47.4 KiB · f05c169 Raw
1298 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4; If we have an smin feeding a signed or equality icmp that shares an5; operand with the smin, the compare should always be folded.6; Test all 6 foldable predicates (eq,ne,sge,sgt,sle,slt) * 4 commutation7; possibilities for each predicate. Note that folds to true/false or8; folds to an existing instruction may be handled by InstSimplify.9 10; smin(X, Y) == X --> X <= Y11 12define i1 @eq_smin1(i32 %x, i32 %y) {13; CHECK-LABEL: @eq_smin1(14; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]]15; CHECK-NEXT:    ret i1 [[CMP2]]16;17  %cmp1 = icmp slt i32 %x, %y18  %sel = select i1 %cmp1, i32 %x, i32 %y19  %cmp2 = icmp eq i32 %sel, %x20  ret i1 %cmp221}22 23; Commute min operands.24 25define i1 @eq_smin2(i32 %x, i32 %y) {26; CHECK-LABEL: @eq_smin2(27; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]]28; CHECK-NEXT:    ret i1 [[CMP2]]29;30  %cmp1 = icmp slt i32 %y, %x31  %sel = select i1 %cmp1, i32 %y, i32 %x32  %cmp2 = icmp eq i32 %sel, %x33  ret i1 %cmp234}35 36; Disguise the icmp predicate by commuting the min op to the RHS.37 38define i1 @eq_smin3(i32 %a, i32 %y) {39; CHECK-LABEL: @eq_smin3(40; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 341; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X]], [[Y:%.*]]42; CHECK-NEXT:    ret i1 [[CMP2]]43;44  %x = add i32 %a, 3 ; thwart complexity-based canonicalization45  %cmp1 = icmp slt i32 %x, %y46  %sel = select i1 %cmp1, i32 %x, i32 %y47  %cmp2 = icmp eq i32 %x, %sel48  ret i1 %cmp249}50 51; Commute min operands.52 53define i1 @eq_smin4(i32 %a, i32 %y) {54; CHECK-LABEL: @eq_smin4(55; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 356; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X]], [[Y:%.*]]57; CHECK-NEXT:    ret i1 [[CMP2]]58;59  %x = add i32 %a, 3 ; thwart complexity-based canonicalization60  %cmp1 = icmp slt i32 %y, %x61  %sel = select i1 %cmp1, i32 %y, i32 %x62  %cmp2 = icmp eq i32 %x, %sel63  ret i1 %cmp264}65 66; smin(X, Y) >= X --> Y >= X67 68define i1 @sge_smin1(i32 %x, i32 %y) {69; CHECK-LABEL: @sge_smin1(70; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X:%.*]]71; CHECK-NEXT:    ret i1 [[CMP2]]72;73  %cmp1 = icmp slt i32 %x, %y74  %sel = select i1 %cmp1, i32 %x, i32 %y75  %cmp2 = icmp sge i32 %sel, %x76  ret i1 %cmp277}78 79; Commute min operands.80 81define i1 @sge_smin2(i32 %x, i32 %y) {82; CHECK-LABEL: @sge_smin2(83; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X:%.*]]84; CHECK-NEXT:    ret i1 [[CMP2]]85;86  %cmp1 = icmp slt i32 %y, %x87  %sel = select i1 %cmp1, i32 %y, i32 %x88  %cmp2 = icmp sge i32 %sel, %x89  ret i1 %cmp290}91 92; Disguise the icmp predicate by commuting the min op to the RHS.93 94define i1 @sge_smin3(i32 %a, i32 %y) {95; CHECK-LABEL: @sge_smin3(96; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 397; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X]]98; CHECK-NEXT:    ret i1 [[CMP2]]99;100  %x = add i32 %a, 3 ; thwart complexity-based canonicalization101  %cmp1 = icmp slt i32 %x, %y102  %sel = select i1 %cmp1, i32 %x, i32 %y103  %cmp2 = icmp sle i32 %x, %sel104  ret i1 %cmp2105}106 107; Commute min operands.108 109define i1 @sge_smin4(i32 %a, i32 %y) {110; CHECK-LABEL: @sge_smin4(111; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3112; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X]]113; CHECK-NEXT:    ret i1 [[CMP2]]114;115  %x = add i32 %a, 3 ; thwart complexity-based canonicalization116  %cmp1 = icmp slt i32 %y, %x117  %sel = select i1 %cmp1, i32 %y, i32 %x118  %cmp2 = icmp sle i32 %x, %sel119  ret i1 %cmp2120}121 122; smin(X, Y) != X --> X > Y123 124define i1 @ne_smin1(i32 %x, i32 %y) {125; CHECK-LABEL: @ne_smin1(126; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]127; CHECK-NEXT:    ret i1 [[CMP2]]128;129  %cmp1 = icmp slt i32 %x, %y130  %sel = select i1 %cmp1, i32 %x, i32 %y131  %cmp2 = icmp ne i32 %sel, %x132  ret i1 %cmp2133}134 135; Commute min operands.136 137define i1 @ne_smin2(i32 %x, i32 %y) {138; CHECK-LABEL: @ne_smin2(139; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]140; CHECK-NEXT:    ret i1 [[CMP2]]141;142  %cmp1 = icmp slt i32 %y, %x143  %sel = select i1 %cmp1, i32 %y, i32 %x144  %cmp2 = icmp ne i32 %sel, %x145  ret i1 %cmp2146}147 148; Disguise the icmp predicate by commuting the min op to the RHS.149 150define i1 @ne_smin3(i32 %a, i32 %y) {151; CHECK-LABEL: @ne_smin3(152; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3153; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X]], [[Y:%.*]]154; CHECK-NEXT:    ret i1 [[CMP2]]155;156  %x = add i32 %a, 3 ; thwart complexity-based canonicalization157  %cmp1 = icmp slt i32 %x, %y158  %sel = select i1 %cmp1, i32 %x, i32 %y159  %cmp2 = icmp ne i32 %x, %sel160  ret i1 %cmp2161}162 163; Commute min operands.164 165define i1 @ne_smin4(i32 %a, i32 %y) {166; CHECK-LABEL: @ne_smin4(167; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3168; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X]], [[Y:%.*]]169; CHECK-NEXT:    ret i1 [[CMP2]]170;171  %x = add i32 %a, 3 ; thwart complexity-based canonicalization172  %cmp1 = icmp slt i32 %y, %x173  %sel = select i1 %cmp1, i32 %y, i32 %x174  %cmp2 = icmp ne i32 %x, %sel175  ret i1 %cmp2176}177 178; smin(X, Y) < X --> Y < X179 180define i1 @slt_smin1(i32 %x, i32 %y) {181; CHECK-LABEL: @slt_smin1(182; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]]183; CHECK-NEXT:    ret i1 [[CMP2]]184;185  %cmp1 = icmp slt i32 %x, %y186  %sel = select i1 %cmp1, i32 %x, i32 %y187  %cmp2 = icmp slt i32 %sel, %x188  ret i1 %cmp2189}190 191; Commute min operands.192 193define i1 @slt_smin2(i32 %x, i32 %y) {194; CHECK-LABEL: @slt_smin2(195; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]]196; CHECK-NEXT:    ret i1 [[CMP2]]197;198  %cmp1 = icmp slt i32 %y, %x199  %sel = select i1 %cmp1, i32 %y, i32 %x200  %cmp2 = icmp slt i32 %sel, %x201  ret i1 %cmp2202}203 204; Disguise the icmp predicate by commuting the min op to the RHS.205 206define i1 @slt_smin3(i32 %a, i32 %y) {207; CHECK-LABEL: @slt_smin3(208; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3209; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X]]210; CHECK-NEXT:    ret i1 [[CMP2]]211;212  %x = add i32 %a, 3 ; thwart complexity-based canonicalization213  %cmp1 = icmp slt i32 %x, %y214  %sel = select i1 %cmp1, i32 %x, i32 %y215  %cmp2 = icmp sgt i32 %x, %sel216  ret i1 %cmp2217}218 219; Commute min operands.220 221define i1 @slt_smin4(i32 %a, i32 %y) {222; CHECK-LABEL: @slt_smin4(223; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3224; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X]]225; CHECK-NEXT:    ret i1 [[CMP2]]226;227  %x = add i32 %a, 3 ; thwart complexity-based canonicalization228  %cmp1 = icmp slt i32 %y, %x229  %sel = select i1 %cmp1, i32 %y, i32 %x230  %cmp2 = icmp sgt i32 %x, %sel231  ret i1 %cmp2232}233 234; smin(X, Y) <= X --> true235 236define i1 @sle_smin1(i32 %x, i32 %y) {237; CHECK-LABEL: @sle_smin1(238; CHECK-NEXT:    ret i1 true239;240  %cmp1 = icmp slt i32 %x, %y241  %sel = select i1 %cmp1, i32 %x, i32 %y242  %cmp2 = icmp sle i32 %sel, %x243  ret i1 %cmp2244}245 246; Commute min operands.247 248define i1 @sle_smin2(i32 %x, i32 %y) {249; CHECK-LABEL: @sle_smin2(250; CHECK-NEXT:    ret i1 true251;252  %cmp1 = icmp slt i32 %y, %x253  %sel = select i1 %cmp1, i32 %y, i32 %x254  %cmp2 = icmp sle i32 %sel, %x255  ret i1 %cmp2256}257 258; Disguise the icmp predicate by commuting the min op to the RHS.259 260define i1 @sle_smin3(i32 %a, i32 %y) {261; CHECK-LABEL: @sle_smin3(262; CHECK-NEXT:    ret i1 true263;264  %x = add i32 %a, 3 ; thwart complexity-based canonicalization265  %cmp1 = icmp slt i32 %x, %y266  %sel = select i1 %cmp1, i32 %x, i32 %y267  %cmp2 = icmp sge i32 %x, %sel268  ret i1 %cmp2269}270 271; Commute min operands.272 273define i1 @sle_smin4(i32 %a, i32 %y) {274; CHECK-LABEL: @sle_smin4(275; CHECK-NEXT:    ret i1 true276;277  %x = add i32 %a, 3 ; thwart complexity-based canonicalization278  %cmp1 = icmp slt i32 %y, %x279  %sel = select i1 %cmp1, i32 %y, i32 %x280  %cmp2 = icmp sge i32 %x, %sel281  ret i1 %cmp2282}283 284; smin(X, Y) > X --> false285 286define i1 @sgt_smin1(i32 %x, i32 %y) {287; CHECK-LABEL: @sgt_smin1(288; CHECK-NEXT:    ret i1 false289;290  %cmp1 = icmp slt i32 %x, %y291  %sel = select i1 %cmp1, i32 %x, i32 %y292  %cmp2 = icmp sgt i32 %sel, %x293  ret i1 %cmp2294}295 296; Commute min operands.297 298define i1 @sgt_smin2(i32 %x, i32 %y) {299; CHECK-LABEL: @sgt_smin2(300; CHECK-NEXT:    ret i1 false301;302  %cmp1 = icmp slt i32 %y, %x303  %sel = select i1 %cmp1, i32 %y, i32 %x304  %cmp2 = icmp sgt i32 %sel, %x305  ret i1 %cmp2306}307 308; Disguise the icmp predicate by commuting the min op to the RHS.309 310define i1 @sgt_smin3(i32 %a, i32 %y) {311; CHECK-LABEL: @sgt_smin3(312; CHECK-NEXT:    ret i1 false313;314  %x = add i32 %a, 3 ; thwart complexity-based canonicalization315  %cmp1 = icmp slt i32 %x, %y316  %sel = select i1 %cmp1, i32 %x, i32 %y317  %cmp2 = icmp slt i32 %x, %sel318  ret i1 %cmp2319}320 321; Commute min operands.322 323define i1 @sgt_smin4(i32 %a, i32 %y) {324; CHECK-LABEL: @sgt_smin4(325; CHECK-NEXT:    ret i1 false326;327  %x = add i32 %a, 3 ; thwart complexity-based canonicalization328  %cmp1 = icmp slt i32 %y, %x329  %sel = select i1 %cmp1, i32 %y, i32 %x330  %cmp2 = icmp slt i32 %x, %sel331  ret i1 %cmp2332}333 334declare void @use(i1 %c)335 336define void @eq_smin_contextual(i32 %x, i32 %y, i32 %z) {337; CHECK-LABEL: @eq_smin_contextual(338; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]339; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]340; CHECK:       if:341; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])342; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]343; CHECK-NEXT:    call void @use(i1 [[CMP1]])344; CHECK-NEXT:    call void @use(i1 true)345; CHECK-NEXT:    call void @use(i1 false)346; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]347; CHECK-NEXT:    call void @use(i1 [[CMP4]])348; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]349; CHECK-NEXT:    call void @use(i1 [[CMP5]])350; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]351; CHECK-NEXT:    call void @use(i1 [[CMP6]])352; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]353; CHECK-NEXT:    call void @use(i1 [[CMP7]])354; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]355; CHECK-NEXT:    call void @use(i1 [[CMP8]])356; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[X]], [[Y]]357; CHECK-NEXT:    call void @use(i1 [[CMP9]])358; CHECK-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[X]], [[Y]]359; CHECK-NEXT:    call void @use(i1 [[CMP10]])360; CHECK-NEXT:    ret void361; CHECK:       end:362; CHECK-NEXT:    ret void363;364  %cmp = icmp eq i32 %x, %z365  br i1 %cmp, label %if, label %end366if:367  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)368  %cmp1 = icmp slt i32 %cond, %z369  call void @use(i1 %cmp1)370  %cmp2 = icmp sle i32 %cond, %z371  call void @use(i1 %cmp2)372  %cmp3 = icmp sgt i32 %cond, %z373  call void @use(i1 %cmp3)374  %cmp4 = icmp sge i32 %cond, %z375  call void @use(i1 %cmp4)376  %cmp5 = icmp ult i32 %cond, %z377  call void @use(i1 %cmp5)378  %cmp6 = icmp ule i32 %cond, %z379  call void @use(i1 %cmp6)380  %cmp7 = icmp ugt i32 %cond, %z381  call void @use(i1 %cmp7)382  %cmp8 = icmp uge i32 %cond, %z383  call void @use(i1 %cmp8)384  %cmp9 = icmp eq i32 %cond, %z385  call void @use(i1 %cmp9)386  %cmp10 = icmp ne i32 %cond, %z387  call void @use(i1 %cmp10)388  ret void389end:390  ret void391}392 393define void @eq_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {394; CHECK-LABEL: @eq_smin_contextual_commuted(395; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]396; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]397; CHECK:       if:398; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])399; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]400; CHECK-NEXT:    call void @use(i1 [[CMP1]])401; CHECK-NEXT:    call void @use(i1 true)402; CHECK-NEXT:    call void @use(i1 false)403; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]404; CHECK-NEXT:    call void @use(i1 [[CMP4]])405; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]406; CHECK-NEXT:    call void @use(i1 [[CMP5]])407; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]408; CHECK-NEXT:    call void @use(i1 [[CMP6]])409; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]410; CHECK-NEXT:    call void @use(i1 [[CMP7]])411; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]412; CHECK-NEXT:    call void @use(i1 [[CMP8]])413; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[X]], [[Y]]414; CHECK-NEXT:    call void @use(i1 [[CMP9]])415; CHECK-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[X]], [[Y]]416; CHECK-NEXT:    call void @use(i1 [[CMP10]])417; CHECK-NEXT:    ret void418; CHECK:       end:419; CHECK-NEXT:    ret void420;421  %cmp = icmp eq i32 %x, %z422  br i1 %cmp, label %if, label %end423if:424  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)425  %cmp1 = icmp slt i32 %cond, %z426  call void @use(i1 %cmp1)427  %cmp2 = icmp sle i32 %cond, %z428  call void @use(i1 %cmp2)429  %cmp3 = icmp sgt i32 %cond, %z430  call void @use(i1 %cmp3)431  %cmp4 = icmp sge i32 %cond, %z432  call void @use(i1 %cmp4)433  %cmp5 = icmp ult i32 %cond, %z434  call void @use(i1 %cmp5)435  %cmp6 = icmp ule i32 %cond, %z436  call void @use(i1 %cmp6)437  %cmp7 = icmp ugt i32 %cond, %z438  call void @use(i1 %cmp7)439  %cmp8 = icmp uge i32 %cond, %z440  call void @use(i1 %cmp8)441  %cmp9 = icmp eq i32 %cond, %z442  call void @use(i1 %cmp9)443  %cmp10 = icmp ne i32 %cond, %z444  call void @use(i1 %cmp10)445  ret void446end:447  ret void448}449 450define void @slt_smin_contextual(i32 %x, i32 %y, i32 %z) {451; CHECK-LABEL: @slt_smin_contextual(452; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]453; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]454; CHECK:       if:455; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])456; CHECK-NEXT:    call void @use(i1 true)457; CHECK-NEXT:    call void @use(i1 true)458; CHECK-NEXT:    call void @use(i1 false)459; CHECK-NEXT:    call void @use(i1 false)460; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]461; CHECK-NEXT:    call void @use(i1 [[CMP5]])462; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]463; CHECK-NEXT:    call void @use(i1 [[CMP6]])464; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]465; CHECK-NEXT:    call void @use(i1 [[CMP7]])466; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]467; CHECK-NEXT:    call void @use(i1 [[CMP8]])468; CHECK-NEXT:    call void @use(i1 false)469; CHECK-NEXT:    call void @use(i1 true)470; CHECK-NEXT:    ret void471; CHECK:       end:472; CHECK-NEXT:    ret void473;474  %cmp = icmp slt i32 %x, %z475  br i1 %cmp, label %if, label %end476if:477  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)478  %cmp1 = icmp slt i32 %cond, %z479  call void @use(i1 %cmp1)480  %cmp2 = icmp sle i32 %cond, %z481  call void @use(i1 %cmp2)482  %cmp3 = icmp sgt i32 %cond, %z483  call void @use(i1 %cmp3)484  %cmp4 = icmp sge i32 %cond, %z485  call void @use(i1 %cmp4)486  %cmp5 = icmp ult i32 %cond, %z487  call void @use(i1 %cmp5)488  %cmp6 = icmp ule i32 %cond, %z489  call void @use(i1 %cmp6)490  %cmp7 = icmp ugt i32 %cond, %z491  call void @use(i1 %cmp7)492  %cmp8 = icmp uge i32 %cond, %z493  call void @use(i1 %cmp8)494  %cmp9 = icmp eq i32 %cond, %z495  call void @use(i1 %cmp9)496  %cmp10 = icmp ne i32 %cond, %z497  call void @use(i1 %cmp10)498  ret void499end:500  ret void501}502 503define void @slt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {504; CHECK-LABEL: @slt_smin_contextual_commuted(505; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]506; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]507; CHECK:       if:508; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])509; CHECK-NEXT:    call void @use(i1 true)510; CHECK-NEXT:    call void @use(i1 true)511; CHECK-NEXT:    call void @use(i1 false)512; CHECK-NEXT:    call void @use(i1 false)513; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]514; CHECK-NEXT:    call void @use(i1 [[CMP5]])515; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]516; CHECK-NEXT:    call void @use(i1 [[CMP6]])517; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]518; CHECK-NEXT:    call void @use(i1 [[CMP7]])519; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]520; CHECK-NEXT:    call void @use(i1 [[CMP8]])521; CHECK-NEXT:    call void @use(i1 false)522; CHECK-NEXT:    call void @use(i1 true)523; CHECK-NEXT:    ret void524; CHECK:       end:525; CHECK-NEXT:    ret void526;527  %cmp = icmp slt i32 %x, %z528  br i1 %cmp, label %if, label %end529if:530  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)531  %cmp1 = icmp slt i32 %cond, %z532  call void @use(i1 %cmp1)533  %cmp2 = icmp sle i32 %cond, %z534  call void @use(i1 %cmp2)535  %cmp3 = icmp sgt i32 %cond, %z536  call void @use(i1 %cmp3)537  %cmp4 = icmp sge i32 %cond, %z538  call void @use(i1 %cmp4)539  %cmp5 = icmp ult i32 %cond, %z540  call void @use(i1 %cmp5)541  %cmp6 = icmp ule i32 %cond, %z542  call void @use(i1 %cmp6)543  %cmp7 = icmp ugt i32 %cond, %z544  call void @use(i1 %cmp7)545  %cmp8 = icmp uge i32 %cond, %z546  call void @use(i1 %cmp8)547  %cmp9 = icmp eq i32 %cond, %z548  call void @use(i1 %cmp9)549  %cmp10 = icmp ne i32 %cond, %z550  call void @use(i1 %cmp10)551  ret void552end:553  ret void554}555 556define void @sle_smin_contextual(i32 %x, i32 %y, i32 %z) {557; CHECK-LABEL: @sle_smin_contextual(558; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]559; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]560; CHECK:       if:561; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])562; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[COND]], [[Z]]563; CHECK-NEXT:    call void @use(i1 [[CMP1]])564; CHECK-NEXT:    call void @use(i1 true)565; CHECK-NEXT:    call void @use(i1 false)566; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[COND]], [[Z]]567; CHECK-NEXT:    call void @use(i1 [[CMP4]])568; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]569; CHECK-NEXT:    call void @use(i1 [[CMP5]])570; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]571; CHECK-NEXT:    call void @use(i1 [[CMP6]])572; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]573; CHECK-NEXT:    call void @use(i1 [[CMP7]])574; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]575; CHECK-NEXT:    call void @use(i1 [[CMP8]])576; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]577; CHECK-NEXT:    call void @use(i1 [[CMP9]])578; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]579; CHECK-NEXT:    call void @use(i1 [[CMP10]])580; CHECK-NEXT:    ret void581; CHECK:       end:582; CHECK-NEXT:    ret void583;584  %cmp = icmp sle i32 %x, %z585  br i1 %cmp, label %if, label %end586if:587  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)588  %cmp1 = icmp slt i32 %cond, %z589  call void @use(i1 %cmp1)590  %cmp2 = icmp sle i32 %cond, %z591  call void @use(i1 %cmp2)592  %cmp3 = icmp sgt i32 %cond, %z593  call void @use(i1 %cmp3)594  %cmp4 = icmp sge i32 %cond, %z595  call void @use(i1 %cmp4)596  %cmp5 = icmp ult i32 %cond, %z597  call void @use(i1 %cmp5)598  %cmp6 = icmp ule i32 %cond, %z599  call void @use(i1 %cmp6)600  %cmp7 = icmp ugt i32 %cond, %z601  call void @use(i1 %cmp7)602  %cmp8 = icmp uge i32 %cond, %z603  call void @use(i1 %cmp8)604  %cmp9 = icmp eq i32 %cond, %z605  call void @use(i1 %cmp9)606  %cmp10 = icmp ne i32 %cond, %z607  call void @use(i1 %cmp10)608  ret void609end:610  ret void611}612 613define void @sle_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {614; CHECK-LABEL: @sle_smin_contextual_commuted(615; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]616; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]617; CHECK:       if:618; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])619; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[COND]], [[Z]]620; CHECK-NEXT:    call void @use(i1 [[CMP1]])621; CHECK-NEXT:    call void @use(i1 true)622; CHECK-NEXT:    call void @use(i1 false)623; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[COND]], [[Z]]624; CHECK-NEXT:    call void @use(i1 [[CMP4]])625; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]626; CHECK-NEXT:    call void @use(i1 [[CMP5]])627; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]628; CHECK-NEXT:    call void @use(i1 [[CMP6]])629; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]630; CHECK-NEXT:    call void @use(i1 [[CMP7]])631; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]632; CHECK-NEXT:    call void @use(i1 [[CMP8]])633; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]634; CHECK-NEXT:    call void @use(i1 [[CMP9]])635; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]636; CHECK-NEXT:    call void @use(i1 [[CMP10]])637; CHECK-NEXT:    ret void638; CHECK:       end:639; CHECK-NEXT:    ret void640;641  %cmp = icmp sle i32 %x, %z642  br i1 %cmp, label %if, label %end643if:644  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)645  %cmp1 = icmp slt i32 %cond, %z646  call void @use(i1 %cmp1)647  %cmp2 = icmp sle i32 %cond, %z648  call void @use(i1 %cmp2)649  %cmp3 = icmp sgt i32 %cond, %z650  call void @use(i1 %cmp3)651  %cmp4 = icmp sge i32 %cond, %z652  call void @use(i1 %cmp4)653  %cmp5 = icmp ult i32 %cond, %z654  call void @use(i1 %cmp5)655  %cmp6 = icmp ule i32 %cond, %z656  call void @use(i1 %cmp6)657  %cmp7 = icmp ugt i32 %cond, %z658  call void @use(i1 %cmp7)659  %cmp8 = icmp uge i32 %cond, %z660  call void @use(i1 %cmp8)661  %cmp9 = icmp eq i32 %cond, %z662  call void @use(i1 %cmp9)663  %cmp10 = icmp ne i32 %cond, %z664  call void @use(i1 %cmp10)665  ret void666end:667  ret void668}669 670define void @sgt_smin_contextual(i32 %x, i32 %y, i32 %z) {671; CHECK-LABEL: @sgt_smin_contextual(672; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]673; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]674; CHECK:       if:675; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])676; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]677; CHECK-NEXT:    call void @use(i1 [[CMP1]])678; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[Y]], [[Z]]679; CHECK-NEXT:    call void @use(i1 [[CMP2]])680; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[Y]], [[Z]]681; CHECK-NEXT:    call void @use(i1 [[CMP3]])682; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]683; CHECK-NEXT:    call void @use(i1 [[CMP4]])684; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]685; CHECK-NEXT:    call void @use(i1 [[CMP5]])686; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]687; CHECK-NEXT:    call void @use(i1 [[CMP6]])688; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]689; CHECK-NEXT:    call void @use(i1 [[CMP7]])690; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]691; CHECK-NEXT:    call void @use(i1 [[CMP8]])692; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]693; CHECK-NEXT:    call void @use(i1 [[CMP9]])694; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]695; CHECK-NEXT:    call void @use(i1 [[CMP10]])696; CHECK-NEXT:    ret void697; CHECK:       end:698; CHECK-NEXT:    ret void699;700  %cmp = icmp sgt i32 %x, %z701  br i1 %cmp, label %if, label %end702if:703  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)704  %cmp1 = icmp slt i32 %cond, %z705  call void @use(i1 %cmp1)706  %cmp2 = icmp sle i32 %cond, %z707  call void @use(i1 %cmp2)708  %cmp3 = icmp sgt i32 %cond, %z709  call void @use(i1 %cmp3)710  %cmp4 = icmp sge i32 %cond, %z711  call void @use(i1 %cmp4)712  %cmp5 = icmp ult i32 %cond, %z713  call void @use(i1 %cmp5)714  %cmp6 = icmp ule i32 %cond, %z715  call void @use(i1 %cmp6)716  %cmp7 = icmp ugt i32 %cond, %z717  call void @use(i1 %cmp7)718  %cmp8 = icmp uge i32 %cond, %z719  call void @use(i1 %cmp8)720  %cmp9 = icmp eq i32 %cond, %z721  call void @use(i1 %cmp9)722  %cmp10 = icmp ne i32 %cond, %z723  call void @use(i1 %cmp10)724  ret void725end:726  ret void727}728 729define void @sgt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {730; CHECK-LABEL: @sgt_smin_contextual_commuted(731; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]732; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]733; CHECK:       if:734; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])735; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]736; CHECK-NEXT:    call void @use(i1 [[CMP1]])737; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[Y]], [[Z]]738; CHECK-NEXT:    call void @use(i1 [[CMP2]])739; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[Y]], [[Z]]740; CHECK-NEXT:    call void @use(i1 [[CMP3]])741; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]742; CHECK-NEXT:    call void @use(i1 [[CMP4]])743; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]744; CHECK-NEXT:    call void @use(i1 [[CMP5]])745; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]746; CHECK-NEXT:    call void @use(i1 [[CMP6]])747; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]748; CHECK-NEXT:    call void @use(i1 [[CMP7]])749; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]750; CHECK-NEXT:    call void @use(i1 [[CMP8]])751; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]752; CHECK-NEXT:    call void @use(i1 [[CMP9]])753; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]754; CHECK-NEXT:    call void @use(i1 [[CMP10]])755; CHECK-NEXT:    ret void756; CHECK:       end:757; CHECK-NEXT:    ret void758;759  %cmp = icmp sgt i32 %x, %z760  br i1 %cmp, label %if, label %end761if:762  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)763  %cmp1 = icmp slt i32 %cond, %z764  call void @use(i1 %cmp1)765  %cmp2 = icmp sle i32 %cond, %z766  call void @use(i1 %cmp2)767  %cmp3 = icmp sgt i32 %cond, %z768  call void @use(i1 %cmp3)769  %cmp4 = icmp sge i32 %cond, %z770  call void @use(i1 %cmp4)771  %cmp5 = icmp ult i32 %cond, %z772  call void @use(i1 %cmp5)773  %cmp6 = icmp ule i32 %cond, %z774  call void @use(i1 %cmp6)775  %cmp7 = icmp ugt i32 %cond, %z776  call void @use(i1 %cmp7)777  %cmp8 = icmp uge i32 %cond, %z778  call void @use(i1 %cmp8)779  %cmp9 = icmp eq i32 %cond, %z780  call void @use(i1 %cmp9)781  %cmp10 = icmp ne i32 %cond, %z782  call void @use(i1 %cmp10)783  ret void784end:785  ret void786}787 788define void @sge_smin_contextual(i32 %x, i32 %y, i32 %z) {789; CHECK-LABEL: @sge_smin_contextual(790; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]791; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]792; CHECK:       if:793; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])794; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]795; CHECK-NEXT:    call void @use(i1 [[CMP1]])796; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[COND]], [[Z]]797; CHECK-NEXT:    call void @use(i1 [[CMP2]])798; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[COND]], [[Z]]799; CHECK-NEXT:    call void @use(i1 [[CMP3]])800; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]801; CHECK-NEXT:    call void @use(i1 [[CMP4]])802; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]803; CHECK-NEXT:    call void @use(i1 [[CMP5]])804; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]805; CHECK-NEXT:    call void @use(i1 [[CMP6]])806; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]807; CHECK-NEXT:    call void @use(i1 [[CMP7]])808; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]809; CHECK-NEXT:    call void @use(i1 [[CMP8]])810; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]811; CHECK-NEXT:    call void @use(i1 [[CMP9]])812; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]813; CHECK-NEXT:    call void @use(i1 [[CMP10]])814; CHECK-NEXT:    ret void815; CHECK:       end:816; CHECK-NEXT:    ret void817;818  %cmp = icmp sge i32 %x, %z819  br i1 %cmp, label %if, label %end820if:821  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)822  %cmp1 = icmp slt i32 %cond, %z823  call void @use(i1 %cmp1)824  %cmp2 = icmp sle i32 %cond, %z825  call void @use(i1 %cmp2)826  %cmp3 = icmp sgt i32 %cond, %z827  call void @use(i1 %cmp3)828  %cmp4 = icmp sge i32 %cond, %z829  call void @use(i1 %cmp4)830  %cmp5 = icmp ult i32 %cond, %z831  call void @use(i1 %cmp5)832  %cmp6 = icmp ule i32 %cond, %z833  call void @use(i1 %cmp6)834  %cmp7 = icmp ugt i32 %cond, %z835  call void @use(i1 %cmp7)836  %cmp8 = icmp uge i32 %cond, %z837  call void @use(i1 %cmp8)838  %cmp9 = icmp eq i32 %cond, %z839  call void @use(i1 %cmp9)840  %cmp10 = icmp ne i32 %cond, %z841  call void @use(i1 %cmp10)842  ret void843end:844  ret void845}846 847define void @sge_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {848; CHECK-LABEL: @sge_smin_contextual_commuted(849; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]850; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]851; CHECK:       if:852; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])853; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]854; CHECK-NEXT:    call void @use(i1 [[CMP1]])855; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[COND]], [[Z]]856; CHECK-NEXT:    call void @use(i1 [[CMP2]])857; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[COND]], [[Z]]858; CHECK-NEXT:    call void @use(i1 [[CMP3]])859; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]860; CHECK-NEXT:    call void @use(i1 [[CMP4]])861; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]862; CHECK-NEXT:    call void @use(i1 [[CMP5]])863; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]864; CHECK-NEXT:    call void @use(i1 [[CMP6]])865; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]866; CHECK-NEXT:    call void @use(i1 [[CMP7]])867; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]868; CHECK-NEXT:    call void @use(i1 [[CMP8]])869; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]870; CHECK-NEXT:    call void @use(i1 [[CMP9]])871; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]872; CHECK-NEXT:    call void @use(i1 [[CMP10]])873; CHECK-NEXT:    ret void874; CHECK:       end:875; CHECK-NEXT:    ret void876;877  %cmp = icmp sge i32 %x, %z878  br i1 %cmp, label %if, label %end879if:880  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)881  %cmp1 = icmp slt i32 %cond, %z882  call void @use(i1 %cmp1)883  %cmp2 = icmp sle i32 %cond, %z884  call void @use(i1 %cmp2)885  %cmp3 = icmp sgt i32 %cond, %z886  call void @use(i1 %cmp3)887  %cmp4 = icmp sge i32 %cond, %z888  call void @use(i1 %cmp4)889  %cmp5 = icmp ult i32 %cond, %z890  call void @use(i1 %cmp5)891  %cmp6 = icmp ule i32 %cond, %z892  call void @use(i1 %cmp6)893  %cmp7 = icmp ugt i32 %cond, %z894  call void @use(i1 %cmp7)895  %cmp8 = icmp uge i32 %cond, %z896  call void @use(i1 %cmp8)897  %cmp9 = icmp eq i32 %cond, %z898  call void @use(i1 %cmp9)899  %cmp10 = icmp ne i32 %cond, %z900  call void @use(i1 %cmp10)901  ret void902end:903  ret void904}905 906declare void @use_v2i1(<2 x i1> %c)907 908; icmp pred smin(X, Y), X909define void @eq_smin_v2i32(<2 x i32> %x, <2 x i32> %y) {910; CHECK-LABEL: @eq_smin_v2i32(911; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]])912; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], [[X]]913; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])914; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))915; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)916; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge <2 x i32> [[Y]], [[X]]917; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])918; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], [[X]]919; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])920; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule <2 x i32> [[COND]], [[X]]921; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])922; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], [[X]]923; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])924; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge <2 x i32> [[COND]], [[X]]925; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])926; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle <2 x i32> [[X]], [[Y]]927; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])928; CHECK-NEXT:    [[CMP10:%.*]] = icmp sgt <2 x i32> [[X]], [[Y]]929; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])930; CHECK-NEXT:    ret void931;932  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %x, <2 x i32> %y)933  %cmp1 = icmp slt <2 x i32> %cond, %x934  call void @use_v2i1(<2 x i1> %cmp1)935  %cmp2 = icmp sle <2 x i32> %cond, %x936  call void @use_v2i1(<2 x i1> %cmp2)937  %cmp3 = icmp sgt <2 x i32> %cond, %x938  call void @use_v2i1(<2 x i1> %cmp3)939  %cmp4 = icmp sge <2 x i32> %cond, %x940  call void @use_v2i1(<2 x i1> %cmp4)941  %cmp5 = icmp ult <2 x i32> %cond, %x942  call void @use_v2i1(<2 x i1> %cmp5)943  %cmp6 = icmp ule <2 x i32> %cond, %x944  call void @use_v2i1(<2 x i1> %cmp6)945  %cmp7 = icmp ugt <2 x i32> %cond, %x946  call void @use_v2i1(<2 x i1> %cmp7)947  %cmp8 = icmp uge <2 x i32> %cond, %x948  call void @use_v2i1(<2 x i1> %cmp8)949  %cmp9 = icmp eq <2 x i32> %cond, %x950  call void @use_v2i1(<2 x i1> %cmp9)951  %cmp10 = icmp ne <2 x i32> %cond, %x952  call void @use_v2i1(<2 x i1> %cmp10)953  ret void954}955 956; icmp pred smin(C1, Y), C2 where C1 == C2957define void @eq_smin_v2i32_constant(<2 x i32> %y) {958; CHECK-LABEL: @eq_smin_v2i32_constant(959; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 10))960; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)961; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])962; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))963; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)964; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)965; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])966; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)967; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])968; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)969; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])970; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)971; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])972; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)973; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])974; CHECK-NEXT:    [[CMP9:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)975; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])976; CHECK-NEXT:    [[CMP10:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)977; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])978; CHECK-NEXT:    ret void979;980  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 10, i32 10>, <2 x i32> %y)981  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>982  call void @use_v2i1(<2 x i1> %cmp1)983  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>984  call void @use_v2i1(<2 x i1> %cmp2)985  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>986  call void @use_v2i1(<2 x i1> %cmp3)987  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>988  call void @use_v2i1(<2 x i1> %cmp4)989  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>990  call void @use_v2i1(<2 x i1> %cmp5)991  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>992  call void @use_v2i1(<2 x i1> %cmp6)993  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>994  call void @use_v2i1(<2 x i1> %cmp7)995  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>996  call void @use_v2i1(<2 x i1> %cmp8)997  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>998  call void @use_v2i1(<2 x i1> %cmp9)999  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>1000  call void @use_v2i1(<2 x i1> %cmp10)1001  ret void1002}1003 1004; icmp pred smin(C1, Y), C2 where C1 < C21005define void @slt_smin_v2i32_constant(<2 x i32> %y) {1006; CHECK-LABEL: @slt_smin_v2i32_constant(1007; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 5))1008; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))1009; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))1010; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)1011; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)1012; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)1013; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])1014; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)1015; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])1016; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)1017; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])1018; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)1019; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])1020; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)1021; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))1022; CHECK-NEXT:    ret void1023;1024  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 5>, <2 x i32> %y)1025  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>1026  call void @use_v2i1(<2 x i1> %cmp1)1027  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>1028  call void @use_v2i1(<2 x i1> %cmp2)1029  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>1030  call void @use_v2i1(<2 x i1> %cmp3)1031  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>1032  call void @use_v2i1(<2 x i1> %cmp4)1033  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>1034  call void @use_v2i1(<2 x i1> %cmp5)1035  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>1036  call void @use_v2i1(<2 x i1> %cmp6)1037  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>1038  call void @use_v2i1(<2 x i1> %cmp7)1039  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>1040  call void @use_v2i1(<2 x i1> %cmp8)1041  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>1042  call void @use_v2i1(<2 x i1> %cmp9)1043  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>1044  call void @use_v2i1(<2 x i1> %cmp10)1045  ret void1046}1047 1048; icmp pred smin(C1, Y), C2 where C1 <= C21049define void @sle_smin_v2i32_constant(<2 x i32> %y) {1050; CHECK-LABEL: @sle_smin_v2i32_constant(1051; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 5, i32 10>)1052; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 10)1053; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])1054; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))1055; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)1056; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 9)1057; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])1058; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)1059; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])1060; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)1061; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])1062; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)1063; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])1064; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)1065; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])1066; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10)1067; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])1068; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10)1069; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])1070; CHECK-NEXT:    ret void1071;1072  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 10>, <2 x i32> %y)1073  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>1074  call void @use_v2i1(<2 x i1> %cmp1)1075  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>1076  call void @use_v2i1(<2 x i1> %cmp2)1077  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>1078  call void @use_v2i1(<2 x i1> %cmp3)1079  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>1080  call void @use_v2i1(<2 x i1> %cmp4)1081  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>1082  call void @use_v2i1(<2 x i1> %cmp5)1083  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>1084  call void @use_v2i1(<2 x i1> %cmp6)1085  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>1086  call void @use_v2i1(<2 x i1> %cmp7)1087  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>1088  call void @use_v2i1(<2 x i1> %cmp8)1089  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>1090  call void @use_v2i1(<2 x i1> %cmp9)1091  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>1092  call void @use_v2i1(<2 x i1> %cmp10)1093  ret void1094}1095 1096; icmp pred smin(C1, Y), C2 where C1 > C21097define void @sgt_smin_v2i32_constant(<2 x i32> %y) {1098; CHECK-LABEL: @sgt_smin_v2i32_constant(1099; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 15))1100; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)1101; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])1102; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 11)1103; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP2]])1104; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 10)1105; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP3]])1106; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)1107; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])1108; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)1109; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])1110; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)1111; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])1112; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)1113; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])1114; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)1115; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])1116; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[Y]], splat (i32 10)1117; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])1118; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[Y]], splat (i32 10)1119; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])1120; CHECK-NEXT:    ret void1121;1122  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 15, i32 15>, <2 x i32> %y)1123  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>1124  call void @use_v2i1(<2 x i1> %cmp1)1125  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>1126  call void @use_v2i1(<2 x i1> %cmp2)1127  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>1128  call void @use_v2i1(<2 x i1> %cmp3)1129  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>1130  call void @use_v2i1(<2 x i1> %cmp4)1131  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>1132  call void @use_v2i1(<2 x i1> %cmp5)1133  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>1134  call void @use_v2i1(<2 x i1> %cmp6)1135  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>1136  call void @use_v2i1(<2 x i1> %cmp7)1137  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>1138  call void @use_v2i1(<2 x i1> %cmp8)1139  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>1140  call void @use_v2i1(<2 x i1> %cmp9)1141  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>1142  call void @use_v2i1(<2 x i1> %cmp10)1143  ret void1144}1145 1146; icmp pred smin(C1, Y), C2 where C1 >= C21147define void @sge_smin_v2i32_constant(<2 x i32> %y) {1148; CHECK-LABEL: @sge_smin_v2i32_constant(1149; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 15, i32 10>)1150; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)1151; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])1152; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 11)1153; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP2]])1154; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 10)1155; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP3]])1156; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)1157; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])1158; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)1159; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])1160; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)1161; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])1162; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)1163; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])1164; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)1165; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])1166; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10)1167; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])1168; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10)1169; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])1170; CHECK-NEXT:    ret void1171;1172  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 15, i32 10>, <2 x i32> %y)1173  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>1174  call void @use_v2i1(<2 x i1> %cmp1)1175  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>1176  call void @use_v2i1(<2 x i1> %cmp2)1177  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>1178  call void @use_v2i1(<2 x i1> %cmp3)1179  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>1180  call void @use_v2i1(<2 x i1> %cmp4)1181  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>1182  call void @use_v2i1(<2 x i1> %cmp5)1183  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>1184  call void @use_v2i1(<2 x i1> %cmp6)1185  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>1186  call void @use_v2i1(<2 x i1> %cmp7)1187  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>1188  call void @use_v2i1(<2 x i1> %cmp8)1189  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>1190  call void @use_v2i1(<2 x i1> %cmp9)1191  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>1192  call void @use_v2i1(<2 x i1> %cmp10)1193  ret void1194}1195 1196; icmp pred smin(C1, Y), C2 where (icmp pred' C1, C2) is not a constant splat for all pred'1197define void @unknown_smin_v2i32_constant(<2 x i32> %y) {1198; CHECK-LABEL: @unknown_smin_v2i32_constant(1199; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 5, i32 15>)1200; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 10)1201; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])1202; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 11)1203; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP2]])1204; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 10)1205; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP3]])1206; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 9)1207; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])1208; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)1209; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])1210; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)1211; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])1212; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)1213; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])1214; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)1215; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])1216; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10)1217; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])1218; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10)1219; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])1220; CHECK-NEXT:    ret void1221;1222  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 15>, <2 x i32> %y)1223  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>1224  call void @use_v2i1(<2 x i1> %cmp1)1225  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>1226  call void @use_v2i1(<2 x i1> %cmp2)1227  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>1228  call void @use_v2i1(<2 x i1> %cmp3)1229  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>1230  call void @use_v2i1(<2 x i1> %cmp4)1231  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>1232  call void @use_v2i1(<2 x i1> %cmp5)1233  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>1234  call void @use_v2i1(<2 x i1> %cmp6)1235  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>1236  call void @use_v2i1(<2 x i1> %cmp7)1237  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>1238  call void @use_v2i1(<2 x i1> %cmp8)1239  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>1240  call void @use_v2i1(<2 x i1> %cmp9)1241  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>1242  call void @use_v2i1(<2 x i1> %cmp10)1243  ret void1244}1245 1246; Test cases from PR628981247 1248define i1 @smin_or_bitwise(i32 %x) {1249; CHECK-LABEL: @smin_or_bitwise(1250; CHECK-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 1)1251; CHECK-NEXT:    [[LOBIT:%.*]] = or i32 [[COND]], [[X]]1252; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp slt i32 [[LOBIT]], 01253; CHECK-NEXT:    ret i1 [[TOBOOL]]1254;1255  %cond = tail call i32 @llvm.smin.i32(i32 %x, i32 1)1256  %lobit = or i32 %cond, %x1257  %tobool = icmp slt i32 %lobit, 01258  ret i1 %tobool1259}1260 1261define i1 @smin_and_bitwise(i32 %x) {1262; CHECK-LABEL: @smin_and_bitwise(1263; CHECK-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 1)1264; CHECK-NEXT:    [[LOBIT:%.*]] = and i32 [[COND]], [[X]]1265; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp slt i32 [[LOBIT]], 01266; CHECK-NEXT:    ret i1 [[TOBOOL]]1267;1268  %cond = tail call i32 @llvm.smin.i32(i32 %x, i32 1)1269  %lobit = and i32 %cond, %x1270  %tobool = icmp slt i32 %lobit, 01271  ret i1 %tobool1272}1273 1274; try to fold icmp eq smin(X, Y), Z1275; pre-condition X != Z1276; X < Z fail1277; swap X and Y1278; pre-condition Y != Z fail1279; Y < Z fail1280define i1 @eq_smin_nofold(i32 %x) {1281; CHECK-LABEL: @eq_smin_nofold(1282; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[X:%.*]], 51283; CHECK-NEXT:    call void @llvm.assume(i1 [[COND]])1284; CHECK-NEXT:    [[MINV:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X]], i32 5)1285; CHECK-NEXT:    [[RET:%.*]] = icmp eq i32 [[MINV]], 51286; CHECK-NEXT:    ret i1 [[RET]]1287;1288  %cond = icmp ne i32 %x, 51289  call void @llvm.assume(i1 %cond)1290  %minv = tail call i32 @llvm.smin.i32(i32 %x, i32 5)1291  %ret = icmp eq i32 %minv, 51292  ret i1 %ret1293}1294 1295declare void @llvm.assume(i1)1296declare i32 @llvm.smin.i32(i32, i32)1297declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)1298