1007 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare void @use(i8)5 6define i1 @set_low_bit_mask_eq(i8 %x) {7; CHECK-LABEL: @set_low_bit_mask_eq(8; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -29; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 1810; CHECK-NEXT: ret i1 [[CMP]]11;12 %sub = or i8 %x, 113 %cmp = icmp eq i8 %sub, 1914 ret i1 %cmp15}16 17define <2 x i1> @set_low_bit_mask_ne(<2 x i8> %x) {18; CHECK-LABEL: @set_low_bit_mask_ne(19; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i8> [[X:%.*]], splat (i8 -4)20; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[TMP1]], splat (i8 16)21; CHECK-NEXT: ret <2 x i1> [[CMP]]22;23 %sub = or <2 x i8> %x, <i8 3, i8 3>24 %cmp = icmp ne <2 x i8> %sub, <i8 19, i8 19>25 ret <2 x i1> %cmp26}27 28define i1 @set_low_bit_mask_ugt(i8 %x) {29; CHECK-LABEL: @set_low_bit_mask_ugt(30; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 1931; CHECK-NEXT: ret i1 [[CMP]]32;33 %sub = or i8 %x, 334 %cmp = icmp ugt i8 %sub, 1935 ret i1 %cmp36}37 38define i1 @set_low_bit_mask_ult(i8 %x) {39; CHECK-LABEL: @set_low_bit_mask_ult(40; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 341; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[SUB]], 1942; CHECK-NEXT: ret i1 [[CMP]]43;44 %sub = or i8 %x, 345 %cmp = icmp ult i8 %sub, 1946 ret i1 %cmp47}48 49define i1 @set_low_bit_mask_uge(i8 %x) {50; CHECK-LABEL: @set_low_bit_mask_uge(51; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 1952; CHECK-NEXT: ret i1 [[CMP]]53;54 %sub = or i8 %x, 355 %cmp = icmp uge i8 %sub, 2056 ret i1 %cmp57}58 59define i1 @set_low_bit_mask_ule(i8 %x) {60; CHECK-LABEL: @set_low_bit_mask_ule(61; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 362; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[SUB]], 1963; CHECK-NEXT: ret i1 [[CMP]]64;65 %sub = or i8 %x, 366 %cmp = icmp ule i8 %sub, 1867 ret i1 %cmp68}69 70define i1 @set_low_bit_mask_sgt(i8 %x) {71; CHECK-LABEL: @set_low_bit_mask_sgt(72; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 373; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[SUB]], 2074; CHECK-NEXT: ret i1 [[CMP]]75;76 %sub = or i8 %x, 377 %cmp = icmp sgt i8 %sub, 2078 ret i1 %cmp79}80 81define i1 @set_low_bit_mask_slt(i8 %x) {82; CHECK-LABEL: @set_low_bit_mask_slt(83; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 1584; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], 1985; CHECK-NEXT: ret i1 [[CMP]]86;87 %sub = or i8 %x, 1588 %cmp = icmp slt i8 %sub, 1989 ret i1 %cmp90}91 92define i1 @set_low_bit_mask_sge(i8 %x) {93; CHECK-LABEL: @set_low_bit_mask_sge(94; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 3195; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[SUB]], 5096; CHECK-NEXT: ret i1 [[CMP]]97;98 %sub = or i8 %x, 3199 %cmp = icmp sge i8 %sub, 51100 ret i1 %cmp101}102 103define i1 @set_low_bit_mask_sle(i8 %x) {104; CHECK-LABEL: @set_low_bit_mask_sle(105; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 63106; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], 69107; CHECK-NEXT: ret i1 [[CMP]]108;109 %sub = or i8 %x, 63110 %cmp = icmp sle i8 %sub, 68111 ret i1 %cmp112}113 114define i1 @eq_const_mask(i8 %x, i8 %y) {115; CHECK-LABEL: @eq_const_mask(116; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]117; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], -43118; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP2]], 0119; CHECK-NEXT: ret i1 [[CMP]]120;121 %b0 = or i8 %x, 42122 %b1 = or i8 %y, 42123 %cmp = icmp eq i8 %b0, %b1124 ret i1 %cmp125}126 127define <2 x i1> @ne_const_mask(<2 x i8> %x, <2 x i8> %y) {128; CHECK-LABEL: @ne_const_mask(129; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]130; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], <i8 105, i8 -6>131; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[TMP2]], zeroinitializer132; CHECK-NEXT: ret <2 x i1> [[CMP]]133;134 %b0 = or <2 x i8> %x, <i8 150, i8 5>135 %b1 = or <2 x i8> %y, <i8 150, i8 5>136 %cmp = icmp ne <2 x i8> %b0, %b1137 ret <2 x i1> %cmp138}139 140; negative test - predicate141 142define i1 @eq_const_mask_not_equality(i8 %x, i8 %y) {143; CHECK-LABEL: @eq_const_mask_not_equality(144; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5145; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 5146; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[B0]], [[B1]]147; CHECK-NEXT: ret i1 [[CMP]]148;149 %b0 = or i8 %x, 5150 %b1 = or i8 %y, 5151 %cmp = icmp sgt i8 %b0, %b1152 ret i1 %cmp153}154 155; negative test - mismatched constants156 157define i1 @eq_const_mask_not_same(i8 %x, i8 %y) {158; CHECK-LABEL: @eq_const_mask_not_same(159; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5160; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 6161; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B0]], [[B1]]162; CHECK-NEXT: ret i1 [[CMP]]163;164 %b0 = or i8 %x, 5165 %b1 = or i8 %y, 6166 %cmp = icmp eq i8 %b0, %b1167 ret i1 %cmp168}169 170; negative test - mismatched logic171 172define i1 @eq_const_mask_wrong_opcode(i8 %x, i8 %y) {173; CHECK-LABEL: @eq_const_mask_wrong_opcode(174; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5175; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], [[B0]]176; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 5177; CHECK-NEXT: ret i1 [[CMP]]178;179 %b0 = or i8 %x, 5180 %b1 = xor i8 %y, 5181 %cmp = icmp eq i8 %b0, %b1182 ret i1 %cmp183}184 185; negative test - no extra uses186 187define i1 @eq_const_mask_use1(i8 %x, i8 %y) {188; CHECK-LABEL: @eq_const_mask_use1(189; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5190; CHECK-NEXT: call void @use(i8 [[B0]])191; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 5192; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B0]], [[B1]]193; CHECK-NEXT: ret i1 [[CMP]]194;195 %b0 = or i8 %x, 5196 call void @use(i8 %b0)197 %b1 = or i8 %y, 5198 %cmp = icmp eq i8 %b0, %b1199 ret i1 %cmp200}201 202; negative test - no extra uses203 204define i1 @eq_const_mask_use2(i8 %x, i8 %y) {205; CHECK-LABEL: @eq_const_mask_use2(206; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5207; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 5208; CHECK-NEXT: call void @use(i8 [[B1]])209; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B0]], [[B1]]210; CHECK-NEXT: ret i1 [[CMP]]211;212 %b0 = or i8 %x, 5213 %b1 = or i8 %y, 5214 call void @use(i8 %b1)215 %cmp = icmp eq i8 %b0, %b1216 ret i1 %cmp217}218 219; (x | (x - 1)) s< 0220 221define <2 x i1> @decrement_slt_0(<2 x i8> %x) {222; CHECK-LABEL: @decrement_slt_0(223; CHECK-NEXT: [[R:%.*]] = icmp slt <2 x i8> [[X:%.*]], splat (i8 1)224; CHECK-NEXT: ret <2 x i1> [[R]]225;226 %dec = add <2 x i8> %x, <i8 -1, i8 -1>227 %or = or <2 x i8> %dec, %x228 %r = icmp slt <2 x i8> %or, zeroinitializer229 ret <2 x i1> %r230}231 232define i1 @decrement_slt_0_commute_use1(i8 %px) {233; CHECK-LABEL: @decrement_slt_0_commute_use1(234; CHECK-NEXT: [[X:%.*]] = mul i8 [[PX:%.*]], 42235; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X]], -1236; CHECK-NEXT: call void @use(i8 [[DEC]])237; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X]], 1238; CHECK-NEXT: ret i1 [[R]]239;240 %x = mul i8 %px, 42 ; thwart complexity-based canonicalization241 %dec = add i8 %x, -1242 call void @use(i8 %dec)243 %or = or i8 %x, %dec244 %r = icmp slt i8 %or, 0245 ret i1 %r246}247 248define i1 @decrement_slt_0_use2(i8 %x) {249; CHECK-LABEL: @decrement_slt_0_use2(250; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1251; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]]252; CHECK-NEXT: call void @use(i8 [[OR]])253; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X]], 1254; CHECK-NEXT: ret i1 [[R]]255;256 %dec = add i8 %x, -1257 %or = or i8 %dec, %x258 call void @use(i8 %or)259 %r = icmp slt i8 %or, 0260 ret i1 %r261}262 263; negative test - wrong cmp constant264 265define i1 @decrement_slt_n1(i8 %x) {266; CHECK-LABEL: @decrement_slt_n1(267; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1268; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]]269; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[OR]], -1270; CHECK-NEXT: ret i1 [[R]]271;272 %dec = add i8 %x, -1273 %or = or i8 %dec, %x274 %r = icmp slt i8 %or, -1275 ret i1 %r276}277 278; negative test - wrong add constant279 280define i1 @not_decrement_slt_0(i8 %x) {281; CHECK-LABEL: @not_decrement_slt_0(282; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -2283; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]]284; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[OR]], 0285; CHECK-NEXT: ret i1 [[R]]286;287 %dec = add i8 %x, -2288 %or = or i8 %dec, %x289 %r = icmp slt i8 %or, 0290 ret i1 %r291}292 293; (x | (x - 1)) s> -1294 295define <2 x i1> @decrement_sgt_n1(<2 x i8> %x) {296; CHECK-LABEL: @decrement_sgt_n1(297; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[X:%.*]], zeroinitializer298; CHECK-NEXT: ret <2 x i1> [[R]]299;300 %dec = add <2 x i8> %x, <i8 -1, i8 -1>301 %or = or <2 x i8> %dec, %x302 %r = icmp sgt <2 x i8> %or, <i8 -1, i8 -1>303 ret <2 x i1> %r304}305 306define i1 @decrement_sgt_n1_commute_use1(i8 %px) {307; CHECK-LABEL: @decrement_sgt_n1_commute_use1(308; CHECK-NEXT: [[X:%.*]] = mul i8 [[PX:%.*]], 42309; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X]], -1310; CHECK-NEXT: call void @use(i8 [[DEC]])311; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X]], 0312; CHECK-NEXT: ret i1 [[R]]313;314 %x = mul i8 %px, 42 ; thwart complexity-based canonicalization315 %dec = add i8 %x, -1316 call void @use(i8 %dec)317 %or = or i8 %x, %dec318 %r = icmp sgt i8 %or, -1319 ret i1 %r320}321 322define i1 @decrement_sgt_n1_use2(i8 %x) {323; CHECK-LABEL: @decrement_sgt_n1_use2(324; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1325; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]]326; CHECK-NEXT: call void @use(i8 [[OR]])327; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X]], 0328; CHECK-NEXT: ret i1 [[R]]329;330 %dec = add i8 %x, -1331 %or = or i8 %dec, %x332 call void @use(i8 %or)333 %r = icmp sgt i8 %or, -1334 ret i1 %r335}336 337; negative test - wrong cmp constant338 339define i1 @decrement_sgt_0(i8 %x) {340; CHECK-LABEL: @decrement_sgt_0(341; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1342; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]]343; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[OR]], 0344; CHECK-NEXT: ret i1 [[R]]345;346 %dec = add i8 %x, -1347 %or = or i8 %dec, %x348 %r = icmp sgt i8 %or, 0349 ret i1 %r350}351 352; negative test - wrong add constant353 354define i1 @not_decrement_sgt_n1(i8 %x) {355; CHECK-LABEL: @not_decrement_sgt_n1(356; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -2357; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]]358; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[OR]], -1359; CHECK-NEXT: ret i1 [[R]]360;361 %dec = add i8 %x, -2362 %or = or i8 %dec, %x363 %r = icmp sgt i8 %or, -1364 ret i1 %r365}366 367define i1 @icmp_or_xor_2_eq(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {368; CHECK-LABEL: @icmp_or_xor_2_eq(369; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]370; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]371; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]]372; CHECK-NEXT: ret i1 [[CMP]]373;374 %xor = xor i64 %x1, %y1375 %xor1 = xor i64 %x2, %y2376 %or = or i64 %xor, %xor1377 %cmp = icmp eq i64 %or, 0378 ret i1 %cmp379}380 381define i1 @icmp_or_xor_2_ne(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {382; CHECK-LABEL: @icmp_or_xor_2_ne(383; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[X1:%.*]], [[Y1:%.*]]384; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[X2:%.*]], [[Y2:%.*]]385; CHECK-NEXT: [[CMP:%.*]] = or i1 [[TMP1]], [[TMP2]]386; CHECK-NEXT: ret i1 [[CMP]]387;388 %xor = xor i64 %x1, %y1389 %xor1 = xor i64 %x2, %y2390 %or = or i64 %xor, %xor1391 %cmp = icmp ne i64 %or, 0392 ret i1 %cmp393}394 395; negative test - wrong cmp constant396 397define i1 @icmp_or_xor_2_eq_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {398; CHECK-LABEL: @icmp_or_xor_2_eq_fail(399; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]]400; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]]401; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]]402; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 1403; CHECK-NEXT: ret i1 [[CMP]]404;405 %xor = xor i64 %x1, %y1406 %xor1 = xor i64 %x2, %y2407 %or = or i64 %xor, %xor1408 %cmp = icmp eq i64 %or, 1409 ret i1 %cmp410}411 412; negative test - wrong cmp constant413 414define i1 @icmp_or_xor_2_ne_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {415; CHECK-LABEL: @icmp_or_xor_2_ne_fail(416; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]]417; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]]418; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]]419; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[OR]], 1420; CHECK-NEXT: ret i1 [[CMP]]421;422 %xor = xor i64 %x1, %y1423 %xor1 = xor i64 %x2, %y2424 %or = or i64 %xor, %xor1425 %cmp = icmp ne i64 %or, 1426 ret i1 %cmp427}428 429; negative test - xor multiuse430 431; NB: This requires more than 1 iteration to simplify. After we432; simplify `%cmp_1 = icmp eq i64 %xor, 0`, `%xor = xor i64 %x1, %y1`433; has one use which allows for complete simplification (rooted on434; `%or1 = or i1 %cmp, %cmp_1` so we don't end up adding it back).435define i1 @icmp_or_xor_2_3_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) "instcombine-no-verify-fixpoint" {436; CHECK-LABEL: @icmp_or_xor_2_3_fail(437; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]]438; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]]439; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]]440; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0441; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[X1]], [[Y1]]442; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]]443; CHECK-NEXT: ret i1 [[OR1]]444;445 %xor = xor i64 %x1, %y1446 %xor1 = xor i64 %x2, %y2447 %or = or i64 %xor, %xor1448 %cmp = icmp eq i64 %or, 0449 %cmp_1 = icmp eq i64 %xor, 0450 %or1 = or i1 %cmp, %cmp_1451 ret i1 %or1452}453 454; negative test - xor multiuse455 456define i1 @icmp_or_xor_2_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) "instcombine-no-verify-fixpoint" {457; CHECK-LABEL: @icmp_or_xor_2_4_fail(458; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]]459; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]]460; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]]461; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0462; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[X2]], [[Y2]]463; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]]464; CHECK-NEXT: ret i1 [[OR1]]465;466 %xor = xor i64 %x1, %y1467 %xor1 = xor i64 %x2, %y2468 %or = or i64 %xor, %xor1469 %cmp = icmp eq i64 %or, 0470 %cmp_1 = icmp eq i64 %xor1, 0471 %or1 = or i1 %cmp, %cmp_1472 ret i1 %or1473}474 475define i1 @icmp_or_xor_3_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {476; CHECK-LABEL: @icmp_or_xor_3_1(477; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]478; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]479; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]480; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]481; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]482; CHECK-NEXT: ret i1 [[CMP]]483;484 %xor = xor i64 %x1, %y1485 %xor1 = xor i64 %x2, %y2486 %or = or i64 %xor, %xor1487 %xor2 = xor i64 %x3, %y3488 %or1 = or i64 %or, %xor2489 %cmp = icmp eq i64 %or1, 0490 ret i1 %cmp491}492 493; negative test - and instead of or494 495define i1 @icmp_or_xor_3_2_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {496; CHECK-LABEL: @icmp_or_xor_3_2_fail(497; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]]498; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]]499; CHECK-NEXT: [[AND:%.*]] = and i64 [[XOR]], [[XOR1]]500; CHECK-NEXT: [[XOR2:%.*]] = xor i64 [[X3:%.*]], [[Y3:%.*]]501; CHECK-NEXT: [[OR1:%.*]] = or i64 [[AND]], [[XOR2]]502; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0503; CHECK-NEXT: ret i1 [[CMP]]504;505 %xor = xor i64 %x1, %y1506 %xor1 = xor i64 %x2, %y2507 %and = and i64 %xor, %xor1508 %xor2 = xor i64 %x3, %y3509 %or1 = or i64 %and, %xor2510 %cmp = icmp eq i64 %or1, 0511 ret i1 %cmp512}513 514define i1 @icmp_or_xor_3_3(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {515; CHECK-LABEL: @icmp_or_xor_3_3(516; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]517; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]518; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]519; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]520; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]521; CHECK-NEXT: ret i1 [[CMP]]522;523 %xor = xor i64 %x1, %y1524 %xor1 = xor i64 %x2, %y2525 %or = or i64 %xor, %xor1526 %xor2 = xor i64 %x3, %y3527 %or1 = or i64 %xor2, %or528 %cmp = icmp eq i64 %or1, 0529 ret i1 %cmp530}531 532; negative test - and instead of or533 534define i1 @icmp_or_xor_3_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {535; CHECK-LABEL: @icmp_or_xor_3_4_fail(536; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]]537; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]]538; CHECK-NEXT: [[AND:%.*]] = and i64 [[XOR]], [[XOR1]]539; CHECK-NEXT: [[XOR2:%.*]] = xor i64 [[X3:%.*]], [[Y3:%.*]]540; CHECK-NEXT: [[OR1:%.*]] = or i64 [[XOR2]], [[AND]]541; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0542; CHECK-NEXT: ret i1 [[CMP]]543;544 %xor = xor i64 %x1, %y1545 %xor1 = xor i64 %x2, %y2546 %and = and i64 %xor, %xor1547 %xor2 = xor i64 %x3, %y3548 %or1 = or i64 %xor2, %and549 %cmp = icmp eq i64 %or1, 0550 ret i1 %cmp551}552 553define i1 @icmp_or_xor_4_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) {554; CHECK-LABEL: @icmp_or_xor_4_1(555; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]556; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]]557; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]558; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]559; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]]560; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]561; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]]562; CHECK-NEXT: ret i1 [[CMP]]563;564 %xor = xor i64 %x1, %y1565 %xor1 = xor i64 %x2, %y2566 %or = or i64 %xor, %xor1567 %xor2 = xor i64 %x3, %y3568 %xor3 = xor i64 %x4, %y4569 %or1 = or i64 %xor2, %xor3570 %or2 = or i64 %or, %or1571 %cmp = icmp eq i64 %or2, 0572 ret i1 %cmp573}574 575define i1 @icmp_or_xor_4_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) {576; CHECK-LABEL: @icmp_or_xor_4_2(577; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]578; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]579; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]580; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]581; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]]582; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]]583; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]]584; CHECK-NEXT: ret i1 [[CMP]]585;586 %xor = xor i64 %x1, %y1587 %xor1 = xor i64 %x2, %y2588 %or = or i64 %xor, %xor1589 %xor2 = xor i64 %x3, %y3590 %xor3 = xor i64 %x4, %y4591 %or1 = or i64 %xor2, %xor3592 %or2 = or i64 %or1, %or593 %cmp = icmp eq i64 %or2, 0594 ret i1 %cmp595}596 597define i1 @icmp_or_sub_2_eq(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {598; CHECK-LABEL: @icmp_or_sub_2_eq(599; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]600; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]601; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]]602; CHECK-NEXT: ret i1 [[CMP]]603;604 %sub = sub i64 %x1, %y1605 %sub1 = sub i64 %x2, %y2606 %or = or i64 %sub, %sub1607 %cmp = icmp eq i64 %or, 0608 ret i1 %cmp609}610 611define i1 @icmp_or_sub_2_ne(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {612; CHECK-LABEL: @icmp_or_sub_2_ne(613; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[X1:%.*]], [[Y1:%.*]]614; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[X2:%.*]], [[Y2:%.*]]615; CHECK-NEXT: [[CMP:%.*]] = or i1 [[TMP1]], [[TMP2]]616; CHECK-NEXT: ret i1 [[CMP]]617;618 %sub = sub i64 %x1, %y1619 %sub1 = sub i64 %x2, %y2620 %or = or i64 %sub, %sub1621 %cmp = icmp ne i64 %or, 0622 ret i1 %cmp623}624 625; negative test - wrong cmp constant626 627define i1 @icmp_or_sub_2_eq_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {628; CHECK-LABEL: @icmp_or_sub_2_eq_fail(629; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]]630; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]]631; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]]632; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 1633; CHECK-NEXT: ret i1 [[CMP]]634;635 %sub = sub i64 %x1, %y1636 %sub1 = sub i64 %x2, %y2637 %or = or i64 %sub, %sub1638 %cmp = icmp eq i64 %or, 1639 ret i1 %cmp640}641 642; negative test - wrong cmp constant643 644define i1 @icmp_or_sub_2_ne_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {645; CHECK-LABEL: @icmp_or_sub_2_ne_fail(646; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]]647; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]]648; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]]649; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[OR]], 1650; CHECK-NEXT: ret i1 [[CMP]]651;652 %sub = sub i64 %x1, %y1653 %sub1 = sub i64 %x2, %y2654 %or = or i64 %sub, %sub1655 %cmp = icmp ne i64 %or, 1656 ret i1 %cmp657}658 659; negative test - sub multiuse660 661define i1 @icmp_or_sub_2_3_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {662; CHECK-LABEL: @icmp_or_sub_2_3_fail(663; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]]664; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]]665; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]]666; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0667; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[SUB]], 1668; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]]669; CHECK-NEXT: ret i1 [[OR1]]670;671 %sub = sub i64 %x1, %y1672 %sub1 = sub i64 %x2, %y2673 %or = or i64 %sub, %sub1674 %cmp = icmp eq i64 %or, 0675 %cmp_1 = icmp eq i64 %sub, 1676 %or1 = or i1 %cmp, %cmp_1677 ret i1 %or1678}679 680; negative test - sub multiuse681 682define i1 @icmp_or_sub_2_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {683; CHECK-LABEL: @icmp_or_sub_2_4_fail(684; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]]685; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]]686; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]]687; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0688; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[SUB1]], 1689; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]]690; CHECK-NEXT: ret i1 [[OR1]]691;692 %sub = sub i64 %x1, %y1693 %sub1 = sub i64 %x2, %y2694 %or = or i64 %sub, %sub1695 %cmp = icmp eq i64 %or, 0696 %cmp_1 = icmp eq i64 %sub1, 1697 %or1 = or i1 %cmp, %cmp_1698 ret i1 %or1699}700 701define i1 @icmp_or_sub_3_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {702; CHECK-LABEL: @icmp_or_sub_3_1(703; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]704; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]705; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]706; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]707; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]708; CHECK-NEXT: ret i1 [[CMP]]709;710 %sub = sub i64 %x1, %y1711 %sub1 = sub i64 %x2, %y2712 %or = or i64 %sub, %sub1713 %sub2 = sub i64 %x3, %y3714 %or1 = or i64 %or, %sub2715 %cmp = icmp eq i64 %or1, 0716 ret i1 %cmp717}718 719; negative test - and instead of or720 721define i1 @icmp_or_sub_3_2_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {722; CHECK-LABEL: @icmp_or_sub_3_2_fail(723; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]]724; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]]725; CHECK-NEXT: [[AND:%.*]] = and i64 [[SUB]], [[SUB1]]726; CHECK-NEXT: [[SUB2:%.*]] = sub i64 [[X3:%.*]], [[Y3:%.*]]727; CHECK-NEXT: [[OR1:%.*]] = or i64 [[AND]], [[SUB2]]728; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0729; CHECK-NEXT: ret i1 [[CMP]]730;731 %sub = sub i64 %x1, %y1732 %sub1 = sub i64 %x2, %y2733 %and = and i64 %sub, %sub1734 %sub2 = sub i64 %x3, %y3735 %or1 = or i64 %and, %sub2736 %cmp = icmp eq i64 %or1, 0737 ret i1 %cmp738}739 740define i1 @icmp_or_sub_3_3(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {741; CHECK-LABEL: @icmp_or_sub_3_3(742; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]743; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]744; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]745; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]746; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]747; CHECK-NEXT: ret i1 [[CMP]]748;749 %sub = sub i64 %x1, %y1750 %sub1 = sub i64 %x2, %y2751 %or = or i64 %sub, %sub1752 %sub2 = sub i64 %x3, %y3753 %or1 = or i64 %sub2, %or754 %cmp = icmp eq i64 %or1, 0755 ret i1 %cmp756}757 758; negative test - and instead of or759 760define i1 @icmp_or_sub_3_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {761; CHECK-LABEL: @icmp_or_sub_3_4_fail(762; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]]763; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]]764; CHECK-NEXT: [[AND:%.*]] = and i64 [[SUB]], [[SUB1]]765; CHECK-NEXT: [[SUB2:%.*]] = sub i64 [[X3:%.*]], [[Y3:%.*]]766; CHECK-NEXT: [[OR1:%.*]] = or i64 [[SUB2]], [[AND]]767; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0768; CHECK-NEXT: ret i1 [[CMP]]769;770 %sub = sub i64 %x1, %y1771 %sub1 = sub i64 %x2, %y2772 %and = and i64 %sub, %sub1773 %sub2 = sub i64 %x3, %y3774 %or1 = or i64 %sub2, %and775 %cmp = icmp eq i64 %or1, 0776 ret i1 %cmp777}778 779define i1 @icmp_or_sub_4_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) {780; CHECK-LABEL: @icmp_or_sub_4_1(781; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]782; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]]783; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]784; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]785; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]]786; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]787; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]]788; CHECK-NEXT: ret i1 [[CMP]]789;790 %sub = sub i64 %x1, %y1791 %sub1 = sub i64 %x2, %y2792 %or = or i64 %sub, %sub1793 %sub2 = sub i64 %x3, %y3794 %sub3 = sub i64 %x4, %y4795 %or1 = or i64 %sub2, %sub3796 %or2 = or i64 %or, %or1797 %cmp = icmp eq i64 %or2, 0798 ret i1 %cmp799}800 801define i1 @icmp_or_sub_4_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) {802; CHECK-LABEL: @icmp_or_sub_4_2(803; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]804; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]805; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]806; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]807; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]]808; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]]809; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]]810; CHECK-NEXT: ret i1 [[CMP]]811;812 %sub = sub i64 %x1, %y1813 %sub1 = sub i64 %x2, %y2814 %or = or i64 %sub, %sub1815 %sub2 = sub i64 %x3, %y3816 %sub3 = sub i64 %x4, %y4817 %or1 = or i64 %sub2, %sub3818 %or2 = or i64 %or1, %or819 %cmp = icmp eq i64 %or2, 0820 ret i1 %cmp821}822 823define i1 @icmp_or_xor_with_sub_2_eq(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {824; CHECK-LABEL: @icmp_or_xor_with_sub_2_eq(825; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]826; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]827; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]]828; CHECK-NEXT: ret i1 [[CMP]]829;830 %xor = xor i64 %x1, %y1831 %sub = sub i64 %x2, %y2832 %or = or i64 %xor, %sub833 %cmp = icmp eq i64 %or, 0834 ret i1 %cmp835}836 837define i1 @icmp_or_xor_with_sub_2_ne(i64 %x1, i64 %y1, i64 %x2, i64 %y2) {838; CHECK-LABEL: @icmp_or_xor_with_sub_2_ne(839; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[X1:%.*]], [[Y1:%.*]]840; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[X2:%.*]], [[Y2:%.*]]841; CHECK-NEXT: [[CMP:%.*]] = or i1 [[TMP1]], [[TMP2]]842; CHECK-NEXT: ret i1 [[CMP]]843;844 %xor = xor i64 %x1, %y1845 %sub = sub i64 %x2, %y2846 %or = or i64 %xor, %sub847 %cmp = icmp ne i64 %or, 0848 ret i1 %cmp849}850 851define i1 @icmp_or_xor_with_sub_3_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {852; CHECK-LABEL: @icmp_or_xor_with_sub_3_1(853; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]854; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]855; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]856; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]857; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]858; CHECK-NEXT: ret i1 [[CMP]]859;860 %xor = xor i64 %x1, %y1861 %xor1 = xor i64 %x2, %y2862 %or = or i64 %xor, %xor1863 %sub1 = sub i64 %x3, %y3864 %or1 = or i64 %or, %sub1865 %cmp = icmp eq i64 %or1, 0866 ret i1 %cmp867}868 869define i1 @icmp_or_xor_with_sub_3_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {870; CHECK-LABEL: @icmp_or_xor_with_sub_3_2(871; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]872; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]873; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]874; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]875; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]876; CHECK-NEXT: ret i1 [[CMP]]877;878 %xor = xor i64 %x1, %y1879 %sub = sub i64 %x2, %y2880 %or = or i64 %xor, %sub881 %xor1 = xor i64 %x3, %y3882 %or1 = or i64 %or, %xor1883 %cmp = icmp eq i64 %or1, 0884 ret i1 %cmp885}886 887define i1 @icmp_or_xor_with_sub_3_3(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {888; CHECK-LABEL: @icmp_or_xor_with_sub_3_3(889; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]890; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]891; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]892; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]893; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]894; CHECK-NEXT: ret i1 [[CMP]]895;896 %xor = xor i64 %x1, %y1897 %sub = sub i64 %x2, %y2898 %or = or i64 %xor, %sub899 %sub1 = sub i64 %x3, %y3900 %or1 = or i64 %or, %sub1901 %cmp = icmp eq i64 %or1, 0902 ret i1 %cmp903}904 905define i1 @icmp_or_xor_with_sub_3_4(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {906; CHECK-LABEL: @icmp_or_xor_with_sub_3_4(907; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]908; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]909; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]910; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]911; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]912; CHECK-NEXT: ret i1 [[CMP]]913;914 %sub = sub i64 %x1, %y1915 %xor = xor i64 %x2, %y2916 %or = or i64 %sub, %xor917 %xor1 = xor i64 %x3, %y3918 %or1 = or i64 %or, %xor1919 %cmp = icmp eq i64 %or1, 0920 ret i1 %cmp921}922 923define i1 @icmp_or_xor_with_sub_3_5(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {924; CHECK-LABEL: @icmp_or_xor_with_sub_3_5(925; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]926; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]927; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]928; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]929; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]930; CHECK-NEXT: ret i1 [[CMP]]931;932 %sub = sub i64 %x1, %y1933 %xor = xor i64 %x2, %y2934 %or = or i64 %sub, %xor935 %sub1 = sub i64 %x3, %y3936 %or1 = or i64 %or, %sub1937 %cmp = icmp eq i64 %or1, 0938 ret i1 %cmp939}940 941define i1 @icmp_or_xor_with_sub_3_6(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) {942; CHECK-LABEL: @icmp_or_xor_with_sub_3_6(943; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]]944; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]]945; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]946; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]]947; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]]948; CHECK-NEXT: ret i1 [[CMP]]949;950 %sub = sub i64 %x1, %y1951 %sub1 = sub i64 %x2, %y2952 %or = or i64 %sub, %sub1953 %xor = xor i64 %x3, %y3954 %or1 = or i64 %or, %xor955 %cmp = icmp eq i64 %or1, 0956 ret i1 %cmp957}958 959 960define i1 @or_disjoint_with_constants(i8 %x) {961; CHECK-LABEL: @or_disjoint_with_constants(962; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 18963; CHECK-NEXT: ret i1 [[CMP]]964;965 %or = or disjoint i8 %x, 1966 %cmp = icmp eq i8 %or, 19967 ret i1 %cmp968}969 970 971define i1 @or_disjoint_with_constants2(i8 %x) {972; CHECK-LABEL: @or_disjoint_with_constants2(973; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], 5974; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X]], 66975; CHECK-NEXT: call void @use(i8 [[OR]])976; CHECK-NEXT: ret i1 [[CMP]]977;978 %or = or disjoint i8 %x, 5979 %cmp = icmp ne i8 %or, 71980 call void @use(i8 %or)981 ret i1 %cmp982}983 984 985define i1 @or_disjoint_with_constants_fail_missing_const1(i8 %x, i8 %y) {986; CHECK-LABEL: @or_disjoint_with_constants_fail_missing_const1(987; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], [[Y:%.*]]988; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 19989; CHECK-NEXT: ret i1 [[CMP]]990;991 %or = or disjoint i8 %x, %y992 %cmp = icmp eq i8 %or, 19993 ret i1 %cmp994}995 996define i1 @or_disjoint_with_constants_fail_missing_const2(i8 %x, i8 %y) {997; CHECK-LABEL: @or_disjoint_with_constants_fail_missing_const2(998; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], 19999; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], [[Y:%.*]]1000; CHECK-NEXT: ret i1 [[CMP]]1001;1002 %or = or disjoint i8 %x, 191003 %cmp = icmp eq i8 %or, %y1004 ret i1 %cmp1005}1006 1007