Skip to content

Commit 9026dff

Browse files
committed
[InstCombine] Add extra tests for known bits from dominating conds (NFC)
This adds test coverage for conditions with and/or.
1 parent cbe27c4 commit 9026dff

File tree

1 file changed

+242
-0
lines changed

1 file changed

+242
-0
lines changed

llvm/test/Transforms/InstCombine/known-bits.ll

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,246 @@ define void @test_udiv(i8 %x) {
4848
ret void
4949
}
5050

51+
define i8 @test_cond(i8 %x) {
52+
; CHECK-LABEL: @test_cond(
53+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
54+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
55+
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[EXIT:%.*]]
56+
; CHECK: if:
57+
; CHECK-NEXT: ret i8 -4
58+
; CHECK: exit:
59+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
60+
; CHECK-NEXT: ret i8 [[OR2]]
61+
;
62+
%and = and i8 %x, 3
63+
%cmp = icmp eq i8 %and, 0
64+
br i1 %cmp, label %if, label %exit
65+
66+
if:
67+
%or1 = or i8 %x, -4
68+
ret i8 %or1
69+
70+
exit:
71+
%or2 = or i8 %x, -4
72+
ret i8 %or2
73+
}
74+
75+
define i8 @test_cond_inv(i8 %x) {
76+
; CHECK-LABEL: @test_cond_inv(
77+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
78+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[AND]], 0
79+
; CHECK-NEXT: call void @use(i1 [[CMP]])
80+
; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[IF:%.*]]
81+
; CHECK: if:
82+
; CHECK-NEXT: ret i8 -4
83+
; CHECK: exit:
84+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
85+
; CHECK-NEXT: ret i8 [[OR2]]
86+
;
87+
%and = and i8 %x, 3
88+
%cmp = icmp ne i8 %and, 0
89+
call void @use(i1 %cmp)
90+
br i1 %cmp, label %exit, label %if
91+
92+
if:
93+
%or1 = or i8 %x, -4
94+
ret i8 %or1
95+
96+
exit:
97+
%or2 = or i8 %x, -4
98+
ret i8 %or2
99+
}
100+
101+
define i8 @test_cond_and(i8 %x, i1 %c) {
102+
; CHECK-LABEL: @test_cond_and(
103+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
104+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
105+
; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP]], [[C:%.*]]
106+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
107+
; CHECK: if:
108+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
109+
; CHECK-NEXT: ret i8 [[OR1]]
110+
; CHECK: exit:
111+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
112+
; CHECK-NEXT: ret i8 [[OR2]]
113+
;
114+
%and = and i8 %x, 3
115+
%cmp = icmp eq i8 %and, 0
116+
%cond = and i1 %cmp, %c
117+
br i1 %cond, label %if, label %exit
118+
119+
if:
120+
%or1 = or i8 %x, -4
121+
ret i8 %or1
122+
123+
exit:
124+
%or2 = or i8 %x, -4
125+
ret i8 %or2
126+
}
127+
128+
define i8 @test_cond_and_commuted(i8 %x, i1 %c1, i1 %c2) {
129+
; CHECK-LABEL: @test_cond_and_commuted(
130+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
131+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
132+
; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1:%.*]], [[C2:%.*]]
133+
; CHECK-NEXT: [[COND:%.*]] = and i1 [[C3]], [[CMP]]
134+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
135+
; CHECK: if:
136+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
137+
; CHECK-NEXT: ret i8 [[OR1]]
138+
; CHECK: exit:
139+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
140+
; CHECK-NEXT: ret i8 [[OR2]]
141+
;
142+
%and = and i8 %x, 3
143+
%cmp = icmp eq i8 %and, 0
144+
%c3 = and i1 %c1, %c2
145+
%cond = and i1 %c3, %cmp
146+
br i1 %cond, label %if, label %exit
147+
148+
if:
149+
%or1 = or i8 %x, -4
150+
ret i8 %or1
151+
152+
exit:
153+
%or2 = or i8 %x, -4
154+
ret i8 %or2
155+
}
156+
157+
define i8 @test_cond_logical_and(i8 %x, i1 %c) {
158+
; CHECK-LABEL: @test_cond_logical_and(
159+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
160+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
161+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i1 [[C:%.*]], i1 false
162+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
163+
; CHECK: if:
164+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
165+
; CHECK-NEXT: ret i8 [[OR1]]
166+
; CHECK: exit:
167+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
168+
; CHECK-NEXT: ret i8 [[OR2]]
169+
;
170+
%and = and i8 %x, 3
171+
%cmp = icmp eq i8 %and, 0
172+
%cond = select i1 %cmp, i1 %c, i1 false
173+
br i1 %cond, label %if, label %exit
174+
175+
if:
176+
%or1 = or i8 %x, -4
177+
ret i8 %or1
178+
179+
exit:
180+
%or2 = or i8 %x, -4
181+
ret i8 %or2
182+
}
183+
184+
define i8 @test_cond_or_invalid(i8 %x, i1 %c) {
185+
; CHECK-LABEL: @test_cond_or_invalid(
186+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
187+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
188+
; CHECK-NEXT: [[COND:%.*]] = or i1 [[CMP]], [[C:%.*]]
189+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
190+
; CHECK: if:
191+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
192+
; CHECK-NEXT: ret i8 [[OR1]]
193+
; CHECK: exit:
194+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
195+
; CHECK-NEXT: ret i8 [[OR2]]
196+
;
197+
%and = and i8 %x, 3
198+
%cmp = icmp eq i8 %and, 0
199+
%cond = or i1 %cmp, %c
200+
br i1 %cond, label %if, label %exit
201+
202+
if:
203+
%or1 = or i8 %x, -4
204+
ret i8 %or1
205+
206+
exit:
207+
%or2 = or i8 %x, -4
208+
ret i8 %or2
209+
}
210+
211+
define i8 @test_cond_inv_or(i8 %x, i1 %c) {
212+
; CHECK-LABEL: @test_cond_inv_or(
213+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
214+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[AND]], 0
215+
; CHECK-NEXT: [[COND:%.*]] = or i1 [[CMP]], [[C:%.*]]
216+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
217+
; CHECK: if:
218+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
219+
; CHECK-NEXT: ret i8 [[OR1]]
220+
; CHECK: exit:
221+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
222+
; CHECK-NEXT: ret i8 [[OR2]]
223+
;
224+
%and = and i8 %x, 3
225+
%cmp = icmp ne i8 %and, 0
226+
%cond = or i1 %cmp, %c
227+
br i1 %cond, label %if, label %exit
228+
229+
if:
230+
%or1 = or i8 %x, -4
231+
ret i8 %or1
232+
233+
exit:
234+
%or2 = or i8 %x, -4
235+
ret i8 %or2
236+
}
237+
238+
define i8 @test_cond_inv_logical_or(i8 %x, i1 %c) {
239+
; CHECK-LABEL: @test_cond_inv_logical_or(
240+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
241+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[AND]], 0
242+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP_NOT]], i1 [[C:%.*]], i1 false
243+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
244+
; CHECK: if:
245+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
246+
; CHECK-NEXT: ret i8 [[OR1]]
247+
; CHECK: exit:
248+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
249+
; CHECK-NEXT: ret i8 [[OR2]]
250+
;
251+
%and = and i8 %x, 3
252+
%cmp = icmp ne i8 %and, 0
253+
%cond = select i1 %cmp, i1 false, i1 %c
254+
br i1 %cond, label %if, label %exit
255+
256+
if:
257+
%or1 = or i8 %x, -4
258+
ret i8 %or1
259+
260+
exit:
261+
%or2 = or i8 %x, -4
262+
ret i8 %or2
263+
}
264+
265+
define i8 @test_cond_inv_and_invalid(i8 %x, i1 %c) {
266+
; CHECK-LABEL: @test_cond_inv_and_invalid(
267+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
268+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[AND]], 0
269+
; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP]], [[C:%.*]]
270+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
271+
; CHECK: if:
272+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
273+
; CHECK-NEXT: ret i8 [[OR1]]
274+
; CHECK: exit:
275+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
276+
; CHECK-NEXT: ret i8 [[OR2]]
277+
;
278+
%and = and i8 %x, 3
279+
%cmp = icmp ne i8 %and, 0
280+
%cond = and i1 %cmp, %c
281+
br i1 %cond, label %if, label %exit
282+
283+
if:
284+
%or1 = or i8 %x, -4
285+
ret i8 %or1
286+
287+
exit:
288+
%or2 = or i8 %x, -4
289+
ret i8 %or2
290+
}
291+
292+
declare void @use(i1)
51293
declare void @sink(i8)

0 commit comments

Comments
 (0)