Skip to content

Commit c384c8c

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

File tree

1 file changed

+230
-0
lines changed

1 file changed

+230
-0
lines changed
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes='instcombine<no-verify-fixpoint>' -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_fail_tv_nonzero(i1 %c0, i8 %x, i8 %yy) {
22+
; CHECK-LABEL: @src_tv_eq_fail_tv_nonzero(
23+
; CHECK-NEXT: [[Y:%.*]] = add nsw i8 [[YY:%.*]], 1
24+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 1, i8 [[Y]]
25+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
26+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
27+
; CHECK-NEXT: ret i1 [[R]]
28+
;
29+
%y = add nsw i8 %yy, 1
30+
%sel = select i1 %c0, i8 1, i8 %y
31+
%selx = or i8 %sel, %x
32+
%r = icmp eq i8 %selx, 0
33+
ret i1 %r
34+
}
35+
36+
define i1 @src_fv_ne(i1 %c0, i8 %x, i8 %yy) {
37+
; CHECK-LABEL: @src_fv_ne(
38+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
39+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
40+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
41+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
42+
; CHECK-NEXT: ret i1 [[R]]
43+
;
44+
%y = add nuw i8 %yy, 1
45+
%sel = select i1 %c0, i8 %y, i8 0
46+
%selx = or i8 %sel, %x
47+
%r = icmp ne i8 %selx, 0
48+
ret i1 %r
49+
}
50+
51+
define i1 @src_fv_ne_fail_maybe_zero(i1 %c0, i8 %x, i8 %yy) {
52+
; CHECK-LABEL: @src_fv_ne_fail_maybe_zero(
53+
; CHECK-NEXT: [[Y:%.*]] = add nsw i8 [[YY:%.*]], 1
54+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
55+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
56+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
57+
; CHECK-NEXT: ret i1 [[R]]
58+
;
59+
%y = add nsw i8 %yy, 1
60+
%sel = select i1 %c0, i8 %y, i8 0
61+
%selx = or i8 %sel, %x
62+
%r = icmp ne i8 %selx, 0
63+
ret i1 %r
64+
}
65+
66+
define i1 @src_tv_ne(i1 %c0, i8 %x, i8 %yy) {
67+
; CHECK-LABEL: @src_tv_ne(
68+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
69+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 0, i8 [[Y]]
70+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
71+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
72+
; CHECK-NEXT: ret i1 [[R]]
73+
;
74+
%y = add nuw i8 %yy, 1
75+
%sel = select i1 %c0, i8 0, i8 %y
76+
%selx = or i8 %sel, %x
77+
%r = icmp ne i8 %selx, 0
78+
ret i1 %r
79+
}
80+
81+
define i1 @src_tv_ne_fail_cmp_nonzero(i1 %c0, i8 %x, i8 %yy) {
82+
; CHECK-LABEL: @src_tv_ne_fail_cmp_nonzero(
83+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
84+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 0, i8 [[Y]]
85+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
86+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 1
87+
; CHECK-NEXT: ret i1 [[R]]
88+
;
89+
%y = add nuw i8 %yy, 1
90+
%sel = select i1 %c0, i8 0, i8 %y
91+
%selx = or i8 %sel, %x
92+
%r = icmp ne i8 %selx, 1
93+
ret i1 %r
94+
}
95+
96+
define i1 @src_fv_eq(i1 %c0, i8 %x, i8 %yy) {
97+
; CHECK-LABEL: @src_fv_eq(
98+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
99+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
100+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
101+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
102+
; CHECK-NEXT: ret i1 [[R]]
103+
;
104+
%y = add nuw i8 %yy, 1
105+
%sel = select i1 %c0, i8 %y, i8 0
106+
%selx = or i8 %sel, %x
107+
%r = icmp eq i8 %selx, 0
108+
ret i1 %r
109+
}
110+
111+
define i1 @src_fv_eq_fail_cant_invert(i1 %c0, i8 %x, i8 %yy) {
112+
; CHECK-LABEL: @src_fv_eq_fail_cant_invert(
113+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
114+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0:%.*]], i8 [[Y]], i8 0
115+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
116+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
117+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
118+
; CHECK-NEXT: ret i1 [[R]]
119+
;
120+
%y = add nuw i8 %yy, 1
121+
%sel = select i1 %c0, i8 %y, i8 0
122+
%selx = or i8 %sel, %x
123+
%r = icmp eq i8 %selx, 0
124+
call void @use.i8(i8 %sel)
125+
ret i1 %r
126+
}
127+
128+
define i1 @src_fv_eq_fail_cant_invert2(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
129+
; CHECK-LABEL: @src_fv_eq_fail_cant_invert2(
130+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
131+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
132+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[Y]], i8 0
133+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
134+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
135+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
136+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
137+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
138+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
139+
; CHECK-NEXT: ret i1 [[R]]
140+
;
141+
%c0 = icmp ugt i8 %a, %b
142+
%y = add nuw i8 %yy, 1
143+
%sel = select i1 %c0, i8 %y, i8 0
144+
%cc = or i1 %c0, %c1
145+
%sel_other = select i1 %cc, i8 %y, i8 %b
146+
147+
%selx = or i8 %sel, %x
148+
%r = icmp eq i8 %selx, 0
149+
call void @use.i8(i8 %sel)
150+
call void @use.i8(i8 %sel_other)
151+
ret i1 %r
152+
}
153+
154+
define i1 @src_fv_eq_invert2(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
155+
; CHECK-LABEL: @src_fv_eq_invert2(
156+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
157+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
158+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[Y]], i8 0
159+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
160+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
161+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
162+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
163+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
164+
; CHECK-NEXT: ret i1 [[R]]
165+
;
166+
%c0 = icmp ugt i8 %a, %b
167+
%y = add nuw i8 %yy, 1
168+
%sel = select i1 %c0, i8 %y, i8 0
169+
%cc = or i1 %c0, %c1
170+
%sel_other = select i1 %cc, i8 %y, i8 %b
171+
172+
%selx = or i8 %sel, %x
173+
%r = icmp eq i8 %selx, 0
174+
call void @use.i8(i8 %sel_other)
175+
ret i1 %r
176+
}
177+
178+
define i1 @src_fv_eq_invert3(i8 %a, i8 %b, i8 %x, i8 %yy) {
179+
; CHECK-LABEL: @src_fv_eq_invert3(
180+
; CHECK-NEXT: [[C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
181+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
182+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C0]], i8 [[Y]], i8 0
183+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[C0]], i8 [[Y]], i8 [[B]]
184+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
185+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[SELX]], 0
186+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
187+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
188+
; CHECK-NEXT: ret i1 [[R]]
189+
;
190+
%c0 = icmp ugt i8 %a, %b
191+
%y = add nuw i8 %yy, 1
192+
%sel = select i1 %c0, i8 %y, i8 0
193+
%sel_other = select i1 %c0, i8 %y, i8 %b
194+
195+
%selx = or i8 %sel, %x
196+
%r = icmp eq i8 %selx, 0
197+
call void @use.i8(i8 %sel_other)
198+
call void @use.i8(i8 %sel)
199+
ret i1 %r
200+
}
201+
202+
define i1 @src_tv_ne_invert(i1 %c1, i8 %a, i8 %b, i8 %x, i8 %yy) {
203+
; CHECK-LABEL: @src_tv_ne_invert(
204+
; CHECK-NEXT: [[NOT_C0:%.*]] = icmp ugt i8 [[A:%.*]], [[B:%.*]]
205+
; CHECK-NEXT: call void @use.i1(i1 [[NOT_C0]])
206+
; CHECK-NEXT: [[C0:%.*]] = xor i1 [[NOT_C0]], true
207+
; CHECK-NEXT: [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
208+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[NOT_C0]], i8 [[Y]], i8 0
209+
; CHECK-NEXT: [[CC:%.*]] = or i1 [[C0]], [[C1:%.*]]
210+
; CHECK-NEXT: [[SEL_OTHER:%.*]] = select i1 [[CC]], i8 [[Y]], i8 [[B]]
211+
; CHECK-NEXT: [[SELX:%.*]] = or i8 [[SEL]], [[X:%.*]]
212+
; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[SELX]], 0
213+
; CHECK-NEXT: call void @use.i8(i8 [[SEL]])
214+
; CHECK-NEXT: call void @use.i8(i8 [[SEL_OTHER]])
215+
; CHECK-NEXT: ret i1 [[R]]
216+
;
217+
%not_c0 = icmp ugt i8 %a, %b
218+
call void @use.i1(i1 %not_c0)
219+
%c0 = xor i1 %not_c0, true
220+
%y = add nuw i8 %yy, 1
221+
%sel = select i1 %c0, i8 0, i8 %y
222+
%cc = or i1 %c0, %c1
223+
%sel_other = select i1 %cc, i8 %y, i8 %b
224+
225+
%selx = or i8 %sel, %x
226+
%r = icmp ne i8 %selx, 0
227+
call void @use.i8(i8 %sel)
228+
call void @use.i8(i8 %sel_other)
229+
ret i1 %r
230+
}

0 commit comments

Comments
 (0)