@@ -131,3 +131,71 @@ define i8 @or_or_not_no_common_op(i8 %x, i8 %y, i8 %z) {
131131 %and = and i8 %xorynot , %xorz
132132 ret i8 %and
133133}
134+
135+ ; ((A | B) ^ A ) & ((A | B) ^ B)
136+
137+ define i8 @or_xor (i8 %x , i8 %y ) {
138+ ; CHECK-LABEL: @or_xor(
139+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]
140+ ; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[OR]], [[X]]
141+ ; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[OR]], [[Y]]
142+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[XOR1]], [[XOR2]]
143+ ; CHECK-NEXT: ret i8 [[AND]]
144+ ;
145+ %or = or i8 %x , %y
146+ %xor1 = xor i8 %or , %x
147+ %xor2 = xor i8 %or , %y
148+ %and = and i8 %xor1 , %xor2
149+ ret i8 %and
150+ }
151+
152+ ; ((A | B) ^ B ) & ((A | B) ^ A)
153+
154+ define i8 @or_xor_commute1 (i8 %x , i8 %y ) {
155+ ; CHECK-LABEL: @or_xor_commute1(
156+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]
157+ ; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[OR]], [[X]]
158+ ; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[OR]], [[Y]]
159+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[XOR2]], [[XOR1]]
160+ ; CHECK-NEXT: ret i8 [[AND]]
161+ ;
162+ %or = or i8 %x , %y
163+ %xor1 = xor i8 %or , %x
164+ %xor2 = xor i8 %or , %y
165+ %and = and i8 %xor2 , %xor1
166+ ret i8 %and
167+ }
168+
169+ ; (A ^ (A | B) ) & (B ^ (A | B))
170+
171+ define i71 @or_xor_commute2 (i71 %x , i71 %y ) {
172+ ; CHECK-LABEL: @or_xor_commute2(
173+ ; CHECK-NEXT: [[OR:%.*]] = or i71 [[X:%.*]], [[Y:%.*]]
174+ ; CHECK-NEXT: [[XOR1:%.*]] = xor i71 [[X]], [[OR]]
175+ ; CHECK-NEXT: [[XOR2:%.*]] = xor i71 [[Y]], [[OR]]
176+ ; CHECK-NEXT: [[AND:%.*]] = and i71 [[XOR1]], [[XOR2]]
177+ ; CHECK-NEXT: ret i71 [[AND]]
178+ ;
179+ %or = or i71 %x , %y
180+ %xor1 = xor i71 %x , %or
181+ %xor2 = xor i71 %y , %or
182+ %and = and i71 %xor1 , %xor2
183+ ret i71 %and
184+ }
185+
186+ ; (B ^ (A | B) ) & (A ^ (A | B))
187+
188+ define <2 x i64 > @or_xor_commute3 (<2 x i64 > %x , <2 x i64 > %y ) {
189+ ; CHECK-LABEL: @or_xor_commute3(
190+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i64> [[X:%.*]], [[Y:%.*]]
191+ ; CHECK-NEXT: [[XOR1:%.*]] = xor <2 x i64> [[Y]], [[OR]]
192+ ; CHECK-NEXT: [[XOR2:%.*]] = xor <2 x i64> [[X]], [[OR]]
193+ ; CHECK-NEXT: [[AND:%.*]] = and <2 x i64> [[XOR1]], [[XOR2]]
194+ ; CHECK-NEXT: ret <2 x i64> [[AND]]
195+ ;
196+ %or = or <2 x i64 > %x , %y
197+ %xor1 = xor <2 x i64 > %y , %or
198+ %xor2 = xor <2 x i64 > %x , %or
199+ %and = and <2 x i64 > %xor1 , %xor2
200+ ret <2 x i64 > %and
201+ }
0 commit comments