Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -instcombine -S | FileCheck %s

declare i8 @gen8()
declare void @use8(i8)

@a = global i8 17

define i8 @t0_scalar(i8 %x, i8 %y) {
; CHECK-LABEL: @t0_scalar(
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[R:%.*]] = xor i8 [[TMP1]], 42
; CHECK-NEXT: ret i8 [[R]]
;
%i0 = xor i8 %x, 42
%r = xor i8 %i0, %y
ret i8 %r
}

define <2 x i8> @t1_splatvec(<2 x i8> %x, <2 x i8> %y) {
; CHECK-LABEL: @t1_splatvec(
; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[R:%.*]] = xor <2 x i8> [[TMP1]], <i8 42, i8 42>
; CHECK-NEXT: ret <2 x i8> [[R]]
;
%i0 = xor <2 x i8> %x, <i8 42, i8 42>
%r = xor <2 x i8> %i0, %y
ret <2 x i8> %r
}
define <2 x i8> @t2_vec(<2 x i8> %x, <2 x i8> %y) {
; CHECK-LABEL: @t2_vec(
; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[R:%.*]] = xor <2 x i8> [[TMP1]], <i8 42, i8 24>
; CHECK-NEXT: ret <2 x i8> [[R]]
;
%i0 = xor <2 x i8> %x, <i8 42, i8 24>
%r = xor <2 x i8> %i0, %y
ret <2 x i8> %r
}
define <2 x i8> @t3_vec_undef(<2 x i8> %x, <2 x i8> %y) {
; CHECK-LABEL: @t3_vec_undef(
; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[R:%.*]] = xor <2 x i8> [[TMP1]], <i8 42, i8 undef>
; CHECK-NEXT: ret <2 x i8> [[R]]
;
%i0 = xor <2 x i8> %x, <i8 42, i8 undef>
%r = xor <2 x i8> %i0, %y
ret <2 x i8> %r
}

define i8 @t4_extrause(i8 %x, i8 %y) {
; CHECK-LABEL: @t4_extrause(
; CHECK-NEXT: [[I0:%.*]] = xor i8 [[X:%.*]], 42
; CHECK-NEXT: call void @use8(i8 [[I0]])
; CHECK-NEXT: [[R:%.*]] = xor i8 [[I0]], [[Y:%.*]]
; CHECK-NEXT: ret i8 [[R]]
;
%i0 = xor i8 %x, 42
call void @use8(i8 %i0)
%r = xor i8 %i0, %y
ret i8 %r
}

define i8 @t5_commutativity(i8 %x) {
; CHECK-LABEL: @t5_commutativity(
; CHECK-NEXT: [[Y:%.*]] = call i8 @gen8()
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y]], [[X:%.*]]
; CHECK-NEXT: [[R:%.*]] = xor i8 [[TMP1]], 42
; CHECK-NEXT: ret i8 [[R]]
;
%i0 = xor i8 %x, 42
%y = call i8 @gen8()
%r = xor i8 %y, %i0
ret i8 %r
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,8 @@ define i4 @in_constant_varx_6_invmask(i4 %x, i4 %mask) {

define i4 @in_constant_mone_vary_invmask(i4 %y, i4 %mask) {
; CHECK-LABEL: @in_constant_mone_vary_invmask(
; CHECK-NEXT: [[N1_DEMORGAN:%.*]] = or i4 [[Y:%.*]], [[MASK:%.*]]
; CHECK-NEXT: [[N1:%.*]] = xor i4 [[N1_DEMORGAN]], -1
; CHECK-NEXT: [[R:%.*]] = xor i4 [[N1]], [[Y]]
; CHECK-NEXT: [[MASK_NOT:%.*]] = xor i4 [[MASK:%.*]], -1
; CHECK-NEXT: [[R:%.*]] = or i4 [[MASK_NOT]], [[Y:%.*]]
; CHECK-NEXT: ret i4 [[R]]
;
%notmask = xor i4 %mask, -1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,8 @@ define <3 x i4> @in_constant_varx_6_invmask_undef(<3 x i4> %x, <3 x i4> %mask) {

define <2 x i4> @in_constant_mone_vary_invmask(<2 x i4> %y, <2 x i4> %mask) {
; CHECK-LABEL: @in_constant_mone_vary_invmask(
; CHECK-NEXT: [[N1_DEMORGAN:%.*]] = or <2 x i4> [[Y:%.*]], [[MASK:%.*]]
; CHECK-NEXT: [[N1:%.*]] = xor <2 x i4> [[N1_DEMORGAN]], <i4 -1, i4 -1>
; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[Y]]
; CHECK-NEXT: [[MASK_NOT:%.*]] = xor <2 x i4> [[MASK:%.*]], <i4 -1, i4 -1>
; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[MASK_NOT]], [[Y:%.*]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%notmask = xor <2 x i4> %mask, <i4 -1, i4 -1>
Expand Down
68 changes: 61 additions & 7 deletions llvm/test/Transforms/InstCombine/or-xor.ll
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,15 @@ define i32 @test9(i32 %x, i32 %y) {
ret i32 %z
}

; (A ^ B) | (~A ^ B) --> -1

define i32 @test10(i32 %A, i32 %B) {
; CHECK-LABEL: @test10(
; CHECK-NEXT: ret i32 -1
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[OR:%.*]] = or i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[OR]]
;
%xor1 = xor i32 %B, %A
%not = xor i32 %A, -1
Expand All @@ -106,15 +112,63 @@ define i32 @test10(i32 %A, i32 %B) {

define i32 @test10_commuted(i32 %A, i32 %B) {
; CHECK-LABEL: @test10_commuted(
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[OR:%.*]] = or i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[OR]]
;
%xor1 = xor i32 %B, %A
%not = xor i32 %A, -1
%xor2 = xor i32 %not, %B
%or = or i32 %xor2, %xor1
ret i32 %or
}

define i32 @test10_extrause(i32 %A, i32 %B, i32* %dst) {
; CHECK-LABEL: @test10_extrause(
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1
; CHECK-NEXT: store i32 [[NOT]], i32* [[DST:%.*]], align 4
; CHECK-NEXT: ret i32 -1
;
%xor1 = xor i32 %B, %A
%not = xor i32 %A, -1
store i32 %not, i32* %dst
%xor2 = xor i32 %not, %B
%or = or i32 %xor1, %xor2
ret i32 %or
}

define i32 @test10_commuted_extrause(i32 %A, i32 %B, i32* %dst) {
; CHECK-LABEL: @test10_commuted_extrause(
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1
; CHECK-NEXT: store i32 [[NOT]], i32* [[DST:%.*]], align 4
; CHECK-NEXT: ret i32 -1
;
%xor1 = xor i32 %B, %A
%not = xor i32 %A, -1
store i32 %not, i32* %dst
%xor2 = xor i32 %not, %B
%or = or i32 %xor2, %xor1
ret i32 %or
}

; (A ^ B) | ~(A ^ B) --> -1
define i32 @test10_canonical(i32 %A, i32 %B) {
; CHECK-LABEL: @test10_canonical(
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[A]], [[B]]
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[XOR2]], -1
; CHECK-NEXT: [[OR:%.*]] = or i32 [[XOR1]], [[NOT]]
; CHECK-NEXT: ret i32 [[OR]]
;
%xor1 = xor i32 %B, %A
%xor2 = xor i32 %A, %B
%not = xor i32 %xor2, -1
%or = or i32 %xor1, %not
ret i32 %or
}

; (x | y) & ((~x) ^ y) -> (x & y)
define i32 @test11(i32 %x, i32 %y) {
; CHECK-LABEL: @test11(
Expand Down Expand Up @@ -304,9 +358,9 @@ define i8 @or_xor_or(i8 %x) {
define i8 @test17(i8 %A, i8 %B) {
; CHECK-LABEL: @test17(
; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[A]], 33
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[NOT]], [[B]]
; CHECK-NEXT: [[OR:%.*]] = or i8 [[XOR1]], 33
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[TMP1]], 33
; CHECK-NEXT: [[OR:%.*]] = or i8 [[XOR1]], [[XOR2]]
; CHECK-NEXT: [[RES:%.*]] = mul i8 [[OR]], [[XOR2]]
; CHECK-NEXT: ret i8 [[RES]]
;
Expand All @@ -321,9 +375,9 @@ define i8 @test17(i8 %A, i8 %B) {
define i8 @test18(i8 %A, i8 %B) {
; CHECK-LABEL: @test18(
; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[A]], 33
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[NOT]], [[B]]
; CHECK-NEXT: [[OR:%.*]] = or i8 [[XOR1]], 33
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[TMP1]], 33
; CHECK-NEXT: [[OR:%.*]] = or i8 [[XOR2]], [[XOR1]]
; CHECK-NEXT: [[RES:%.*]] = mul i8 [[OR]], [[XOR2]]
; CHECK-NEXT: ret i8 [[RES]]
;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,8 @@ define i4 @in_constant_varx_14(i4 %x, i4 %mask) {

define i4 @in_constant_mone_vary(i4 %y, i4 %mask) {
; CHECK-LABEL: @in_constant_mone_vary(
; CHECK-NEXT: [[N0:%.*]] = and i4 [[Y:%.*]], 1
; CHECK-NEXT: [[N1:%.*]] = xor i4 [[N0]], 1
; CHECK-NEXT: [[R:%.*]] = xor i4 [[N1]], [[Y]]
; CHECK-NEXT: ret i4 [[R]]
; CHECK-NEXT: [[R1:%.*]] = or i4 [[Y:%.*]], 1
; CHECK-NEXT: ret i4 [[R1]]
;
%n0 = xor i4 %y, -1 ; %x
%n1 = and i4 %n0, 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,8 @@ define <3 x i4> @in_constant_varx_14_undef(<3 x i4> %x, <3 x i4> %mask) {

define <2 x i4> @in_constant_mone_vary(<2 x i4> %y, <2 x i4> %mask) {
; CHECK-LABEL: @in_constant_mone_vary(
; CHECK-NEXT: [[N0:%.*]] = and <2 x i4> [[Y:%.*]], <i4 1, i4 1>
; CHECK-NEXT: [[N1:%.*]] = xor <2 x i4> [[N0]], <i4 1, i4 1>
; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[Y]]
; CHECK-NEXT: ret <2 x i4> [[R]]
; CHECK-NEXT: [[R1:%.*]] = or <2 x i4> [[Y:%.*]], <i4 1, i4 1>
; CHECK-NEXT: ret <2 x i4> [[R1]]
;
%n0 = xor <2 x i4> %y, <i4 -1, i4 -1> ; %x
%n1 = and <2 x i4> %n0, <i4 1, i4 1>
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Transforms/InstCombine/vec_shuffle-inseltpoison.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1749,8 +1749,8 @@ define <3 x i32> @splat_assoc_and(<4 x i32> %x, <3 x i32> %y) {
define <5 x i32> @splat_assoc_xor(<4 x i32> %x, <5 x i32> %y) {
; CHECK-LABEL: @splat_assoc_xor(
; CHECK-NEXT: [[SPLATX:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> undef, <5 x i32> zeroinitializer
; CHECK-NEXT: [[A:%.*]] = xor <5 x i32> [[Y:%.*]], <i32 42, i32 42, i32 42, i32 42, i32 42>
; CHECK-NEXT: [[R:%.*]] = xor <5 x i32> [[SPLATX]], [[A]]
; CHECK-NEXT: [[TMP1:%.*]] = xor <5 x i32> [[SPLATX]], [[Y:%.*]]
; CHECK-NEXT: [[R:%.*]] = xor <5 x i32> [[TMP1]], <i32 42, i32 42, i32 42, i32 42, i32 42>
; CHECK-NEXT: ret <5 x i32> [[R]]
;
%splatx = shufflevector <4 x i32> %x, <4 x i32> undef, <5 x i32> zeroinitializer
Expand Down
12 changes: 6 additions & 6 deletions llvm/test/Transforms/InstCombine/vec_shuffle.ll
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ define float @test6(<4 x float> %X) {

define float @testvscale6(<vscale x 4 x float> %X) {
; CHECK-LABEL: @testvscale6(
; CHECK-NEXT: [[T:%.*]] = shufflevector <vscale x 4 x float> [[X:%.*]], <vscale x 4 x float> undef, <vscale x 4 x i32> zeroinitializer
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x float> [[T]], i32 0
; CHECK-NEXT: [[T2:%.*]] = shufflevector <vscale x 4 x float> [[X:%.*]], <vscale x 4 x float> undef, <vscale x 4 x i32> zeroinitializer
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x float> [[T2]], i32 0
; CHECK-NEXT: ret float [[R]]
;
%X1 = bitcast <vscale x 4 x float> %X to <vscale x 4 x i32>
Expand Down Expand Up @@ -749,8 +749,8 @@ define <8 x i8> @pr19730(<16 x i8> %in0) {

define i32 @pr19737(<4 x i32> %in0) {
; CHECK-LABEL: @pr19737(
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i32> [[IN0:%.*]], i32 0
; CHECK-NEXT: ret i32 [[TMP1]]
; CHECK-NEXT: [[RV:%.*]] = extractelement <4 x i32> [[IN0:%.*]], i32 0
; CHECK-NEXT: ret i32 [[RV]]
;
%shuffle.i = shufflevector <4 x i32> zeroinitializer, <4 x i32> %in0, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
%neg.i = xor <4 x i32> %shuffle.i, <i32 -1, i32 -1, i32 -1, i32 -1>
Expand Down Expand Up @@ -1749,8 +1749,8 @@ define <3 x i32> @splat_assoc_and(<4 x i32> %x, <3 x i32> %y) {
define <5 x i32> @splat_assoc_xor(<4 x i32> %x, <5 x i32> %y) {
; CHECK-LABEL: @splat_assoc_xor(
; CHECK-NEXT: [[SPLATX:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> undef, <5 x i32> zeroinitializer
; CHECK-NEXT: [[A:%.*]] = xor <5 x i32> [[Y:%.*]], <i32 42, i32 42, i32 42, i32 42, i32 42>
; CHECK-NEXT: [[R:%.*]] = xor <5 x i32> [[SPLATX]], [[A]]
; CHECK-NEXT: [[TMP1:%.*]] = xor <5 x i32> [[SPLATX]], [[Y:%.*]]
; CHECK-NEXT: [[R:%.*]] = xor <5 x i32> [[TMP1]], <i32 42, i32 42, i32 42, i32 42, i32 42>
; CHECK-NEXT: ret <5 x i32> [[R]]
;
%splatx = shufflevector <4 x i32> %x, <4 x i32> undef, <5 x i32> zeroinitializer
Expand Down
44 changes: 26 additions & 18 deletions llvm/test/Transforms/InstCombine/xor2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,11 @@ define i32 @test10b(i32 %b, i32 %c) {

define i32 @test11(i32 %A, i32 %B) {
; CHECK-LABEL: @test11(
; CHECK-NEXT: ret i32 0
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[AND]]
;
%xor1 = xor i32 %B, %A
%not = xor i32 %A, -1
Expand All @@ -182,7 +186,11 @@ define i32 @test11(i32 %A, i32 %B) {

define i32 @test11b(i32 %A, i32 %B) {
; CHECK-LABEL: @test11b(
; CHECK-NEXT: ret i32 0
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[AND]]
;
%xor1 = xor i32 %B, %A
%not = xor i32 %A, -1
Expand All @@ -194,8 +202,8 @@ define i32 @test11b(i32 %A, i32 %B) {
define i32 @test11c(i32 %A, i32 %B) {
; CHECK-LABEL: @test11c(
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[NOT]], [[B]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[AND]]
;
Expand All @@ -209,9 +217,9 @@ define i32 @test11c(i32 %A, i32 %B) {
define i32 @test11d(i32 %A, i32 %B) {
; CHECK-LABEL: @test11d(
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[NOT]], [[B]]
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR2]], [[XOR1]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[AND]]
;
%xor1 = xor i32 %A, %B
Expand All @@ -225,8 +233,8 @@ define i32 @test11e(i32 %A, i32 %B, i32 %C) {
; CHECK-LABEL: @test11e(
; CHECK-NEXT: [[FORCE:%.*]] = mul i32 [[B:%.*]], [[C:%.*]]
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[FORCE]], [[A:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[FORCE]], [[NOT]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[FORCE]], [[A]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[AND]]
;
Expand All @@ -242,9 +250,9 @@ define i32 @test11f(i32 %A, i32 %B, i32 %C) {
; CHECK-LABEL: @test11f(
; CHECK-NEXT: [[FORCE:%.*]] = mul i32 [[B:%.*]], [[C:%.*]]
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[FORCE]], [[A:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[FORCE]], [[NOT]]
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR2]], [[XOR1]]
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[FORCE]], [[A]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[TMP1]], -1
; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR1]], [[XOR2]]
; CHECK-NEXT: ret i32 [[AND]]
;
%force = mul i32 %B, %C
Expand Down Expand Up @@ -481,9 +489,9 @@ define i32 @xor_or_xor_common_op_extra_use3(i32 %a, i32 %b, i32 %c, i32* %p1, i3
define i8 @test15(i8 %A, i8 %B) {
; CHECK-LABEL: @test15(
; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[A]], 33
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[NOT]], [[B]]
; CHECK-NEXT: [[AND:%.*]] = and i8 [[XOR1]], -34
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[TMP1]], 33
; CHECK-NEXT: [[AND:%.*]] = and i8 [[XOR1]], [[XOR2]]
; CHECK-NEXT: [[RES:%.*]] = mul i8 [[AND]], [[XOR2]]
; CHECK-NEXT: ret i8 [[RES]]
;
Expand All @@ -498,9 +506,9 @@ define i8 @test15(i8 %A, i8 %B) {
define i8 @test16(i8 %A, i8 %B) {
; CHECK-LABEL: @test16(
; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[B:%.*]], [[A:%.*]]
; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[A]], 33
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[NOT]], [[B]]
; CHECK-NEXT: [[AND:%.*]] = and i8 [[XOR1]], -34
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[A]], [[B]]
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[TMP1]], 33
; CHECK-NEXT: [[AND:%.*]] = and i8 [[XOR2]], [[XOR1]]
; CHECK-NEXT: [[RES:%.*]] = mul i8 [[AND]], [[XOR2]]
; CHECK-NEXT: ret i8 [[RES]]
;
Expand Down
1,875 changes: 1,066 additions & 809 deletions llvm/test/Transforms/LoopIdiom/X86/left-shift-until-bittest.ll

Large diffs are not rendered by default.