brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.0 KiB · 8650b89 Raw
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