Skip to content

Commit 8fda5ba

Browse files
committed
[InstCombine] Add tests for folding (icmp eq/ne (or (select cond, 0/NZ, 0/NZ), X), 0); NFC
1 parent d77f07d commit 8fda5ba

File tree

1 file changed

+297
-0
lines changed

1 file changed

+297
-0
lines changed
Lines changed: 297 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,297 @@
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.i8(i8)
5+
declare void @use.i1(i1)
6+
define i1 @src_tv_eq(i1 %c0, i8 %x, i8 %yy) {
7+
; CHECK-LABEL: @src_tv_eq(
8+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
9+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 0, i8 [[Y]]
10+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
11+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
12+
; CHECK-NEXT: ret i1 [[R]]
13+
;
14+
%y = add nuw i8 %yy, 1
15+
%sel = select i1 %c0, i8 0, i8 %y
16+
%selx = or i8 %sel, %x
17+
%r = icmp eq i8 %selx, 0
18+
ret i1 %r
19+
}
20+
21+
define i1 @src_tv_eq_multiuse_or_fail(i1 %c0, i8 %x, i8 %yy) {
22+
; CHECK-LABEL: @src_tv_eq_multiuse_or_fail(
23+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
24+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 0, i8 [[Y]]
25+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
26+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
27+
; CHECK-NEXT: call void @use.i8(i8 [[SELX]])
28+
; CHECK-NEXT: ret i1 [[R]]
29+
;
30+
%y = add nuw i8 %yy, 1
31+
%sel = select i1 %c0, i8 0, i8 %y
32+
%selx = or i8 %sel, %x
33+
%r = icmp eq i8 %selx, 0
34+
call void @use.i8(i8 %selx)
35+
ret i1 %r
36+
}
37+
38+
define i1 @src_tv_eq_fail_tv_nonzero(i1 %c0, i8 %x, i8 %yy) {
39+
; CHECK-LABEL: @src_tv_eq_fail_tv_nonzero(
40+
; CHECK-NEXT: [[Y:%.*]] = add nsw i8 [[YY:%.*]], 1
41+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 1, i8 [[Y]]
42+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
43+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
44+
; CHECK-NEXT: ret i1 [[R]]
45+
;
46+
%y = add nsw i8 %yy, 1
47+
%sel = select i1 %c0, i8 1, i8 %y
48+
%selx = or i8 %sel, %x
49+
%r = icmp eq i8 %selx, 0
50+
ret i1 %r
51+
}
52+
53+
define i1 @src_fv_ne(i1 %c0, i8 %x, i8 %yy) {
54+
; CHECK-LABEL: @src_fv_ne(
55+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
56+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
57+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
58+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
59+
; CHECK-NEXT: ret i1 [[R]]
60+
;
61+
%y = add nuw i8 %yy, 1
62+
%sel = select i1 %c0, i8 %y, i8 0
63+
%selx = or i8 %sel, %x
64+
%r = icmp ne i8 %selx, 0
65+
ret i1 %r
66+
}
67+
68+
define i1 @src_fv_ne_fail_maybe_zero(i1 %c0, i8 %x, i8 %yy) {
69+
; CHECK-LABEL: @src_fv_ne_fail_maybe_zero(
70+
; CHECK-NEXT: [[Y:%.*]] = add nsw i8 [[YY:%.*]], 1
71+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
72+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
73+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
74+
; CHECK-NEXT: ret i1 [[R]]
75+
;
76+
%y = add nsw i8 %yy, 1
77+
%sel = select i1 %c0, i8 %y, i8 0
78+
%selx = or i8 %sel, %x
79+
%r = icmp ne i8 %selx, 0
80+
ret i1 %r
81+
}
82+
83+
define i1 @src_tv_ne(i1 %c0, i8 %x, i8 %yy) {
84+
; CHECK-LABEL: @src_tv_ne(
85+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
86+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 0, i8 [[Y]]
87+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
88+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
89+
; CHECK-NEXT: ret i1 [[R]]
90+
;
91+
%y = add nuw i8 %yy, 1
92+
%sel = select i1 %c0, i8 0, i8 %y
93+
%selx = or i8 %sel, %x
94+
%r = icmp ne i8 %selx, 0
95+
ret i1 %r
96+
}
97+
98+
define i1 @src_tv_ne_fail_cmp_nonzero(i1 %c0, i8 %x, i8 %yy) {
99+
; CHECK-LABEL: @src_tv_ne_fail_cmp_nonzero(
100+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
101+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 0, i8 [[Y]]
102+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
103+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 1
104+
; CHECK-NEXT: ret i1 [[R]]
105+
;
106+
%y = add nuw i8 %yy, 1
107+
%sel = select i1 %c0, i8 0, i8 %y
108+
%selx = or i8 %sel, %x
109+
%r = icmp ne i8 %selx, 1
110+
ret i1 %r
111+
}
112+
113+
define i1 @src_fv_eq(i1 %c0, i8 %x, i8 %yy) {
114+
; CHECK-LABEL: @src_fv_eq(
115+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
116+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
117+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
118+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
119+
; CHECK-NEXT: ret i1 [[R]]
120+
;
121+
%y = add nuw i8 %yy, 1
122+
%sel = select i1 %c0, i8 %y, i8 0
123+
%selx = or i8 %sel, %x
124+
%r = icmp eq i8 %selx, 0
125+
ret i1 %r
126+
}
127+
128+
define i1 @src_fv_eq_fail_cant_invert(i1 %c0, i8 %x, i8 %yy) {
129+
; CHECK-LABEL: @src_fv_eq_fail_cant_invert(
130+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
131+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
132+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
133+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
134+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
135+
; CHECK-NEXT: ret i1 [[R]]
136+
;
137+
%y = add nuw i8 %yy, 1
138+
%sel = select i1 %c0, i8 %y, i8 0
139+
%selx = or i8 %sel, %x
140+
%r = icmp eq i8 %selx, 0
141+
call void @use.i8(i8 %sel)
142+
ret i1 %r
143+
}
144+
145+
define i1 @src_fv_eq_fail_cant_invert2(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
146+
; CHECK-LABEL: @src_fv_eq_fail_cant_invert2(
147+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
148+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
149+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[Y]], i8 0
150+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
151+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
152+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
153+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
154+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
155+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
156+
; CHECK-NEXT: ret i1 [[R]]
157+
;
158+
%c0 = icmp ugt i8 %a, %b
159+
%y = add nuw i8 %yy, 1
160+
%sel = select i1 %c0, i8 %y, i8 0
161+
%cc = or i1 %c0, %c1
162+
%sel_other = select i1 %cc, i8 %y, i8 %b
163+
164+
%selx = or i8 %sel, %x
165+
%r = icmp eq i8 %selx, 0
166+
call void @use.i8(i8 %sel)
167+
call void @use.i8(i8 %sel_other)
168+
ret i1 %r
169+
}
170+
171+
define i1 @src_fv_eq_invert2(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
172+
; CHECK-LABEL: @src_fv_eq_invert2(
173+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
174+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
175+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[Y]], i8 0
176+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
177+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
178+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
179+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
180+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
181+
; CHECK-NEXT: ret i1 [[R]]
182+
;
183+
%c0 = icmp ugt i8 %a, %b
184+
%y = add nuw i8 %yy, 1
185+
%sel = select i1 %c0, i8 %y, i8 0
186+
%cc = or i1 %c0, %c1
187+
%sel_other = select i1 %cc, i8 %y, i8 %b
188+
189+
%selx = or i8 %sel, %x
190+
%r = icmp eq i8 %selx, 0
191+
call void @use.i8(i8 %sel_other)
192+
ret i1 %r
193+
}
194+
195+
define i1 @src_fv_eq_invert2_fail_wrong_binop(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
196+
; CHECK-LABEL: @src_fv_eq_invert2_fail_wrong_binop(
197+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
198+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
199+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[Y]], i8 0
200+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
201+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
202+
; CHECK-NEXT: [[SELX:%.*]] = sub i8 0, [[X:%.*]]
203+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SEL]], [[SELX]]
204+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
205+
; CHECK-NEXT: ret i1 [[R]]
206+
;
207+
%c0 = icmp ugt i8 %a, %b
208+
%y = add nuw i8 %yy, 1
209+
%sel = select i1 %c0, i8 %y, i8 0
210+
%cc = or i1 %c0, %c1
211+
%sel_other = select i1 %cc, i8 %y, i8 %b
212+
213+
%selx = add i8 %sel, %x
214+
%r = icmp eq i8 %selx, 0
215+
call void @use.i8(i8 %sel_other)
216+
ret i1 %r
217+
}
218+
219+
define i1 @src_fv_eq_invert2_fail_bad_sel(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
220+
; CHECK-LABEL: @src_fv_eq_invert2_fail_bad_sel(
221+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
222+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
223+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[YY]], i8 0
224+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
225+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
226+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
227+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
228+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
229+
; CHECK-NEXT: call void @use.i8(i8 [[YY]])
230+
; CHECK-NEXT: ret i1 [[R]]
231+
;
232+
%c0 = icmp ugt i8 %a, %b
233+
%y = add nuw i8 %yy, 1
234+
%sel = select i1 %c0, i8 %yy, i8 0
235+
%cc = or i1 %c0, %c1
236+
%sel_other = select i1 %cc, i8 %y, i8 %b
237+
238+
%selx = or i8 %sel, %x
239+
%r = icmp eq i8 %selx, 0
240+
call void @use.i8(i8 %sel_other)
241+
call void @use.i8(i8 %yy)
242+
ret i1 %r
243+
}
244+
245+
define i1 @src_fv_eq_invert3(i8 %a, i8 %b, i8 %x, i8 %yy) {
246+
; CHECK-LABEL: @src_fv_eq_invert3(
247+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
248+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
249+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[Y]], i8 0
250+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[C0]], i8 [[Y]], i8 [[B]]
251+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
252+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
253+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
254+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
255+
; CHECK-NEXT: ret i1 [[R]]
256+
;
257+
%c0 = icmp ugt i8 %a, %b
258+
%y = add nuw i8 %yy, 1
259+
%sel = select i1 %c0, i8 %y, i8 0
260+
%sel_other = select i1 %c0, i8 %y, i8 %b
261+
262+
%selx = or i8 %sel, %x
263+
%r = icmp eq i8 %selx, 0
264+
call void @use.i8(i8 %sel_other)
265+
call void @use.i8(i8 %sel)
266+
ret i1 %r
267+
}
268+
269+
define i1 @src_tv_ne_invert(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
270+
; CHECK-LABEL: @src_tv_ne_invert(
271+
; CHECK-NEXT: [[NOT_C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
272+
; CHECK-NEXT: call void @use.i1(i1 [[NOT_C0]])
273+
; CHECK-NEXT: [[C0:%.*]] = xor i1 [[NOT_C0]], true
274+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
275+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[NOT_C0]], i8 [[Y]], i8 0
276+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
277+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
278+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
279+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
280+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
281+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
282+
; CHECK-NEXT: ret i1 [[R]]
283+
;
284+
%not_c0 = icmp ugt i8 %a, %b
285+
call void @use.i1(i1 %not_c0)
286+
%c0 = xor i1 %not_c0, true
287+
%y = add nuw i8 %yy, 1
288+
%sel = select i1 %c0, i8 0, i8 %y
289+
%cc = or i1 %c0, %c1
290+
%sel_other = select i1 %cc, i8 %y, i8 %b
291+
292+
%selx = or i8 %sel, %x
293+
%r = icmp ne i8 %selx, 0
294+
call void @use.i8(i8 %sel)
295+
call void @use.i8(i8 %sel_other)
296+
ret i1 %r
297+
}

0 commit comments

Comments
 (0)