Skip to content

Commit 4bbc903

Browse files
marcaubererhuihzhang
authored andcommitted
[InstCombine] Baseline tests for folding ((A&B)^A)|((A&B)^B) to A^B
Baseline tests for: https://reviews.llvm.org/D159380 Reviewed By: huihuiz Differential Revision: https://reviews.llvm.org/D159379
1 parent 9168fca commit 4bbc903

File tree

1 file changed

+152
-0
lines changed

1 file changed

+152
-0
lines changed
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
declare void @use.i3(i1)
5+
declare void @use.i5(i5)
6+
declare void @use.i32(i5)
7+
8+
define i1 @or_xor_xor_normal_variant1(i1 %a, i1 %b) {
9+
; CHECK-LABEL: @or_xor_xor_normal_variant1(
10+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
11+
; CHECK-NEXT: [[XOR1:%.*]] = xor i1 [[AND]], [[A]]
12+
; CHECK-NEXT: [[XOR2:%.*]] = xor i1 [[AND]], [[B]]
13+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[XOR1]], [[XOR2]]
14+
; CHECK-NEXT: ret i1 [[OR]]
15+
;
16+
%and = and i1 %a, %b
17+
%xor1 = xor i1 %and, %a
18+
%xor2 = xor i1 %and, %b
19+
%or = or i1 %xor1, %xor2
20+
ret i1 %or
21+
}
22+
23+
define i8 @or_xor_xor_normal_variant2(i8 %a, i8 %b) {
24+
; CHECK-LABEL: @or_xor_xor_normal_variant2(
25+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
26+
; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[AND]], [[B]]
27+
; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[AND]], [[A]]
28+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[XOR1]], [[XOR2]]
29+
; CHECK-NEXT: ret i8 [[OR]]
30+
;
31+
%and = and i8 %a, %b
32+
%xor1 = xor i8 %and, %b
33+
%xor2 = xor i8 %a, %and
34+
%or = or i8 %xor1, %xor2
35+
ret i8 %or
36+
}
37+
38+
define i16 @or_xor_xor_normal_variant3(i16 %a, i16 %b) {
39+
; CHECK-LABEL: @or_xor_xor_normal_variant3(
40+
; CHECK-NEXT: [[AND:%.*]] = and i16 [[B:%.*]], [[A:%.*]]
41+
; CHECK-NEXT: [[XOR1:%.*]] = xor i16 [[AND]], [[B]]
42+
; CHECK-NEXT: [[XOR2:%.*]] = xor i16 [[AND]], [[A]]
43+
; CHECK-NEXT: [[OR:%.*]] = or i16 [[XOR1]], [[XOR2]]
44+
; CHECK-NEXT: ret i16 [[OR]]
45+
;
46+
%and = and i16 %b, %a
47+
%xor1 = xor i16 %b, %and
48+
%xor2 = xor i16 %a, %and
49+
%or = or i16 %xor1, %xor2
50+
ret i16 %or
51+
}
52+
53+
define i64 @or_xor_xor_normal_variant4(i64 %a, i64 %b) {
54+
; CHECK-LABEL: @or_xor_xor_normal_variant4(
55+
; CHECK-NEXT: [[AND:%.*]] = and i64 [[B:%.*]], [[A:%.*]]
56+
; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[AND]], [[B]]
57+
; CHECK-NEXT: [[XOR2:%.*]] = xor i64 [[AND]], [[A]]
58+
; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR1]], [[XOR2]]
59+
; CHECK-NEXT: ret i64 [[OR]]
60+
;
61+
%and = and i64 %b, %a
62+
%xor1 = xor i64 %and, %b
63+
%xor2 = xor i64 %and, %a
64+
%or = or i64 %xor1, %xor2
65+
ret i64 %or
66+
}
67+
68+
define i32 @or_xor_xor_normal_binops(i32 %aa, i32 %bb, i32 %cc) {
69+
; CHECK-LABEL: @or_xor_xor_normal_binops(
70+
; CHECK-NEXT: [[A:%.*]] = xor i32 [[AA:%.*]], [[CC:%.*]]
71+
; CHECK-NEXT: [[B:%.*]] = xor i32 [[BB:%.*]], [[CC]]
72+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[B]], [[A]]
73+
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[B]], [[AND]]
74+
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[A]], [[AND]]
75+
; CHECK-NEXT: [[OR:%.*]] = or i32 [[XOR1]], [[XOR2]]
76+
; CHECK-NEXT: ret i32 [[OR]]
77+
;
78+
%a = xor i32 %aa, %cc
79+
%b = xor i32 %bb, %cc
80+
81+
%and = and i32 %b, %a
82+
%xor1 = xor i32 %b, %and
83+
%xor2 = xor i32 %a, %and
84+
%or = or i32 %xor1, %xor2
85+
ret i32 %or
86+
}
87+
88+
define <3 x i1> @or_xor_xor_normal_vector(<3 x i1> %a, <3 x i1> %b) {
89+
; CHECK-LABEL: @or_xor_xor_normal_vector(
90+
; CHECK-NEXT: [[AND:%.*]] = and <3 x i1> [[A:%.*]], [[B:%.*]]
91+
; CHECK-NEXT: [[XOR1:%.*]] = xor <3 x i1> [[AND]], [[B]]
92+
; CHECK-NEXT: [[XOR2:%.*]] = xor <3 x i1> [[AND]], [[A]]
93+
; CHECK-NEXT: [[OR:%.*]] = or <3 x i1> [[XOR1]], [[XOR2]]
94+
; CHECK-NEXT: ret <3 x i1> [[OR]]
95+
;
96+
%and = and <3 x i1> %a, %b
97+
%xor1 = xor <3 x i1> %and, %b
98+
%xor2 = xor <3 x i1> %and, %a
99+
%or = or <3 x i1> %xor1, %xor2
100+
ret <3 x i1> %or
101+
}
102+
103+
define i3 @or_xor_xor_normal_multiple_uses_and(i3 %a, i3 %b) {
104+
; CHECK-LABEL: @or_xor_xor_normal_multiple_uses_and(
105+
; CHECK-NEXT: [[AND:%.*]] = and i3 [[A:%.*]], [[B:%.*]]
106+
; CHECK-NEXT: call void @use.i3(i3 [[AND]])
107+
; CHECK-NEXT: [[XOR1:%.*]] = xor i3 [[AND]], [[B]]
108+
; CHECK-NEXT: [[XOR2:%.*]] = xor i3 [[AND]], [[A]]
109+
; CHECK-NEXT: [[OR:%.*]] = or i3 [[XOR1]], [[XOR2]]
110+
; CHECK-NEXT: ret i3 [[OR]]
111+
;
112+
%and = and i3 %a, %b
113+
call void @use.i3(i3 %and)
114+
%xor1 = xor i3 %b, %and
115+
%xor2 = xor i3 %a, %and
116+
%or = or i3 %xor1, %xor2
117+
ret i3 %or
118+
}
119+
120+
define i32 @or_xor_xor_negative_multiple_uses_xor1(i32 %a, i32 %b) {
121+
; CHECK-LABEL: @or_xor_xor_negative_multiple_uses_xor1(
122+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], [[B:%.*]]
123+
; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[AND]], [[B]]
124+
; CHECK-NEXT: call void @use.i32(i32 [[XOR1]])
125+
; CHECK-NEXT: [[XOR2:%.*]] = xor i32 [[AND]], [[A]]
126+
; CHECK-NEXT: [[OR:%.*]] = or i32 [[XOR1]], [[XOR2]]
127+
; CHECK-NEXT: ret i32 [[OR]]
128+
;
129+
%and = and i32 %a, %b
130+
%xor1 = xor i32 %and, %b
131+
call void @use.i32(i32 %xor1)
132+
%xor2 = xor i32 %and, %a
133+
%or = or i32 %xor1, %xor2
134+
ret i32 %or
135+
}
136+
137+
define i5 @or_xor_xor_negative_multiple_uses_xor2(i5 %a, i5 %b) {
138+
; CHECK-LABEL: @or_xor_xor_negative_multiple_uses_xor2(
139+
; CHECK-NEXT: [[AND:%.*]] = and i5 [[A:%.*]], [[B:%.*]]
140+
; CHECK-NEXT: [[XOR1:%.*]] = xor i5 [[AND]], [[B]]
141+
; CHECK-NEXT: [[XOR2:%.*]] = xor i5 [[AND]], [[A]]
142+
; CHECK-NEXT: call void @use.i5(i5 [[XOR2]])
143+
; CHECK-NEXT: [[OR:%.*]] = or i5 [[XOR1]], [[XOR2]]
144+
; CHECK-NEXT: ret i5 [[OR]]
145+
;
146+
%and = and i5 %a, %b
147+
%xor1 = xor i5 %and, %b
148+
%xor2 = xor i5 %and, %a
149+
call void @use.i5(i5 %xor2)
150+
%or = or i5 %xor1, %xor2
151+
ret i5 %or
152+
}

0 commit comments

Comments
 (0)