xref: /llvm-project/llvm/test/Analysis/ValueTracking/select-known-non-zero-const.ll (revision 2622b2f409f7a7a51f11d5eab3976785b47c1a7b)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4declare void @llvm.assume(i1)
5define <2 x i1> @select_v_ne_z(<2 x i8> %v, <2 x i8> %yy) {
6; CHECK-LABEL: @select_v_ne_z(
7; CHECK-NEXT:    ret <2 x i1> zeroinitializer
8;
9  %y = or <2 x i8> %yy, <i8 1, i8 1>
10  %cmp = icmp ne <2 x i8> %v, zeroinitializer
11  %s = select <2 x i1> %cmp, <2 x i8> %v, <2 x i8> %y
12  %r = icmp eq <2 x i8> %s, zeroinitializer
13  ret <2 x i1> %r
14}
15
16define i1 @select_v_ne_fail(i8 %v, i8 %y) {
17; CHECK-LABEL: @select_v_ne_fail(
18; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
19; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
20; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[V:%.*]], 1
21; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
22; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
23; CHECK-NEXT:    ret i1 [[R]]
24;
25  %ynz = icmp ne i8 %y, 0
26  call void @llvm.assume(i1 %ynz)
27  %cmp = icmp ne i8 %v, 1
28  %s = select i1 %cmp, i8 %v, i8 %y
29  %r = icmp eq i8 %s, 0
30  ret i1 %r
31}
32
33define i1 @select_v_eq_nz(i8 %v, i8 %y) {
34; CHECK-LABEL: @select_v_eq_nz(
35; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
36; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
37; CHECK-NEXT:    ret i1 false
38;
39  %ynz = icmp ne i8 %y, 0
40  call void @llvm.assume(i1 %ynz)
41  %cmp = icmp eq i8 44, %v
42  %s = select i1 %cmp, i8 %v, i8 %y
43  %r = icmp eq i8 %s, 0
44  ret i1 %r
45}
46
47define i1 @inv_select_v_ugt_nz(i8 %v, i8 %C, i8 %y) {
48; CHECK-LABEL: @inv_select_v_ugt_nz(
49; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
50; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
51; CHECK-NEXT:    ret i1 false
52;
53  %ynz = icmp ne i8 %y, 0
54  call void @llvm.assume(i1 %ynz)
55  %cmp = icmp ugt i8 14, %v
56  %s = select i1 %cmp, i8 %y, i8 %v
57  %r = icmp eq i8 %s, 0
58  ret i1 %r
59}
60
61define i1 @inv_select_v_ugt_fail(i8 %v, i8 %C, i8 %y) {
62; CHECK-LABEL: @inv_select_v_ugt_fail(
63; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
64; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
65; CHECK-NEXT:    ret i1 false
66;
67  %ynz = icmp ne i8 %y, 0
68  call void @llvm.assume(i1 %ynz)
69  %cmp = icmp ugt i8 -2, %v
70  %s = select i1 %cmp, i8 %y, i8 %v
71  %r = icmp eq i8 %s, 0
72  ret i1 %r
73}
74
75define <2 x i1> @select_v_ult(<2 x i8> %v, <2 x i8> %C, <2 x i8> %yy) {
76; CHECK-LABEL: @select_v_ult(
77; CHECK-NEXT:    ret <2 x i1> zeroinitializer
78;
79  %y = or <2 x i8> %yy, <i8 1, i8 1>
80  %cmp = icmp ult <2 x i8> %C, %v
81  %s = select <2 x i1> %cmp, <2 x i8> %v, <2 x i8> %y
82  %r = icmp eq <2 x i8> %s, zeroinitializer
83  ret <2 x i1> %r
84}
85
86define <2 x i1> @select_v_uge_nz(<2 x i8> %v, <2 x i8> %yy) {
87; CHECK-LABEL: @select_v_uge_nz(
88; CHECK-NEXT:    ret <2 x i1> zeroinitializer
89;
90  %y = or <2 x i8> %yy, <i8 1, i8 1>
91  %cmp = icmp uge <2 x i8> %v, <i8 1, i8 1>
92  %s = select <2 x i1> %cmp, <2 x i8> %v, <2 x i8> %y
93  %r = icmp eq <2 x i8> %s, zeroinitializer
94  ret <2 x i1> %r
95}
96
97define i1 @inv_select_v_ule(i8 %v, i8 %y) {
98; CHECK-LABEL: @inv_select_v_ule(
99; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
100; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
101; CHECK-NEXT:    ret i1 false
102;
103  %ynz = icmp ne i8 %y, 0
104  call void @llvm.assume(i1 %ynz)
105  %cmp = icmp ule i8 %v, 4
106  %s = select i1 %cmp, i8 %y, i8 %v
107  %r = icmp eq i8 %s, 0
108  ret i1 %r
109}
110
111define i1 @select_v_sgt_nonneg(i8 %v, i8 %y) {
112; CHECK-LABEL: @select_v_sgt_nonneg(
113; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
114; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
115; CHECK-NEXT:    ret i1 false
116;
117  %ynz = icmp ne i8 %y, 0
118  call void @llvm.assume(i1 %ynz)
119  %cmp = icmp sgt i8 %v, 0
120  %s = select i1 %cmp, i8 %v, i8 %y
121  %r = icmp eq i8 %s, 0
122  ret i1 %r
123}
124
125define i1 @select_v_sgt_fail(i8 %v, i8 %y) {
126; CHECK-LABEL: @select_v_sgt_fail(
127; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
128; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
129; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], -1
130; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
131; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
132; CHECK-NEXT:    ret i1 [[R]]
133;
134  %ynz = icmp ne i8 %y, 0
135  call void @llvm.assume(i1 %ynz)
136  %cmp = icmp sgt i8 %v, -1
137  %s = select i1 %cmp, i8 %v, i8 %y
138  %r = icmp eq i8 %s, 0
139  ret i1 %r
140}
141
142define i1 @inv_select_v_sgt_neg(i8 %v, i8 %y) {
143; CHECK-LABEL: @inv_select_v_sgt_neg(
144; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
145; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
146; CHECK-NEXT:    ret i1 false
147;
148  %ynz = icmp ne i8 %y, 0
149  call void @llvm.assume(i1 %ynz)
150  %cmp = icmp sgt i8 %v, -1
151  %s = select i1 %cmp, i8 %y, i8 %v
152  %r = icmp eq i8 %s, 0
153  ret i1 %r
154}
155
156define i1 @inv_select_v_sgt_nonneg_nz(i8 %v, i8 %C, i8 %y) {
157; CHECK-LABEL: @inv_select_v_sgt_nonneg_nz(
158; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
159; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
160; CHECK-NEXT:    ret i1 false
161;
162  %ynz = icmp ne i8 %y, 0
163  call void @llvm.assume(i1 %ynz)
164  %cmp = icmp sgt i8 99, %v
165  %s = select i1 %cmp, i8 %y, i8 %v
166  %r = icmp eq i8 %s, 0
167  ret i1 %r
168}
169
170define i1 @select_v_slt_nonneg(i8 %v, i8 %y) {
171; CHECK-LABEL: @select_v_slt_nonneg(
172; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
173; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
174; CHECK-NEXT:    ret i1 false
175;
176  %ynz = icmp ne i8 %y, 0
177  call void @llvm.assume(i1 %ynz)
178  %cmp = icmp slt i8 0, %v
179  %s = select i1 %cmp, i8 %v, i8 %y
180  %r = icmp eq i8 %s, 0
181  ret i1 %r
182}
183
184define i1 @select_v_slt_nonneg_fail(i8 %v, i8 %C, i8 %y) {
185; CHECK-LABEL: @select_v_slt_nonneg_fail(
186; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
187; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
188; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 -1, [[V:%.*]]
189; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
190; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
191; CHECK-NEXT:    ret i1 [[R]]
192;
193  %ynz = icmp ne i8 %y, 0
194  call void @llvm.assume(i1 %ynz)
195  %cmp = icmp slt i8 -1, %v
196  %s = select i1 %cmp, i8 %v, i8 %y
197  %r = icmp eq i8 %s, 0
198  ret i1 %r
199}
200
201define i1 @select_v_slt_neg(i8 %v, i8 %y) {
202; CHECK-LABEL: @select_v_slt_neg(
203; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
204; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
205; CHECK-NEXT:    ret i1 false
206;
207  %ynz = icmp ne i8 %y, 0
208  call void @llvm.assume(i1 %ynz)
209  %cmp = icmp slt i8 %v, -1
210  %s = select i1 %cmp, i8 %v, i8 %y
211  %r = icmp eq i8 %s, 0
212  ret i1 %r
213}
214
215define i1 @select_v_sge_nonneg_nz(i8 %v, i8 %y) {
216; CHECK-LABEL: @select_v_sge_nonneg_nz(
217; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
218; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
219; CHECK-NEXT:    ret i1 false
220;
221  %ynz = icmp ne i8 %y, 0
222  call void @llvm.assume(i1 %ynz)
223  %cmp = icmp sge i8 %v, 1
224  %s = select i1 %cmp, i8 %v, i8 %y
225  %r = icmp eq i8 %s, 0
226  ret i1 %r
227}
228
229define i1 @select_v_sge_neg(i8 %v, i8 %y) {
230; CHECK-LABEL: @select_v_sge_neg(
231; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
232; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
233; CHECK-NEXT:    ret i1 false
234;
235  %ynz = icmp ne i8 %y, 0
236  call void @llvm.assume(i1 %ynz)
237  %cmp = icmp sge i8 -3, %v
238  %s = select i1 %cmp, i8 %v, i8 %y
239  %r = icmp eq i8 %s, 0
240  ret i1 %r
241}
242
243define i1 @inv_select_v_sge_z(i8 %v, i8 %y) {
244; CHECK-LABEL: @inv_select_v_sge_z(
245; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
246; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
247; CHECK-NEXT:    ret i1 false
248;
249  %ynz = icmp ne i8 %y, 0
250  call void @llvm.assume(i1 %ynz)
251  %cmp = icmp sge i8 %v, 0
252  %s = select i1 %cmp, i8 %y, i8 %v
253  %r = icmp eq i8 %s, 0
254  ret i1 %r
255}
256
257define i1 @inv_select_v_sge_fail(i8 %v, i8 %C, i8 %y) {
258; CHECK-LABEL: @inv_select_v_sge_fail(
259; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
260; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
261; CHECK-NEXT:    ret i1 false
262;
263  %ynz = icmp ne i8 %y, 0
264  call void @llvm.assume(i1 %ynz)
265  %cmp = icmp sge i8 %v, -44
266  %s = select i1 %cmp, i8 %y, i8 %v
267  %r = icmp eq i8 %s, 0
268  ret i1 %r
269}
270
271define i1 @select_v_sle_neg(i8 %v, i8 %y) {
272; CHECK-LABEL: @select_v_sle_neg(
273; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
274; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
275; CHECK-NEXT:    ret i1 false
276;
277  %ynz = icmp ne i8 %y, 0
278  call void @llvm.assume(i1 %ynz)
279  %cmp = icmp sle i8 %v, -1
280  %s = select i1 %cmp, i8 %v, i8 %y
281  %r = icmp eq i8 %s, 0
282  ret i1 %r
283}
284
285define i1 @select_v_sle_nonneg_nz(i8 %v, i8 %y) {
286; CHECK-LABEL: @select_v_sle_nonneg_nz(
287; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
288; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
289; CHECK-NEXT:    ret i1 false
290;
291  %ynz = icmp ne i8 %y, 0
292  call void @llvm.assume(i1 %ynz)
293  %cmp = icmp sle i8 1, %v
294  %s = select i1 %cmp, i8 %v, i8 %y
295  %r = icmp eq i8 %s, 0
296  ret i1 %r
297}
298
299define i1 @select_v_sle_fail(i8 %v, i8 %y) {
300; CHECK-LABEL: @select_v_sle_fail(
301; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
302; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
303; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 0, [[V:%.*]]
304; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
305; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
306; CHECK-NEXT:    ret i1 [[R]]
307;
308  %ynz = icmp ne i8 %y, 0
309  call void @llvm.assume(i1 %ynz)
310  %cmp = icmp sle i8 0, %v
311  %s = select i1 %cmp, i8 %v, i8 %y
312  %r = icmp eq i8 %s, 0
313  ret i1 %r
314}
315
316define i1 @inv_select_v_sle_nonneg(i8 %v, i8 %y) {
317; CHECK-LABEL: @inv_select_v_sle_nonneg(
318; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
319; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
320; CHECK-NEXT:    ret i1 false
321;
322  %ynz = icmp ne i8 %y, 0
323  call void @llvm.assume(i1 %ynz)
324  %cmp = icmp sle i8 %v, 0
325  %s = select i1 %cmp, i8 %y, i8 %v
326  %r = icmp eq i8 %s, 0
327  ret i1 %r
328}
329