513 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @eq_zero(i4 %x, i4 %y) {5; CHECK-LABEL: @eq_zero(6; CHECK-NEXT: [[I0:%.*]] = icmp eq i4 [[X:%.*]], 07; CHECK-NEXT: [[I1:%.*]] = icmp eq i4 [[Y:%.*]], 08; CHECK-NEXT: [[R:%.*]] = xor i1 [[I0]], [[I1]]9; CHECK-NEXT: ret i1 [[R]]10;11 %i0 = icmp eq i4 %x, 012 %i1 = icmp eq i4 %y, 013 %r = xor i1 %i0, %i114 ret i1 %r15}16 17define i1 @ne_zero(i4 %x, i4 %y) {18; CHECK-LABEL: @ne_zero(19; CHECK-NEXT: [[I0:%.*]] = icmp ne i4 [[X:%.*]], 020; CHECK-NEXT: [[I1:%.*]] = icmp ne i4 [[Y:%.*]], 021; CHECK-NEXT: [[R:%.*]] = xor i1 [[I0]], [[I1]]22; CHECK-NEXT: ret i1 [[R]]23;24 %i0 = icmp ne i4 %x, 025 %i1 = icmp ne i4 %y, 026 %r = xor i1 %i0, %i127 ret i1 %r28}29 30define i1 @eq_ne_zero(i4 %x, i4 %y) {31; CHECK-LABEL: @eq_ne_zero(32; CHECK-NEXT: [[I0:%.*]] = icmp eq i4 [[X:%.*]], 033; CHECK-NEXT: [[I1:%.*]] = icmp ne i4 [[Y:%.*]], 034; CHECK-NEXT: [[R:%.*]] = xor i1 [[I0]], [[I1]]35; CHECK-NEXT: ret i1 [[R]]36;37 %i0 = icmp eq i4 %x, 038 %i1 = icmp ne i4 %y, 039 %r = xor i1 %i0, %i140 ret i1 %r41}42 43define i1 @slt_zero(i4 %x, i4 %y) {44; CHECK-LABEL: @slt_zero(45; CHECK-NEXT: [[TMP1:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]46; CHECK-NEXT: [[R:%.*]] = icmp slt i4 [[TMP1]], 047; CHECK-NEXT: ret i1 [[R]]48;49 %i0 = icmp slt i4 %x, 050 %i1 = icmp slt i4 %y, 051 %r = xor i1 %i0, %i152 ret i1 %r53}54 55; Don't increase the instruction count.56 57declare void @use(i1)58 59define i1 @slt_zero_extra_uses(i4 %x, i4 %y) {60; CHECK-LABEL: @slt_zero_extra_uses(61; CHECK-NEXT: [[I0:%.*]] = icmp slt i4 [[X:%.*]], 062; CHECK-NEXT: [[I1:%.*]] = icmp slt i4 [[Y:%.*]], 063; CHECK-NEXT: [[R:%.*]] = xor i1 [[I0]], [[I1]]64; CHECK-NEXT: call void @use(i1 [[I0]])65; CHECK-NEXT: call void @use(i1 [[I1]])66; CHECK-NEXT: ret i1 [[R]]67;68 %i0 = icmp slt i4 %x, 069 %i1 = icmp slt i4 %y, 070 %r = xor i1 %i0, %i171 call void @use(i1 %i0)72 call void @use(i1 %i1)73 ret i1 %r74}75 76define i1 @sgt_zero(i4 %x, i4 %y) {77; CHECK-LABEL: @sgt_zero(78; CHECK-NEXT: [[I0:%.*]] = icmp sgt i4 [[X:%.*]], 079; CHECK-NEXT: [[I1:%.*]] = icmp sgt i4 [[Y:%.*]], 080; CHECK-NEXT: [[R:%.*]] = xor i1 [[I0]], [[I1]]81; CHECK-NEXT: ret i1 [[R]]82;83 %i0 = icmp sgt i4 %x, 084 %i1 = icmp sgt i4 %y, 085 %r = xor i1 %i0, %i186 ret i1 %r87}88 89define i1 @sgt_minus1(i4 %x, i4 %y) {90; CHECK-LABEL: @sgt_minus1(91; CHECK-NEXT: [[TMP1:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]92; CHECK-NEXT: [[R:%.*]] = icmp slt i4 [[TMP1]], 093; CHECK-NEXT: ret i1 [[R]]94;95 %i0 = icmp sgt i4 %x, -196 %i1 = icmp sgt i4 %y, -197 %r = xor i1 %i0, %i198 ret i1 %r99}100 101define i1 @slt_zero_sgt_minus1(i4 %x, i4 %y) {102; CHECK-LABEL: @slt_zero_sgt_minus1(103; CHECK-NEXT: [[TMP1:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]104; CHECK-NEXT: [[R:%.*]] = icmp sgt i4 [[TMP1]], -1105; CHECK-NEXT: ret i1 [[R]]106;107 %i0 = icmp slt i4 %x, 0108 %i1 = icmp sgt i4 %y, -1109 %r = xor i1 %i0, %i1110 ret i1 %r111}112 113define <2 x i1> @sgt_minus1_slt_zero_sgt(<2 x i4> %x, <2 x i4> %y) {114; CHECK-LABEL: @sgt_minus1_slt_zero_sgt(115; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i4> [[Y:%.*]], [[X:%.*]]116; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i4> [[TMP1]], splat (i4 -1)117; CHECK-NEXT: ret <2 x i1> [[R]]118;119 %i1 = icmp sgt <2 x i4> %x, <i4 -1, i4 -1>120 %i0 = icmp slt <2 x i4> %y, zeroinitializer121 %r = xor <2 x i1> %i0, %i1122 ret <2 x i1> %r123}124 125; Don't try (crash) if the operand types don't match.126 127define i1 @different_type_cmp_ops(i32 %x, i64 %y) {128; CHECK-LABEL: @different_type_cmp_ops(129; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[X:%.*]], 0130; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i64 [[Y:%.*]], 0131; CHECK-NEXT: [[R:%.*]] = xor i1 [[CMP1]], [[CMP2]]132; CHECK-NEXT: ret i1 [[R]]133;134 %cmp1 = icmp slt i32 %x, 0135 %cmp2 = icmp slt i64 %y, 0136 %r = xor i1 %cmp1, %cmp2137 ret i1 %r138}139 140define i1 @test13(i8 %A, i8 %B) {141; CHECK-LABEL: @test13(142; CHECK-NEXT: [[E:%.*]] = icmp ne i8 [[A:%.*]], [[B:%.*]]143; CHECK-NEXT: ret i1 [[E]]144;145 %C = icmp ult i8 %A, %B146 %D = icmp ugt i8 %A, %B147 %E = xor i1 %C, %D148 ret i1 %E149}150 151define i1 @test14(i8 %A, i8 %B) {152; CHECK-LABEL: @test14(153; CHECK-NEXT: ret i1 true154;155 %C = icmp eq i8 %A, %B156 %D = icmp ne i8 %B, %A157 %E = xor i1 %C, %D158 ret i1 %E159}160 161define i1 @xor_icmp_ptr(ptr %c, ptr %d) {162; CHECK-LABEL: @xor_icmp_ptr(163; CHECK-NEXT: [[CMP:%.*]] = icmp slt ptr [[C:%.*]], null164; CHECK-NEXT: [[CMP1:%.*]] = icmp slt ptr [[D:%.*]], null165; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[CMP]], [[CMP1]]166; CHECK-NEXT: ret i1 [[XOR]]167;168 %cmp = icmp slt ptr %c, null169 %cmp1 = icmp slt ptr %d, null170 %xor = xor i1 %cmp, %cmp1171 ret i1 %xor172}173 174; Tests from PR70928175define i1 @xor_icmp_true_signed(i32 %a) {176; CHECK-LABEL: @xor_icmp_true_signed(177; CHECK-NEXT: ret i1 true178;179 %cmp = icmp sgt i32 %a, 5180 %cmp1 = icmp slt i32 %a, 6181 %cmp3 = xor i1 %cmp, %cmp1182 ret i1 %cmp3183}184define i1 @xor_icmp_true_signed_multiuse1(i32 %a) {185; CHECK-LABEL: @xor_icmp_true_signed_multiuse1(186; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5187; CHECK-NEXT: call void @use(i1 [[CMP]])188; CHECK-NEXT: ret i1 true189;190 %cmp = icmp sgt i32 %a, 5191 call void @use(i1 %cmp)192 %cmp1 = icmp slt i32 %a, 6193 %cmp3 = xor i1 %cmp, %cmp1194 ret i1 %cmp3195}196define i1 @xor_icmp_true_signed_multiuse2(i32 %a) {197; CHECK-LABEL: @xor_icmp_true_signed_multiuse2(198; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5199; CHECK-NEXT: call void @use(i1 [[CMP]])200; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6201; CHECK-NEXT: call void @use(i1 [[CMP1]])202; CHECK-NEXT: ret i1 true203;204 %cmp = icmp sgt i32 %a, 5205 call void @use(i1 %cmp)206 %cmp1 = icmp slt i32 %a, 6207 call void @use(i1 %cmp1)208 %cmp3 = xor i1 %cmp, %cmp1209 ret i1 %cmp3210}211define i1 @xor_icmp_true_signed_commuted(i32 %a) {212; CHECK-LABEL: @xor_icmp_true_signed_commuted(213; CHECK-NEXT: ret i1 true214;215 %cmp = icmp sgt i32 %a, 5216 %cmp1 = icmp slt i32 %a, 6217 %cmp3 = xor i1 %cmp1, %cmp218 ret i1 %cmp3219}220define i1 @xor_icmp_true_unsigned(i32 %a) {221; CHECK-LABEL: @xor_icmp_true_unsigned(222; CHECK-NEXT: ret i1 true223;224 %cmp = icmp ugt i32 %a, 5225 %cmp1 = icmp ult i32 %a, 6226 %cmp3 = xor i1 %cmp, %cmp1227 ret i1 %cmp3228}229define i1 @xor_icmp_to_ne(i32 %a) {230; CHECK-LABEL: @xor_icmp_to_ne(231; CHECK-NEXT: [[CMP3:%.*]] = icmp ne i32 [[A:%.*]], 5232; CHECK-NEXT: ret i1 [[CMP3]]233;234 %cmp = icmp sgt i32 %a, 4235 %cmp1 = icmp slt i32 %a, 6236 %cmp3 = xor i1 %cmp, %cmp1237 ret i1 %cmp3238}239define i1 @xor_icmp_to_ne_multiuse1(i32 %a) {240; CHECK-LABEL: @xor_icmp_to_ne_multiuse1(241; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 4242; CHECK-NEXT: call void @use(i1 [[CMP]])243; CHECK-NEXT: [[CMP3:%.*]] = icmp ne i32 [[A]], 5244; CHECK-NEXT: ret i1 [[CMP3]]245;246 %cmp = icmp sgt i32 %a, 4247 call void @use(i1 %cmp)248 %cmp1 = icmp slt i32 %a, 6249 %cmp3 = xor i1 %cmp, %cmp1250 ret i1 %cmp3251}252define i1 @xor_icmp_to_icmp_add(i32 %a) {253; CHECK-LABEL: @xor_icmp_to_icmp_add(254; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[A:%.*]], -6255; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[TMP1]], -2256; CHECK-NEXT: ret i1 [[CMP3]]257;258 %cmp = icmp sgt i32 %a, 3259 %cmp1 = icmp slt i32 %a, 6260 %cmp3 = xor i1 %cmp, %cmp1261 ret i1 %cmp3262}263; Negative tests264; The result of ConstantRange::difference is not exact.265define i1 @xor_icmp_invalid_range(i8 %x0) {266; CHECK-LABEL: @xor_icmp_invalid_range(267; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X0:%.*]], -5268; CHECK-NEXT: [[OR_COND:%.*]] = icmp ne i8 [[TMP1]], 0269; CHECK-NEXT: ret i1 [[OR_COND]]270;271 %cmp = icmp eq i8 %x0, 0272 %cmp4 = icmp ne i8 %x0, 4273 %or.cond = xor i1 %cmp, %cmp4274 ret i1 %or.cond275}276define i1 @xor_icmp_to_ne_multiuse2(i32 %a) {277; CHECK-LABEL: @xor_icmp_to_ne_multiuse2(278; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 4279; CHECK-NEXT: call void @use(i1 [[CMP]])280; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6281; CHECK-NEXT: call void @use(i1 [[CMP1]])282; CHECK-NEXT: [[CMP3:%.*]] = xor i1 [[CMP]], [[CMP1]]283; CHECK-NEXT: ret i1 [[CMP3]]284;285 %cmp = icmp sgt i32 %a, 4286 call void @use(i1 %cmp)287 %cmp1 = icmp slt i32 %a, 6288 call void @use(i1 %cmp1)289 %cmp3 = xor i1 %cmp, %cmp1290 ret i1 %cmp3291}292define i1 @xor_icmp_to_icmp_add_multiuse1(i32 %a) {293; CHECK-LABEL: @xor_icmp_to_icmp_add_multiuse1(294; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 3295; CHECK-NEXT: call void @use(i1 [[CMP]])296; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6297; CHECK-NEXT: [[CMP3:%.*]] = xor i1 [[CMP]], [[CMP1]]298; CHECK-NEXT: ret i1 [[CMP3]]299;300 %cmp = icmp sgt i32 %a, 3301 call void @use(i1 %cmp)302 %cmp1 = icmp slt i32 %a, 6303 %cmp3 = xor i1 %cmp, %cmp1304 ret i1 %cmp3305}306define i1 @xor_icmp_to_icmp_add_multiuse2(i32 %a) {307; CHECK-LABEL: @xor_icmp_to_icmp_add_multiuse2(308; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 3309; CHECK-NEXT: call void @use(i1 [[CMP]])310; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6311; CHECK-NEXT: call void @use(i1 [[CMP1]])312; CHECK-NEXT: [[CMP3:%.*]] = xor i1 [[CMP]], [[CMP1]]313; CHECK-NEXT: ret i1 [[CMP3]]314;315 %cmp = icmp sgt i32 %a, 3316 call void @use(i1 %cmp)317 %cmp1 = icmp slt i32 %a, 6318 call void @use(i1 %cmp1)319 %cmp3 = xor i1 %cmp, %cmp1320 ret i1 %cmp3321}322 323define i1 @test_xor_of_bittest_ne_ne(i8 %x, i8 %y) {324; CHECK-LABEL: @test_xor_of_bittest_ne_ne(325; CHECK-NEXT: [[Y:%.*]] = xor i8 [[X:%.*]], [[Y1:%.*]]326; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y]], 2327; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0328; CHECK-NEXT: ret i1 [[CMP2]]329;330 %mask1 = and i8 %x, 2331 %cmp1 = icmp ne i8 %mask1, 0332 %mask2 = and i8 %y, 2333 %cmp2 = icmp ne i8 %mask2, 0334 %xor = xor i1 %cmp1, %cmp2335 ret i1 %xor336}337 338define i1 @test_xor_of_bittest_ne_ne_var_pow2(i8 %x, i8 %y, i8 %shamt) {339; CHECK-LABEL: @test_xor_of_bittest_ne_ne_var_pow2(340; CHECK-NEXT: [[POW2:%.*]] = shl nuw i8 1, [[SHAMT:%.*]]341; CHECK-NEXT: [[Y:%.*]] = xor i8 [[X:%.*]], [[Y1:%.*]]342; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y]], [[POW2]]343; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0344; CHECK-NEXT: ret i1 [[CMP2]]345;346 %pow2 = shl nuw i8 1, %shamt347 %mask1 = and i8 %x, %pow2348 %cmp1 = icmp ne i8 %mask1, 0349 %mask2 = and i8 %y, %pow2350 %cmp2 = icmp ne i8 %mask2, 0351 %xor = xor i1 %cmp1, %cmp2352 ret i1 %xor353}354 355define i1 @test_xor_of_bittest_ne_ne_var_pow2_or_zero(i8 %x, i8 %y, i8 %z) {356; CHECK-LABEL: @test_xor_of_bittest_ne_ne_var_pow2_or_zero(357; CHECK-NEXT: [[NZ:%.*]] = sub i8 0, [[Z:%.*]]358; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]359; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[NZ]]360; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[TMP2]], [[Z]]361; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0362; CHECK-NEXT: ret i1 [[CMP2]]363;364 %nz = sub i8 0, %z365 %pow2 = and i8 %z, %nz366 %mask1 = and i8 %x, %pow2367 %cmp1 = icmp ne i8 %mask1, 0368 %mask2 = and i8 %y, %pow2369 %cmp2 = icmp ne i8 %mask2, 0370 %xor = xor i1 %cmp1, %cmp2371 ret i1 %xor372}373 374define i1 @test_xor_of_bittest_eq_eq(i8 %x, i8 %y) {375; CHECK-LABEL: @test_xor_of_bittest_eq_eq(376; CHECK-NEXT: [[Y:%.*]] = xor i8 [[X:%.*]], [[Y1:%.*]]377; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y]], 2378; CHECK-NEXT: [[XOR:%.*]] = icmp ne i8 [[MASK2]], 0379; CHECK-NEXT: ret i1 [[XOR]]380;381 %mask1 = and i8 %x, 2382 %cmp1 = icmp eq i8 %mask1, 0383 %mask2 = and i8 %y, 2384 %cmp2 = icmp eq i8 %mask2, 0385 %xor = xor i1 %cmp1, %cmp2386 ret i1 %xor387}388 389define i1 @test_xor_of_bittest_ne_eq(i8 %x, i8 %y) {390; CHECK-LABEL: @test_xor_of_bittest_ne_eq(391; CHECK-NEXT: [[Y:%.*]] = xor i8 [[X:%.*]], [[Y1:%.*]]392; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y]], 2393; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[MASK2]], 0394; CHECK-NEXT: ret i1 [[CMP2]]395;396 %mask1 = and i8 %x, 2397 %cmp1 = icmp ne i8 %mask1, 0398 %mask2 = and i8 %y, 2399 %cmp2 = icmp eq i8 %mask2, 0400 %xor = xor i1 %cmp1, %cmp2401 ret i1 %xor402}403 404define i1 @test_xor_of_bittest_eq_ne(i8 %x, i8 %y) {405; CHECK-LABEL: @test_xor_of_bittest_eq_ne(406; CHECK-NEXT: [[X:%.*]] = xor i8 [[X1:%.*]], [[Y:%.*]]407; CHECK-NEXT: [[MASK1:%.*]] = and i8 [[X]], 2408; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[MASK1]], 0409; CHECK-NEXT: ret i1 [[CMP1]]410;411 %mask1 = and i8 %x, 2412 %cmp1 = icmp eq i8 %mask1, 0413 %mask2 = and i8 %y, 2414 %cmp2 = icmp ne i8 %mask2, 0415 %xor = xor i1 %cmp1, %cmp2416 ret i1 %xor417}418 419define i1 @test_xor_of_bittest_ne_ne_multiuse1(i8 %x, i8 %y) {420; CHECK-LABEL: @test_xor_of_bittest_ne_ne_multiuse1(421; CHECK-NEXT: [[MASK1:%.*]] = and i8 [[X:%.*]], 2422; CHECK-NEXT: call void @usei8(i8 [[MASK1]])423; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y:%.*]], 2424; CHECK-NEXT: call void @usei8(i8 [[MASK2]])425; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X]], [[Y]]426; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], 2427; CHECK-NEXT: [[XOR:%.*]] = icmp ne i8 [[TMP2]], 0428; CHECK-NEXT: ret i1 [[XOR]]429;430 %mask1 = and i8 %x, 2431 call void @usei8(i8 %mask1)432 %cmp1 = icmp ne i8 %mask1, 0433 %mask2 = and i8 %y, 2434 call void @usei8(i8 %mask2)435 %cmp2 = icmp ne i8 %mask2, 0436 %xor = xor i1 %cmp1, %cmp2437 ret i1 %xor438}439 440; Negative tests441 442define i1 @test_xor_of_bittest_ne_ne_type_mismatch(i8 %x, i16 %y) {443; CHECK-LABEL: @test_xor_of_bittest_ne_ne_type_mismatch(444; CHECK-NEXT: [[MASK1:%.*]] = and i8 [[X:%.*]], 2445; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[MASK1]], 0446; CHECK-NEXT: [[MASK2:%.*]] = and i16 [[Y:%.*]], 2447; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i16 [[MASK2]], 0448; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[CMP1]], [[CMP2]]449; CHECK-NEXT: ret i1 [[XOR]]450;451 %mask1 = and i8 %x, 2452 %cmp1 = icmp ne i8 %mask1, 0453 %mask2 = and i16 %y, 2454 %cmp2 = icmp ne i16 %mask2, 0455 %xor = xor i1 %cmp1, %cmp2456 ret i1 %xor457}458 459define i1 @test_xor_of_bittest_ne_ne_mask_mismatch(i8 %x, i8 %y) {460; CHECK-LABEL: @test_xor_of_bittest_ne_ne_mask_mismatch(461; CHECK-NEXT: [[MASK1:%.*]] = and i8 [[X:%.*]], 4462; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[MASK1]], 0463; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y:%.*]], 2464; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0465; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[CMP1]], [[CMP2]]466; CHECK-NEXT: ret i1 [[XOR]]467;468 %mask1 = and i8 %x, 4469 %cmp1 = icmp ne i8 %mask1, 0470 %mask2 = and i8 %y, 2471 %cmp2 = icmp ne i8 %mask2, 0472 %xor = xor i1 %cmp1, %cmp2473 ret i1 %xor474}475 476define i1 @test_xor_of_bittest_ne_ne_nonpower2(i8 %x, i8 %y) {477; CHECK-LABEL: @test_xor_of_bittest_ne_ne_nonpower2(478; CHECK-NEXT: [[MASK1:%.*]] = and i8 [[X:%.*]], 3479; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[MASK1]], 0480; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y:%.*]], 3481; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0482; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[CMP1]], [[CMP2]]483; CHECK-NEXT: ret i1 [[XOR]]484;485 %mask1 = and i8 %x, 3486 %cmp1 = icmp ne i8 %mask1, 0487 %mask2 = and i8 %y, 3488 %cmp2 = icmp ne i8 %mask2, 0489 %xor = xor i1 %cmp1, %cmp2490 ret i1 %xor491}492 493define i1 @test_xor_of_bittest_ne_ne_multiuse2(i8 %x, i8 %y) {494; CHECK-LABEL: @test_xor_of_bittest_ne_ne_multiuse2(495; CHECK-NEXT: [[MASK1:%.*]] = and i8 [[X:%.*]], 2496; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[MASK1]], 0497; CHECK-NEXT: call void @use(i1 [[CMP1]])498; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y:%.*]], 2499; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0500; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[CMP1]], [[CMP2]]501; CHECK-NEXT: ret i1 [[XOR]]502;503 %mask1 = and i8 %x, 2504 %cmp1 = icmp ne i8 %mask1, 0505 call void @use(i1 %cmp1)506 %mask2 = and i8 %y, 2507 %cmp2 = icmp ne i8 %mask2, 0508 %xor = xor i1 %cmp1, %cmp2509 ret i1 %xor510}511 512declare void @usei8(i8)513