brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.0 KiB · 55af211 Raw
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