737 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; This is a specialization of generic folds for min/max values targeted to the5; 'null' ptr constant.6; Related tests for non-pointer types should be included in another file.7 8; There are 6 basic patterns (or 3 with DeMorganized equivalent) with9; 2 (commute logic op) *10; 2 (swap compare operands) *11; variations for a total of 24 tests.12 13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14;15; (X == null) && (X > Y) --> false16;17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18 19define i1 @ugt_and_min(ptr %x, ptr %y) {20; CHECK-LABEL: @ugt_and_min(21; CHECK-NEXT: ret i1 false22;23 %cmp = icmp ugt ptr %x, %y24 %cmpeq = icmp eq ptr %x, null25 %r = and i1 %cmp, %cmpeq26 ret i1 %r27}28 29define i1 @ugt_and_min_logical(ptr %x, ptr %y) {30; CHECK-LABEL: @ugt_and_min_logical(31; CHECK-NEXT: ret i1 false32;33 %cmp = icmp ugt ptr %x, %y34 %cmpeq = icmp eq ptr %x, null35 %r = select i1 %cmp, i1 %cmpeq, i1 false36 ret i1 %r37}38 39define i1 @ugt_and_min_commute(ptr %x, ptr %y) {40; CHECK-LABEL: @ugt_and_min_commute(41; CHECK-NEXT: ret i1 false42;43 %cmp = icmp ugt ptr %x, %y44 %cmpeq = icmp eq ptr %x, null45 %r = and i1 %cmpeq, %cmp46 ret i1 %r47}48 49define i1 @ugt_and_min_commute_logical(ptr %x, ptr %y) {50; CHECK-LABEL: @ugt_and_min_commute_logical(51; CHECK-NEXT: ret i1 false52;53 %cmp = icmp ugt ptr %x, %y54 %cmpeq = icmp eq ptr %x, null55 %r = select i1 %cmpeq, i1 %cmp, i1 false56 ret i1 %r57}58 59define i1 @ugt_swap_and_min(ptr %x, ptr %y) {60; CHECK-LABEL: @ugt_swap_and_min(61; CHECK-NEXT: ret i1 false62;63 %cmp = icmp ult ptr %y, %x64 %cmpeq = icmp eq ptr %x, null65 %r = and i1 %cmp, %cmpeq66 ret i1 %r67}68 69define i1 @ugt_swap_and_min_logical(ptr %x, ptr %y) {70; CHECK-LABEL: @ugt_swap_and_min_logical(71; CHECK-NEXT: ret i1 false72;73 %cmp = icmp ult ptr %y, %x74 %cmpeq = icmp eq ptr %x, null75 %r = select i1 %cmp, i1 %cmpeq, i1 false76 ret i1 %r77}78 79define i1 @ugt_swap_and_min_commute(ptr %x, ptr %y) {80; CHECK-LABEL: @ugt_swap_and_min_commute(81; CHECK-NEXT: ret i1 false82;83 %cmp = icmp ult ptr %y, %x84 %cmpeq = icmp eq ptr %x, null85 %r = and i1 %cmpeq, %cmp86 ret i1 %r87}88 89define i1 @ugt_swap_and_min_commute_logical(ptr %x, ptr %y) {90; CHECK-LABEL: @ugt_swap_and_min_commute_logical(91; CHECK-NEXT: ret i1 false92;93 %cmp = icmp ult ptr %y, %x94 %cmpeq = icmp eq ptr %x, null95 %r = select i1 %cmpeq, i1 %cmp, i1 false96 ret i1 %r97}98 99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100;101; (X != null) || (X <= Y) --> true102;103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104 105define i1 @ule_or_not_min(ptr %x, ptr %y) {106; CHECK-LABEL: @ule_or_not_min(107; CHECK-NEXT: ret i1 true108;109 %cmp = icmp ule ptr %x, %y110 %cmpeq = icmp ne ptr %x, null111 %r = or i1 %cmp, %cmpeq112 ret i1 %r113}114 115define i1 @ule_or_not_min_logical(ptr %x, ptr %y) {116; CHECK-LABEL: @ule_or_not_min_logical(117; CHECK-NEXT: ret i1 true118;119 %cmp = icmp ule ptr %x, %y120 %cmpeq = icmp ne ptr %x, null121 %r = select i1 %cmp, i1 true, i1 %cmpeq122 ret i1 %r123}124 125define i1 @ule_or_not_min_commute(ptr %x, ptr %y) {126; CHECK-LABEL: @ule_or_not_min_commute(127; CHECK-NEXT: ret i1 true128;129 %cmp = icmp ule ptr %x, %y130 %cmpeq = icmp ne ptr %x, null131 %r = or i1 %cmpeq, %cmp132 ret i1 %r133}134 135define i1 @ule_or_not_min_commute_logical(ptr %x, ptr %y) {136; CHECK-LABEL: @ule_or_not_min_commute_logical(137; CHECK-NEXT: ret i1 true138;139 %cmp = icmp ule ptr %x, %y140 %cmpeq = icmp ne ptr %x, null141 %r = select i1 %cmpeq, i1 true, i1 %cmp142 ret i1 %r143}144 145define i1 @ule_swap_or_not_min(ptr %x, ptr %y) {146; CHECK-LABEL: @ule_swap_or_not_min(147; CHECK-NEXT: ret i1 true148;149 %cmp = icmp uge ptr %y, %x150 %cmpeq = icmp ne ptr %x, null151 %r = or i1 %cmp, %cmpeq152 ret i1 %r153}154 155define i1 @ule_swap_or_not_min_logical(ptr %x, ptr %y) {156; CHECK-LABEL: @ule_swap_or_not_min_logical(157; CHECK-NEXT: ret i1 true158;159 %cmp = icmp uge ptr %y, %x160 %cmpeq = icmp ne ptr %x, null161 %r = select i1 %cmp, i1 true, i1 %cmpeq162 ret i1 %r163}164 165define i1 @ule_swap_or_not_min_commute(ptr %x, ptr %y) {166; CHECK-LABEL: @ule_swap_or_not_min_commute(167; CHECK-NEXT: ret i1 true168;169 %cmp = icmp uge ptr %y, %x170 %cmpeq = icmp ne ptr %x, null171 %r = or i1 %cmpeq, %cmp172 ret i1 %r173}174 175define i1 @ule_swap_or_not_min_commute_logical(ptr %x, ptr %y) {176; CHECK-LABEL: @ule_swap_or_not_min_commute_logical(177; CHECK-NEXT: ret i1 true178;179 %cmp = icmp uge ptr %y, %x180 %cmpeq = icmp ne ptr %x, null181 %r = select i1 %cmpeq, i1 true, i1 %cmp182 ret i1 %r183}184 185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;186;187; (X == null) && (X <= Y) --> X == null188;189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;190 191define i1 @ule_and_min(ptr %x, ptr %y) {192; CHECK-LABEL: @ule_and_min(193; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null194; CHECK-NEXT: ret i1 [[CMPEQ]]195;196 %cmp = icmp ule ptr %x, %y197 %cmpeq = icmp eq ptr %x, null198 %r = and i1 %cmp, %cmpeq199 ret i1 %r200}201 202define i1 @ule_and_min_logical(ptr %x, ptr %y) {203; CHECK-LABEL: @ule_and_min_logical(204; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null205; CHECK-NEXT: ret i1 [[CMPEQ]]206;207 %cmp = icmp ule ptr %x, %y208 %cmpeq = icmp eq ptr %x, null209 %r = select i1 %cmp, i1 %cmpeq, i1 false210 ret i1 %r211}212 213define i1 @ule_and_min_commute(ptr %x, ptr %y) {214; CHECK-LABEL: @ule_and_min_commute(215; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null216; CHECK-NEXT: ret i1 [[CMPEQ]]217;218 %cmp = icmp ule ptr %x, %y219 %cmpeq = icmp eq ptr %x, null220 %r = and i1 %cmpeq, %cmp221 ret i1 %r222}223 224define i1 @ule_and_min_commute_logical(ptr %x, ptr %y) {225; CHECK-LABEL: @ule_and_min_commute_logical(226; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null227; CHECK-NEXT: ret i1 [[CMPEQ]]228;229 %cmp = icmp ule ptr %x, %y230 %cmpeq = icmp eq ptr %x, null231 %r = select i1 %cmpeq, i1 %cmp, i1 false232 ret i1 %r233}234 235define i1 @ule_swap_and_min(ptr %x, ptr %y) {236; CHECK-LABEL: @ule_swap_and_min(237; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null238; CHECK-NEXT: ret i1 [[CMPEQ]]239;240 %cmp = icmp uge ptr %y, %x241 %cmpeq = icmp eq ptr %x, null242 %r = and i1 %cmp, %cmpeq243 ret i1 %r244}245 246define i1 @ule_swap_and_min_logical(ptr %x, ptr %y) {247; CHECK-LABEL: @ule_swap_and_min_logical(248; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null249; CHECK-NEXT: ret i1 [[CMPEQ]]250;251 %cmp = icmp uge ptr %y, %x252 %cmpeq = icmp eq ptr %x, null253 %r = select i1 %cmp, i1 %cmpeq, i1 false254 ret i1 %r255}256 257define i1 @ule_swap_and_min_commute(ptr %x, ptr %y) {258; CHECK-LABEL: @ule_swap_and_min_commute(259; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null260; CHECK-NEXT: ret i1 [[CMPEQ]]261;262 %cmp = icmp uge ptr %y, %x263 %cmpeq = icmp eq ptr %x, null264 %r = and i1 %cmpeq, %cmp265 ret i1 %r266}267 268define i1 @ule_swap_and_min_commute_logical(ptr %x, ptr %y) {269; CHECK-LABEL: @ule_swap_and_min_commute_logical(270; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null271; CHECK-NEXT: ret i1 [[CMPEQ]]272;273 %cmp = icmp uge ptr %y, %x274 %cmpeq = icmp eq ptr %x, null275 %r = select i1 %cmpeq, i1 %cmp, i1 false276 ret i1 %r277}278 279;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;280;281; (X == null) || (X <= Y) --> X <= Y282;283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;284 285define i1 @ule_or_min(ptr %x, ptr %y) {286; CHECK-LABEL: @ule_or_min(287; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]288; CHECK-NEXT: ret i1 [[CMP]]289;290 %cmp = icmp ule ptr %x, %y291 %cmpeq = icmp eq ptr %x, null292 %r = or i1 %cmp, %cmpeq293 ret i1 %r294}295 296define i1 @ule_or_min_logical(ptr %x, ptr %y) {297; CHECK-LABEL: @ule_or_min_logical(298; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]299; CHECK-NEXT: ret i1 [[CMP]]300;301 %cmp = icmp ule ptr %x, %y302 %cmpeq = icmp eq ptr %x, null303 %r = select i1 %cmp, i1 true, i1 %cmpeq304 ret i1 %r305}306 307define i1 @ule_or_min_commute(ptr %x, ptr %y) {308; CHECK-LABEL: @ule_or_min_commute(309; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]310; CHECK-NEXT: ret i1 [[CMP]]311;312 %cmp = icmp ule ptr %x, %y313 %cmpeq = icmp eq ptr %x, null314 %r = or i1 %cmpeq, %cmp315 ret i1 %r316}317 318define i1 @ule_or_min_commute_logical(ptr %x, ptr %y) {319; CHECK-LABEL: @ule_or_min_commute_logical(320; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]321; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X]], null322; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]323; CHECK-NEXT: ret i1 [[R]]324;325 %cmp = icmp ule ptr %x, %y326 %cmpeq = icmp eq ptr %x, null327 %r = select i1 %cmpeq, i1 true, i1 %cmp328 ret i1 %r329}330 331define i1 @ule_swap_or_min(ptr %x, ptr %y) {332; CHECK-LABEL: @ule_swap_or_min(333; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]334; CHECK-NEXT: ret i1 [[CMP]]335;336 %cmp = icmp uge ptr %y, %x337 %cmpeq = icmp eq ptr %x, null338 %r = or i1 %cmp, %cmpeq339 ret i1 %r340}341 342define i1 @ule_swap_or_min_logical(ptr %x, ptr %y) {343; CHECK-LABEL: @ule_swap_or_min_logical(344; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]345; CHECK-NEXT: ret i1 [[CMP]]346;347 %cmp = icmp uge ptr %y, %x348 %cmpeq = icmp eq ptr %x, null349 %r = select i1 %cmp, i1 true, i1 %cmpeq350 ret i1 %r351}352 353define i1 @ule_swap_or_min_commute(ptr %x, ptr %y) {354; CHECK-LABEL: @ule_swap_or_min_commute(355; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]356; CHECK-NEXT: ret i1 [[CMP]]357;358 %cmp = icmp uge ptr %y, %x359 %cmpeq = icmp eq ptr %x, null360 %r = or i1 %cmpeq, %cmp361 ret i1 %r362}363 364define i1 @ule_swap_or_min_commute_logical(ptr %x, ptr %y) {365; CHECK-LABEL: @ule_swap_or_min_commute_logical(366; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]367; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X]], null368; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]369; CHECK-NEXT: ret i1 [[R]]370;371 %cmp = icmp uge ptr %y, %x372 %cmpeq = icmp eq ptr %x, null373 %r = select i1 %cmpeq, i1 true, i1 %cmp374 ret i1 %r375}376 377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;378;379; (X != null) && (X > Y) --> X > Y380;381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;382 383define i1 @ugt_and_not_min(ptr %x, ptr %y) {384; CHECK-LABEL: @ugt_and_not_min(385; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]386; CHECK-NEXT: ret i1 [[CMP]]387;388 %cmp = icmp ugt ptr %x, %y389 %cmpeq = icmp ne ptr %x, null390 %r = and i1 %cmp, %cmpeq391 ret i1 %r392}393 394define i1 @ugt_and_not_min_logical(ptr %x, ptr %y) {395; CHECK-LABEL: @ugt_and_not_min_logical(396; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]397; CHECK-NEXT: ret i1 [[CMP]]398;399 %cmp = icmp ugt ptr %x, %y400 %cmpeq = icmp ne ptr %x, null401 %r = select i1 %cmp, i1 %cmpeq, i1 false402 ret i1 %r403}404 405define i1 @ugt_and_not_min_commute(ptr %x, ptr %y) {406; CHECK-LABEL: @ugt_and_not_min_commute(407; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]408; CHECK-NEXT: ret i1 [[CMP]]409;410 %cmp = icmp ugt ptr %x, %y411 %cmpeq = icmp ne ptr %x, null412 %r = and i1 %cmpeq, %cmp413 ret i1 %r414}415 416define i1 @ugt_and_not_min_commute_logical(ptr %x, ptr %y) {417; CHECK-LABEL: @ugt_and_not_min_commute_logical(418; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]419; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X]], null420; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false421; CHECK-NEXT: ret i1 [[R]]422;423 %cmp = icmp ugt ptr %x, %y424 %cmpeq = icmp ne ptr %x, null425 %r = select i1 %cmpeq, i1 %cmp, i1 false426 ret i1 %r427}428 429define i1 @ugt_swap_and_not_min(ptr %x, ptr %y) {430; CHECK-LABEL: @ugt_swap_and_not_min(431; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]432; CHECK-NEXT: ret i1 [[CMP]]433;434 %cmp = icmp ult ptr %y, %x435 %cmpeq = icmp ne ptr %x, null436 %r = and i1 %cmp, %cmpeq437 ret i1 %r438}439 440define i1 @ugt_swap_and_not_min_logical(ptr %x, ptr %y) {441; CHECK-LABEL: @ugt_swap_and_not_min_logical(442; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]443; CHECK-NEXT: ret i1 [[CMP]]444;445 %cmp = icmp ult ptr %y, %x446 %cmpeq = icmp ne ptr %x, null447 %r = select i1 %cmp, i1 %cmpeq, i1 false448 ret i1 %r449}450 451define i1 @ugt_swap_and_not_min_commute(ptr %x, ptr %y) {452; CHECK-LABEL: @ugt_swap_and_not_min_commute(453; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]454; CHECK-NEXT: ret i1 [[CMP]]455;456 %cmp = icmp ult ptr %y, %x457 %cmpeq = icmp ne ptr %x, null458 %r = and i1 %cmpeq, %cmp459 ret i1 %r460}461 462define i1 @ugt_swap_and_not_min_commute_logical(ptr %x, ptr %y) {463; CHECK-LABEL: @ugt_swap_and_not_min_commute_logical(464; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]465; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X]], null466; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false467; CHECK-NEXT: ret i1 [[R]]468;469 %cmp = icmp ult ptr %y, %x470 %cmpeq = icmp ne ptr %x, null471 %r = select i1 %cmpeq, i1 %cmp, i1 false472 ret i1 %r473}474 475;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;476;477; (X != null) || (X > Y) --> X != null478;479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;480 481define i1 @ugt_or_not_min(ptr %x, ptr %y) {482; CHECK-LABEL: @ugt_or_not_min(483; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null484; CHECK-NEXT: ret i1 [[CMPEQ]]485;486 %cmp = icmp ugt ptr %x, %y487 %cmpeq = icmp ne ptr %x, null488 %r = or i1 %cmp, %cmpeq489 ret i1 %r490}491 492define i1 @ugt_or_not_min_logical(ptr %x, ptr %y) {493; CHECK-LABEL: @ugt_or_not_min_logical(494; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null495; CHECK-NEXT: ret i1 [[CMPEQ]]496;497 %cmp = icmp ugt ptr %x, %y498 %cmpeq = icmp ne ptr %x, null499 %r = select i1 %cmp, i1 true, i1 %cmpeq500 ret i1 %r501}502 503define i1 @ugt_or_not_min_commute(ptr %x, ptr %y) {504; CHECK-LABEL: @ugt_or_not_min_commute(505; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null506; CHECK-NEXT: ret i1 [[CMPEQ]]507;508 %cmp = icmp ugt ptr %x, %y509 %cmpeq = icmp ne ptr %x, null510 %r = or i1 %cmpeq, %cmp511 ret i1 %r512}513 514define i1 @ugt_or_not_min_commute_logical(ptr %x, ptr %y) {515; CHECK-LABEL: @ugt_or_not_min_commute_logical(516; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null517; CHECK-NEXT: ret i1 [[CMPEQ]]518;519 %cmp = icmp ugt ptr %x, %y520 %cmpeq = icmp ne ptr %x, null521 %r = select i1 %cmpeq, i1 true, i1 %cmp522 ret i1 %r523}524 525define i1 @ugt_swap_or_not_min(ptr %x, ptr %y) {526; CHECK-LABEL: @ugt_swap_or_not_min(527; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null528; CHECK-NEXT: ret i1 [[CMPEQ]]529;530 %cmp = icmp ult ptr %y, %x531 %cmpeq = icmp ne ptr %x, null532 %r = or i1 %cmp, %cmpeq533 ret i1 %r534}535 536define i1 @ugt_swap_or_not_min_logical(ptr %x, ptr %y) {537; CHECK-LABEL: @ugt_swap_or_not_min_logical(538; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null539; CHECK-NEXT: ret i1 [[CMPEQ]]540;541 %cmp = icmp ult ptr %y, %x542 %cmpeq = icmp ne ptr %x, null543 %r = select i1 %cmp, i1 true, i1 %cmpeq544 ret i1 %r545}546 547define i1 @ugt_swap_or_not_min_commute(ptr %x, ptr %y) {548; CHECK-LABEL: @ugt_swap_or_not_min_commute(549; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null550; CHECK-NEXT: ret i1 [[CMPEQ]]551;552 %cmp = icmp ult ptr %y, %x553 %cmpeq = icmp ne ptr %x, null554 %r = or i1 %cmpeq, %cmp555 ret i1 %r556}557 558define i1 @ugt_swap_or_not_min_commute_logical(ptr %x, ptr %y) {559; CHECK-LABEL: @ugt_swap_or_not_min_commute_logical(560; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null561; CHECK-NEXT: ret i1 [[CMPEQ]]562;563 %cmp = icmp ult ptr %y, %x564 %cmpeq = icmp ne ptr %x, null565 %r = select i1 %cmpeq, i1 true, i1 %cmp566 ret i1 %r567}568 569define i1 @sgt_and_min(ptr %x, ptr %y) {570; CHECK-LABEL: @sgt_and_min(571; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null572; CHECK-NEXT: [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null573; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]574; CHECK-NEXT: ret i1 [[R]]575;576 %cmp = icmp sgt ptr %x, %y577 %cmpeq = icmp eq ptr %x, null578 %r = and i1 %cmp, %cmpeq579 ret i1 %r580}581 582define i1 @sgt_and_min_logical(ptr %x, ptr %y) {583; CHECK-LABEL: @sgt_and_min_logical(584; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null585; CHECK-NEXT: [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null586; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]587; CHECK-NEXT: ret i1 [[R]]588;589 %cmp = icmp sgt ptr %x, %y590 %cmpeq = icmp eq ptr %x, null591 %r = select i1 %cmp, i1 %cmpeq, i1 false592 ret i1 %r593}594 595define i1 @sgt_and_min_logical_samesign(ptr %x, ptr %y) {596; CHECK-LABEL: @sgt_and_min_logical_samesign(597; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null598; CHECK-NEXT: [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null599; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]600; CHECK-NEXT: ret i1 [[R]]601;602 %cmp = icmp sgt ptr %x, %y603 %cmpeq = icmp samesign eq ptr %x, null604 %r = select i1 %cmp, i1 %cmpeq, i1 false605 ret i1 %r606}607 608define i1 @sle_or_not_min(ptr %x, ptr %y) {609; CHECK-LABEL: @sle_or_not_min(610; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null611; CHECK-NEXT: [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null612; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]613; CHECK-NEXT: ret i1 [[R]]614;615 %cmp = icmp sle ptr %x, %y616 %cmpeq = icmp ne ptr %x, null617 %r = or i1 %cmp, %cmpeq618 ret i1 %r619}620 621define i1 @sle_or_not_min_logical(ptr %x, ptr %y) {622; CHECK-LABEL: @sle_or_not_min_logical(623; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null624; CHECK-NEXT: [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null625; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]626; CHECK-NEXT: ret i1 [[R]]627;628 %cmp = icmp sle ptr %x, %y629 %cmpeq = icmp ne ptr %x, null630 %r = select i1 %cmp, i1 true, i1 %cmpeq631 ret i1 %r632}633 634define i1 @sle_and_min(ptr %x, ptr %y) {635; CHECK-LABEL: @sle_and_min(636; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null637; CHECK-NEXT: [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null638; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]639; CHECK-NEXT: ret i1 [[R]]640;641 %cmp = icmp sle ptr %x, %y642 %cmpeq = icmp eq ptr %x, null643 %r = and i1 %cmp, %cmpeq644 ret i1 %r645}646 647define i1 @sle_and_min_logical(ptr %x, ptr %y) {648; CHECK-LABEL: @sle_and_min_logical(649; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null650; CHECK-NEXT: [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null651; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]652; CHECK-NEXT: ret i1 [[R]]653;654 %cmp = icmp sle ptr %x, %y655 %cmpeq = icmp eq ptr %x, null656 %r = select i1 %cmp, i1 %cmpeq, i1 false657 ret i1 %r658}659 660define i1 @sgt_and_not_min(ptr %x, ptr %y) {661; CHECK-LABEL: @sgt_and_not_min(662; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr [[X:%.*]], [[Y:%.*]]663; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X]], null664; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]665; CHECK-NEXT: ret i1 [[R]]666;667 %cmp = icmp sgt ptr %x, %y668 %cmpeq = icmp ne ptr %x, null669 %r = and i1 %cmp, %cmpeq670 ret i1 %r671}672 673define i1 @sgt_and_not_min_logical(ptr %x, ptr %y) {674; CHECK-LABEL: @sgt_and_not_min_logical(675; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr [[X:%.*]], [[Y:%.*]]676; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X]], null677; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]678; CHECK-NEXT: ret i1 [[R]]679;680 %cmp = icmp sgt ptr %x, %y681 %cmpeq = icmp ne ptr %x, null682 %r = select i1 %cmp, i1 %cmpeq, i1 false683 ret i1 %r684}685 686define i1 @sgt_or_not_min(ptr %x, ptr %y) {687; CHECK-LABEL: @sgt_or_not_min(688; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null689; CHECK-NEXT: [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null690; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]691; CHECK-NEXT: ret i1 [[R]]692;693 %cmp = icmp sgt ptr %x, %y694 %cmpeq = icmp ne ptr %x, null695 %r = or i1 %cmp, %cmpeq696 ret i1 %r697}698 699define i1 @sgt_or_not_min_logical(ptr %x, ptr %y) {700; CHECK-LABEL: @sgt_or_not_min_logical(701; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null702; CHECK-NEXT: [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null703; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]704; CHECK-NEXT: ret i1 [[R]]705;706 %cmp = icmp sgt ptr %x, %y707 %cmpeq = icmp ne ptr %x, null708 %r = select i1 %cmp, i1 true, i1 %cmpeq709 ret i1 %r710}711 712define i1 @slt_and_min(ptr %a, ptr %b) {713; CHECK-LABEL: @slt_and_min(714; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[A:%.*]], null715; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt ptr [[B:%.*]], null716; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]717; CHECK-NEXT: ret i1 [[R]]718;719 %cmpeq = icmp eq ptr %a, null720 %cmp = icmp slt ptr %a, %b721 %r = and i1 %cmpeq, %cmp722 ret i1 %r723}724 725define i1 @slt_and_min_logical(ptr %a, ptr %b) {726; CHECK-LABEL: @slt_and_min_logical(727; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[A:%.*]], null728; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt ptr [[B:%.*]], null729; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[TMP1]], i1 false730; CHECK-NEXT: ret i1 [[R]]731;732 %cmpeq = icmp eq ptr %a, null733 %cmp = icmp slt ptr %a, %b734 %r = select i1 %cmpeq, i1 %cmp, i1 false735 ret i1 %r736}737