@@ -335,6 +335,46 @@ define i1 @test_xor_of_bittest_ne_ne(i8 %x, i8 %y) {
335335 ret i1 %xor
336336}
337337
338+ define 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: [[TMP2:%.*]] = and i8 [[TMP1:%.*]], [[POW2]]
342+ ; CHECK-NEXT: [[XOR:%.*]] = icmp ne i8 [[TMP2]], 0
343+ ; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y:%.*]], [[POW2]]
344+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0
345+ ; CHECK-NEXT: [[XOR1:%.*]] = xor i1 [[XOR]], [[CMP2]]
346+ ; CHECK-NEXT: ret i1 [[XOR1]]
347+ ;
348+ %pow2 = shl nuw i8 1 , %shamt
349+ %mask1 = and i8 %x , %pow2
350+ %cmp1 = icmp ne i8 %mask1 , 0
351+ %mask2 = and i8 %y , %pow2
352+ %cmp2 = icmp ne i8 %mask2 , 0
353+ %xor = xor i1 %cmp1 , %cmp2
354+ ret i1 %xor
355+ }
356+
357+ define i1 @test_xor_of_bittest_ne_ne_var_pow2_or_zero (i8 %x , i8 %y , i8 %z ) {
358+ ; CHECK-LABEL: @test_xor_of_bittest_ne_ne_var_pow2_or_zero(
359+ ; CHECK-NEXT: [[NZ:%.*]] = sub i8 0, [[Z:%.*]]
360+ ; CHECK-NEXT: [[POW2:%.*]] = and i8 [[Z]], [[NZ]]
361+ ; CHECK-NEXT: [[TMP3:%.*]] = and i8 [[X:%.*]], [[POW2]]
362+ ; CHECK-NEXT: [[XOR:%.*]] = icmp ne i8 [[TMP3]], 0
363+ ; CHECK-NEXT: [[MASK2:%.*]] = and i8 [[Y:%.*]], [[POW2]]
364+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[MASK2]], 0
365+ ; CHECK-NEXT: [[XOR1:%.*]] = xor i1 [[XOR]], [[CMP2]]
366+ ; CHECK-NEXT: ret i1 [[XOR1]]
367+ ;
368+ %nz = sub i8 0 , %z
369+ %pow2 = and i8 %z , %nz
370+ %mask1 = and i8 %x , %pow2
371+ %cmp1 = icmp ne i8 %mask1 , 0
372+ %mask2 = and i8 %y , %pow2
373+ %cmp2 = icmp ne i8 %mask2 , 0
374+ %xor = xor i1 %cmp1 , %cmp2
375+ ret i1 %xor
376+ }
377+
338378define i1 @test_xor_of_bittest_eq_eq (i8 %x , i8 %y ) {
339379; CHECK-LABEL: @test_xor_of_bittest_eq_eq(
340380; CHECK-NEXT: [[Y:%.*]] = xor i8 [[X:%.*]], [[Y1:%.*]]
0 commit comments