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