Skip to content

Commit 2738dc0

Browse files
committed
[ComplexLogicCombine] Precommit tests for complex logic combine init patch; NFC
1 parent 8116fc5 commit 2738dc0

File tree

1 file changed

+214
-0
lines changed

1 file changed

+214
-0
lines changed
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s
3+
4+
define i1 @leaf1_and_aa(i1 %a) {
5+
; CHECK-LABEL: @leaf1_and_aa(
6+
; CHECK-NEXT: [[AND_AA:%.*]] = and i1 [[A:%.*]], [[A]]
7+
; CHECK-NEXT: ret i1 [[AND_AA]]
8+
;
9+
%and.aa = and i1 %a, %a
10+
ret i1 %and.aa
11+
}
12+
13+
define i1 @leaf1_xor_aa(i1 %a) {
14+
; CHECK-LABEL: @leaf1_xor_aa(
15+
; CHECK-NEXT: [[XOR_AA:%.*]] = xor i1 [[A:%.*]], [[A]]
16+
; CHECK-NEXT: ret i1 [[XOR_AA]]
17+
;
18+
%xor.aa = xor i1 %a, %a
19+
ret i1 %xor.aa
20+
}
21+
22+
define i1 @leaf1_and_not(i1 %a) {
23+
; CHECK-LABEL: @leaf1_and_not(
24+
; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A:%.*]], true
25+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[A]], [[NOT_A]]
26+
; CHECK-NEXT: ret i1 [[AND]]
27+
;
28+
%not.a = xor i1 %a, true
29+
%and = and i1 %a, %not.a
30+
ret i1 %and
31+
}
32+
33+
define i1 @leaf1_or_not(i1 %a) {
34+
; CHECK-LABEL: @leaf1_or_not(
35+
; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A:%.*]], true
36+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[A]], [[NOT_A]]
37+
; CHECK-NEXT: ret i1 [[OR]]
38+
;
39+
%not.a = xor i1 %a, true
40+
%or = or i1 %a, %not.a
41+
ret i1 %or
42+
}
43+
44+
define i1 @leaf2_xor(i1 %a, i1 %b) {
45+
; CHECK-LABEL: @leaf2_xor(
46+
; CHECK-NEXT: [[AB:%.*]] = xor i1 [[A:%.*]], [[B:%.*]]
47+
; CHECK-NEXT: [[XOR_AB_A:%.*]] = xor i1 [[AB]], [[A]]
48+
; CHECK-NEXT: ret i1 [[XOR_AB_A]]
49+
;
50+
%ab = xor i1 %a, %b
51+
%xor.ab.a = xor i1 %ab, %a
52+
ret i1 %xor.ab.a
53+
}
54+
55+
define i1 @leaf2_xor_ret_const_false(i1 %a, i1 %b) {
56+
; CHECK-LABEL: @leaf2_xor_ret_const_false(
57+
; CHECK-NEXT: [[XOR_AB:%.*]] = xor i1 [[A:%.*]], [[B:%.*]]
58+
; CHECK-NEXT: [[XOR_AB_A:%.*]] = xor i1 [[XOR_AB]], [[A]]
59+
; CHECK-NEXT: [[XOR_AB_A_B:%.*]] = xor i1 [[XOR_AB_A]], [[B]]
60+
; CHECK-NEXT: ret i1 [[XOR_AB_A_B]]
61+
;
62+
%xor.ab = xor i1 %a, %b
63+
%xor.ab.a = xor i1 %xor.ab, %a
64+
%xor.ab.a.b = xor i1 %xor.ab.a, %b
65+
ret i1 %xor.ab.a.b
66+
}
67+
68+
define i1 @leaf2_or_ret_leaf(i1 %a, i1 %b) {
69+
; CHECK-LABEL: @leaf2_or_ret_leaf(
70+
; CHECK-NEXT: [[OR_AB:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
71+
; CHECK-NEXT: [[AND_AB:%.*]] = and i1 [[A]], [[B]]
72+
; CHECK-NEXT: [[XOR1:%.*]] = xor i1 [[OR_AB]], [[AND_AB]]
73+
; CHECK-NEXT: [[XOR2:%.*]] = xor i1 [[XOR1]], [[A]]
74+
; CHECK-NEXT: ret i1 [[XOR2]]
75+
;
76+
%or.ab = or i1 %a, %b
77+
%and.ab = and i1 %a, %b
78+
%xor1 = xor i1 %or.ab, %and.ab
79+
%xor2 = xor i1 %xor1, %a
80+
ret i1 %xor2
81+
}
82+
83+
define i1 @leaf2_or_ret_const_false(i1 %a, i1 %b) {
84+
; CHECK-LABEL: @leaf2_or_ret_const_false(
85+
; CHECK-NEXT: [[OR_AB:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
86+
; CHECK-NEXT: [[AND_AB:%.*]] = and i1 [[A]], [[B]]
87+
; CHECK-NEXT: [[XOR1:%.*]] = xor i1 [[OR_AB]], [[AND_AB]]
88+
; CHECK-NEXT: [[XOR2:%.*]] = xor i1 [[XOR1]], [[A]]
89+
; CHECK-NEXT: [[XOR3:%.*]] = xor i1 [[XOR1]], [[B]]
90+
; CHECK-NEXT: ret i1 [[XOR3]]
91+
;
92+
%or.ab = or i1 %a, %b
93+
%and.ab = and i1 %a, %b
94+
%xor1 = xor i1 %or.ab, %and.ab
95+
%xor2 = xor i1 %xor1, %a
96+
%xor3 = xor i1 %xor1, %b
97+
ret i1 %xor3
98+
}
99+
100+
define i4 @leaf2_type_is_i4(i4 %a, i4 %b) {
101+
; CHECK-LABEL: @leaf2_type_is_i4(
102+
; CHECK-NEXT: [[XOR_AB:%.*]] = xor i4 [[A:%.*]], [[B:%.*]]
103+
; CHECK-NEXT: [[NOT_A:%.*]] = xor i4 [[A]], -1
104+
; CHECK-NEXT: [[XOR2:%.*]] = xor i4 [[NOT_A]], [[B]]
105+
; CHECK-NEXT: [[OR:%.*]] = or i4 [[XOR2]], [[XOR_AB]]
106+
; CHECK-NEXT: ret i4 [[OR]]
107+
;
108+
%xor.ab = xor i4 %a, %b
109+
%not.a = xor i4 %a, -1
110+
%xor2 = xor i4 %not.a, %b
111+
%or = or i4 %xor2, %xor.ab
112+
ret i4 %or
113+
}
114+
115+
define i1 @leaf3_complex_ret_const_false(i1 %a, i1 %b, i1 %c) {
116+
; CHECK-LABEL: @leaf3_complex_ret_const_false(
117+
; CHECK-NEXT: [[AB:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
118+
; CHECK-NEXT: [[ABC:%.*]] = or i1 [[AB]], [[C:%.*]]
119+
; CHECK-NEXT: [[NOT_ABC:%.*]] = xor i1 [[ABC]], true
120+
; CHECK-NEXT: [[R:%.*]] = and i1 [[NOT_ABC]], [[A]]
121+
; CHECK-NEXT: ret i1 [[R]]
122+
;
123+
%ab = or i1 %a, %b
124+
%abc = or i1 %ab, %c
125+
%not.abc = xor i1 %abc, true
126+
%r = and i1 %not.abc, %a
127+
ret i1 %r
128+
}
129+
130+
define i1 @leaf3_complex_ret_leaf(i1 %a, i1 %b, i1 %c) {
131+
; CHECK-LABEL: @leaf3_complex_ret_leaf(
132+
; CHECK-NEXT: [[AB:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
133+
; CHECK-NEXT: [[BC:%.*]] = and i1 [[B]], [[C:%.*]]
134+
; CHECK-NEXT: [[XOR_AC:%.*]] = xor i1 [[A]], [[C]]
135+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[AB]], [[XOR_AC]]
136+
; CHECK-NEXT: [[NOT_BC:%.*]] = xor i1 [[BC]], true
137+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[NOT_BC]], [[A]]
138+
; CHECK-NEXT: [[COND:%.*]] = xor i1 [[AND]], [[OR]]
139+
; CHECK-NEXT: ret i1 [[COND]]
140+
;
141+
%ab = and i1 %a, %b
142+
%bc = and i1 %b, %c
143+
%xor.ac = xor i1 %a, %c
144+
%or = or i1 %ab, %xor.ac
145+
%not.bc = xor i1 %bc, true
146+
%and = and i1 %not.bc, %a
147+
%cond = xor i1 %and, %or
148+
ret i1 %cond
149+
}
150+
151+
define i1 @leaf4_ret_const_true(i1 %a, i1 %b, i1 %c, i1 %d) {
152+
; CHECK-LABEL: @leaf4_ret_const_true(
153+
; CHECK-NEXT: [[BD:%.*]] = and i1 [[B:%.*]], [[D:%.*]]
154+
; CHECK-NEXT: [[NOT_BD:%.*]] = xor i1 [[BD]], true
155+
; CHECK-NEXT: [[XOR_AB:%.*]] = xor i1 [[A:%.*]], [[B]]
156+
; CHECK-NEXT: [[OR1:%.*]] = or i1 [[XOR_AB]], [[C:%.*]]
157+
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[NOT_BD]]
158+
; CHECK-NEXT: [[OR3:%.*]] = or i1 [[OR2]], [[A]]
159+
; CHECK-NEXT: ret i1 [[OR3]]
160+
;
161+
%bd = and i1 %b, %d
162+
%not.bd = xor i1 %bd, true
163+
%xor.ab = xor i1 %a, %b
164+
%or1 = or i1 %xor.ab, %c
165+
%or2 = or i1 %or1, %not.bd
166+
%or3 = or i1 %or2, %a
167+
ret i1 %or3
168+
}
169+
170+
define i1 @leaf4_ret_leaf(i1 %a, i1 %b, i1 %c, i1 %d) {
171+
; CHECK-LABEL: @leaf4_ret_leaf(
172+
; CHECK-NEXT: [[BD:%.*]] = and i1 [[B:%.*]], [[D:%.*]]
173+
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[BD]], [[C:%.*]]
174+
; CHECK-NEXT: [[NOT_BD:%.*]] = xor i1 [[XOR]], true
175+
; CHECK-NEXT: [[XOR_AB:%.*]] = xor i1 [[A:%.*]], [[B]]
176+
; CHECK-NEXT: [[OR1:%.*]] = or i1 [[XOR_AB]], [[C]]
177+
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[NOT_BD]]
178+
; CHECK-NEXT: [[OR3:%.*]] = or i1 [[OR2]], [[A]]
179+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[OR3]], [[B]]
180+
; CHECK-NEXT: ret i1 [[AND]]
181+
;
182+
%bd = and i1 %b, %d
183+
%xor = xor i1 %bd, %c
184+
%not.bd = xor i1 %xor, true
185+
%xor.ab = xor i1 %a, %b
186+
%or1 = or i1 %xor.ab, %c
187+
%or2 = or i1 %or1, %not.bd
188+
%or3 = or i1 %or2, %a
189+
%and = and i1 %or3, %b
190+
ret i1 %and
191+
}
192+
193+
define i1 @leaf4_ret_leaf2(i1 %a, i1 %b, i1 %c, i1 %d) {
194+
; CHECK-LABEL: @leaf4_ret_leaf2(
195+
; CHECK-NEXT: [[BD:%.*]] = and i1 [[B:%.*]], [[D:%.*]]
196+
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[BD]], [[C:%.*]]
197+
; CHECK-NEXT: [[NOT_BD:%.*]] = xor i1 [[XOR]], true
198+
; CHECK-NEXT: [[XOR_AB:%.*]] = xor i1 [[A:%.*]], [[B]]
199+
; CHECK-NEXT: [[OR1:%.*]] = or i1 [[XOR_AB]], [[C]]
200+
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[NOT_BD]]
201+
; CHECK-NEXT: [[OR3:%.*]] = or i1 [[OR2]], [[A]]
202+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[OR3]], [[B]]
203+
; CHECK-NEXT: ret i1 [[AND]]
204+
;
205+
%bd = and i1 %b, %d
206+
%xor = xor i1 %bd, %c
207+
%not.bd = xor i1 %xor, true
208+
%xor.ab = xor i1 %a, %b
209+
%or1 = or i1 %xor.ab, %c
210+
%or2 = or i1 %or1, %not.bd
211+
%or3 = or i1 %or2, %a
212+
%and = and i1 %or3, %b
213+
ret i1 %and
214+
}

0 commit comments

Comments
 (0)