xref: /llvm-project/llvm/test/Analysis/ValueTracking/select-known-non-zero.ll (revision ab3fdbdfbe7edc62049c602d87be91c3ad3f5e3b)
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)
5declare void @use(i64)
6declare void @use4(i4)
7
8define i1 @select_v_ne_fail(i8 %v, i8 %C, i8 %y) {
9; CHECK-LABEL: @select_v_ne_fail(
10; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
11; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
12; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[V:%.*]], [[C:%.*]]
13; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
14; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
15; CHECK-NEXT:    ret i1 [[R]]
16;
17  %ynz = icmp ne i8 %y, 0
18  call void @llvm.assume(i1 %ynz)
19  %cmp = icmp ne i8 %v, %C
20  %s = select i1 %cmp, i8 %v, i8 %y
21  %r = icmp eq i8 %s, 0
22  ret i1 %r
23}
24
25define i1 @select_v_eq_nz(i8 %v, i8 %C, i8 %y) {
26; CHECK-LABEL: @select_v_eq_nz(
27; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
28; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
29; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0
30; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
31; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C]], [[V:%.*]]
32; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
33; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
34; CHECK-NEXT:    ret i1 [[R]]
35;
36  %ynz = icmp ne i8 %y, 0
37  call void @llvm.assume(i1 %ynz)
38  %pcond0 = icmp ne i8 %C, 0
39  call void @llvm.assume(i1 %pcond0)
40  %cmp = icmp eq i8 %C, %v
41  %s = select i1 %cmp, i8 %v, i8 %y
42  %r = icmp eq i8 %s, 0
43  ret i1 %r
44}
45
46define i1 @inv_select_v_ugt_nz(i8 %v, i8 %C, i8 %y) {
47; CHECK-LABEL: @inv_select_v_ugt_nz(
48; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
49; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
50; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0
51; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
52; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]]
53; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
54; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
55; CHECK-NEXT:    ret i1 [[R]]
56;
57  %ynz = icmp ne i8 %y, 0
58  call void @llvm.assume(i1 %ynz)
59  %pcond0 = icmp ne i8 %C, 0
60  call void @llvm.assume(i1 %pcond0)
61  %cmp = icmp ugt i8 %C, %v
62  %s = select i1 %cmp, i8 %y, i8 %v
63  %r = icmp eq i8 %s, 0
64  ret i1 %r
65}
66
67define i1 @inv_select_v_ugt_fail(i8 %v, i8 %C, i8 %y) {
68; CHECK-LABEL: @inv_select_v_ugt_fail(
69; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
70; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
71; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -8
72; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
73; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]]
74; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
75; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
76; CHECK-NEXT:    ret i1 [[R]]
77;
78  %ynz = icmp ne i8 %y, 0
79  call void @llvm.assume(i1 %ynz)
80  %pcond0 = icmp sge i8 %C, -8
81  call void @llvm.assume(i1 %pcond0)
82  %cmp = icmp ugt i8 %C, %v
83  %s = select i1 %cmp, i8 %y, i8 %v
84  %r = icmp eq i8 %s, 0
85  ret i1 %r
86}
87
88define i1 @select_v_uge_nz(i8 %v, i8 %C, i8 %y) {
89; CHECK-LABEL: @select_v_uge_nz(
90; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
91; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
92; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0
93; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
94; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i8 [[V:%.*]], [[C]]
95; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
96; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
97; CHECK-NEXT:    ret i1 [[R]]
98;
99  %ynz = icmp ne i8 %y, 0
100  call void @llvm.assume(i1 %ynz)
101  %pcond0 = icmp ne i8 %C, 0
102  call void @llvm.assume(i1 %pcond0)
103  %cmp = icmp uge i8 %v, %C
104  %s = select i1 %cmp, i8 %v, i8 %y
105  %r = icmp eq i8 %s, 0
106  ret i1 %r
107}
108
109define i1 @select_v_sgt_nonneg(i8 %v, i8 %C, i8 %y) {
110; CHECK-LABEL: @select_v_sgt_nonneg(
111; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
112; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
113; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
114; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
115; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]
116; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
117; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
118; CHECK-NEXT:    ret i1 [[R]]
119;
120  %ynz = icmp ne i8 %y, 0
121  call void @llvm.assume(i1 %ynz)
122  %pcond0 = icmp sge i8 %C, 0
123  call void @llvm.assume(i1 %pcond0)
124  %cmp = icmp sgt i8 %v, %C
125  %s = select i1 %cmp, i8 %v, i8 %y
126  %r = icmp eq i8 %s, 0
127  ret i1 %r
128}
129
130define i1 @select_v_sgt_fail(i8 %v, i8 %C, i8 %y) {
131; CHECK-LABEL: @select_v_sgt_fail(
132; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
133; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
134; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -4
135; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
136; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]
137; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
138; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
139; CHECK-NEXT:    ret i1 [[R]]
140;
141  %ynz = icmp ne i8 %y, 0
142  call void @llvm.assume(i1 %ynz)
143  %pcond0 = icmp sge i8 %C, -4
144  call void @llvm.assume(i1 %pcond0)
145  %cmp = icmp sgt i8 %v, %C
146  %s = select i1 %cmp, i8 %v, i8 %y
147  %r = icmp eq i8 %s, 0
148  ret i1 %r
149}
150
151define i1 @inv_select_v_sgt_neg(i8 %v, i8 %C, i8 %y) {
152; CHECK-LABEL: @inv_select_v_sgt_neg(
153; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
154; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
155; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
156; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
157; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]
158; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
159; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
160; CHECK-NEXT:    ret i1 [[R]]
161;
162  %ynz = icmp ne i8 %y, 0
163  call void @llvm.assume(i1 %ynz)
164  %pcond0 = icmp slt i8 %C, 0
165  call void @llvm.assume(i1 %pcond0)
166  %cmp = icmp sgt i8 %v, %C
167  %s = select i1 %cmp, i8 %y, i8 %v
168  %r = icmp eq i8 %s, 0
169  ret i1 %r
170}
171
172define i1 @inv_select_v_sgt_nonneg_nz(i8 %v, i8 %C, i8 %y) {
173; CHECK-LABEL: @inv_select_v_sgt_nonneg_nz(
174; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
175; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
176; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0
177; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
178; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[C]], [[V:%.*]]
179; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
180; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
181; CHECK-NEXT:    ret i1 [[R]]
182;
183  %ynz = icmp ne i8 %y, 0
184  call void @llvm.assume(i1 %ynz)
185  %pcond0 = icmp sgt i8 %C, 0
186  call void @llvm.assume(i1 %pcond0)
187  %cmp = icmp sgt i8 %C, %v
188  %s = select i1 %cmp, i8 %y, i8 %v
189  %r = icmp eq i8 %s, 0
190  ret i1 %r
191}
192
193define i1 @select_v_slt_nonneg(i8 %v, i8 %C, i8 %y) {
194; CHECK-LABEL: @select_v_slt_nonneg(
195; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
196; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
197; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
198; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
199; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]]
200; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
201; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
202; CHECK-NEXT:    ret i1 [[R]]
203;
204  %ynz = icmp ne i8 %y, 0
205  call void @llvm.assume(i1 %ynz)
206  %pcond0 = icmp sge i8 %C, 0
207  call void @llvm.assume(i1 %pcond0)
208  %cmp = icmp slt i8 %C, %v
209  %s = select i1 %cmp, i8 %v, i8 %y
210  %r = icmp eq i8 %s, 0
211  ret i1 %r
212}
213
214define i1 @select_v_slt_nonneg_fail(i8 %v, i8 %C, i8 %y) {
215; CHECK-LABEL: @select_v_slt_nonneg_fail(
216; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
217; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
218; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -1
219; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
220; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]]
221; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
222; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
223; CHECK-NEXT:    ret i1 [[R]]
224;
225  %ynz = icmp ne i8 %y, 0
226  call void @llvm.assume(i1 %ynz)
227  %pcond0 = icmp sge i8 %C, -1
228  call void @llvm.assume(i1 %pcond0)
229  %cmp = icmp slt i8 %C, %v
230  %s = select i1 %cmp, i8 %v, i8 %y
231  %r = icmp eq i8 %s, 0
232  ret i1 %r
233}
234
235define i1 @select_v_slt_neg(i8 %v, i8 %C, i8 %y) {
236; CHECK-LABEL: @select_v_slt_neg(
237; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
238; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
239; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
240; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
241; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[V:%.*]], [[C]]
242; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
243; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
244; CHECK-NEXT:    ret i1 [[R]]
245;
246  %ynz = icmp ne i8 %y, 0
247  call void @llvm.assume(i1 %ynz)
248  %pcond0 = icmp slt i8 %C, 0
249  call void @llvm.assume(i1 %pcond0)
250  %cmp = icmp slt i8 %v, %C
251  %s = select i1 %cmp, i8 %v, i8 %y
252  %r = icmp eq i8 %s, 0
253  ret i1 %r
254}
255
256define i1 @select_v_sge_nonneg_nz(i8 %v, i8 %C, i8 %y) {
257; CHECK-LABEL: @select_v_sge_nonneg_nz(
258; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
259; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
260; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0
261; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
262; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C]]
263; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
264; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
265; CHECK-NEXT:    ret i1 [[R]]
266;
267  %ynz = icmp ne i8 %y, 0
268  call void @llvm.assume(i1 %ynz)
269  %pcond0 = icmp sgt i8 %C, 0
270  call void @llvm.assume(i1 %pcond0)
271  %cmp = icmp sge i8 %v, %C
272  %s = select i1 %cmp, i8 %v, i8 %y
273  %r = icmp eq i8 %s, 0
274  ret i1 %r
275}
276
277define i1 @select_v_sge_neg(i8 %v, i8 %C, i8 %y) {
278; CHECK-LABEL: @select_v_sge_neg(
279; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
280; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
281; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
282; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
283; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[C]], [[V:%.*]]
284; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
285; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
286; CHECK-NEXT:    ret i1 [[R]]
287;
288  %ynz = icmp ne i8 %y, 0
289  call void @llvm.assume(i1 %ynz)
290  %pcond0 = icmp slt i8 %C, 0
291  call void @llvm.assume(i1 %pcond0)
292  %cmp = icmp sge i8 %C, %v
293  %s = select i1 %cmp, i8 %v, i8 %y
294  %r = icmp eq i8 %s, 0
295  ret i1 %r
296}
297
298define i1 @inv_select_v_sge_fail(i8 %v, i8 %C, i8 %y) {
299; CHECK-LABEL: @inv_select_v_sge_fail(
300; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
301; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
302; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C:%.*]]
303; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
304; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
305; CHECK-NEXT:    ret i1 [[R]]
306;
307  %ynz = icmp ne i8 %y, 0
308  call void @llvm.assume(i1 %ynz)
309  %cmp = icmp sge i8 %v, %C
310  %s = select i1 %cmp, i8 %y, i8 %v
311  %r = icmp eq i8 %s, 0
312  ret i1 %r
313}
314
315define i1 @select_v_sle_neg(i8 %v, i8 %C, i8 %y) {
316; CHECK-LABEL: @select_v_sle_neg(
317; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
318; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
319; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
320; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
321; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]]
322; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
323; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
324; CHECK-NEXT:    ret i1 [[R]]
325;
326  %ynz = icmp ne i8 %y, 0
327  call void @llvm.assume(i1 %ynz)
328  %pcond0 = icmp slt i8 %C, 0
329  call void @llvm.assume(i1 %pcond0)
330  %cmp = icmp sle i8 %v, %C
331  %s = select i1 %cmp, i8 %v, i8 %y
332  %r = icmp eq i8 %s, 0
333  ret i1 %r
334}
335
336define i1 @select_v_sle_nonneg_nz(i8 %v, i8 %C, i8 %y) {
337; CHECK-LABEL: @select_v_sle_nonneg_nz(
338; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
339; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
340; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0
341; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
342; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]]
343; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
344; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
345; CHECK-NEXT:    ret i1 [[R]]
346;
347  %ynz = icmp ne i8 %y, 0
348  call void @llvm.assume(i1 %ynz)
349  %pcond0 = icmp sgt i8 %C, 0
350  call void @llvm.assume(i1 %pcond0)
351  %cmp = icmp sle i8 %C, %v
352  %s = select i1 %cmp, i8 %v, i8 %y
353  %r = icmp eq i8 %s, 0
354  ret i1 %r
355}
356
357define i1 @select_v_sle_fail(i8 %v, i8 %C, i8 %y) {
358; CHECK-LABEL: @select_v_sle_fail(
359; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
360; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
361; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
362; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
363; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]]
364; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
365; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
366; CHECK-NEXT:    ret i1 [[R]]
367;
368  %ynz = icmp ne i8 %y, 0
369  call void @llvm.assume(i1 %ynz)
370  %pcond0 = icmp sge i8 %C, 0
371  call void @llvm.assume(i1 %pcond0)
372  %cmp = icmp sle i8 %C, %v
373  %s = select i1 %cmp, i8 %v, i8 %y
374  %r = icmp eq i8 %s, 0
375  ret i1 %r
376}
377
378define i1 @inv_select_v_sle_nonneg(i8 %v, i8 %C, i8 %y) {
379; CHECK-LABEL: @inv_select_v_sle_nonneg(
380; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
381; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
382; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
383; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
384; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]]
385; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
386; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
387; CHECK-NEXT:    ret i1 [[R]]
388;
389  %ynz = icmp ne i8 %y, 0
390  call void @llvm.assume(i1 %ynz)
391  %pcond0 = icmp sge i8 %C, 0
392  call void @llvm.assume(i1 %pcond0)
393  %cmp = icmp sle i8 %v, %C
394  %s = select i1 %cmp, i8 %y, i8 %v
395  %r = icmp eq i8 %s, 0
396  ret i1 %r
397}
398
399; Check udiv/sdiv occuring before icmp.
400define i64 @incorrect_safe_div_1(i64 %n, i64 %d) {
401; CHECK-LABEL: @incorrect_safe_div_1(
402; CHECK-NEXT:    [[TMP1:%.*]] = udiv i64 [[N:%.*]], [[D:%.*]]
403; CHECK-NEXT:    ret i64 [[TMP1]]
404;
405  %1 = udiv i64 %n, %d
406  %2 = icmp eq i64 %d, 0
407  %3 = select i1 %2, i64 -1, i64 %1
408  ret i64 %3
409}
410
411; Check icmp occuring before udiv/sdiv.
412define i64 @incorrect_safe_div_2(i64 %n, i64 %d) {
413; CHECK-LABEL: @incorrect_safe_div_2(
414; CHECK-NEXT:    [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]]
415; CHECK-NEXT:    ret i64 [[TMP1]]
416;
417  %1 = icmp eq i64 %d, 0
418  %2 = sdiv i64 %n, %d
419  %3 = select i1 %1, i64 -1, i64 %2
420  ret i64 %3
421}
422
423define i64 @incorrect_safe_div_call_1(i64 %n, i64 %d) {
424; CHECK-LABEL: @incorrect_safe_div_call_1(
425; CHECK-NEXT:    [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]]
426; CHECK-NEXT:    tail call void @use(i64 [[D]])
427; CHECK-NEXT:    ret i64 [[TMP1]]
428;
429  %1 = sdiv i64 %n, %d
430  tail call void @use(i64 %d)
431  %2 = icmp eq i64 %d, 0
432  %3 = select i1 %2, i64 -1, i64 %1
433  ret i64 %3
434}
435
436define i64 @incorrect_safe_div_call_2(i64 %n, i64 %d) {
437; CHECK-LABEL: @incorrect_safe_div_call_2(
438; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[D:%.*]], 0
439; CHECK-NEXT:    tail call void @use(i64 [[D]])
440; CHECK-NEXT:    [[TMP2:%.*]] = udiv i64 [[N:%.*]], [[D]]
441; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i64 -1, i64 [[TMP2]]
442; CHECK-NEXT:    ret i64 [[TMP3]]
443;
444  %1 = icmp eq i64 %d, 0
445  tail call void @use(i64 %d)
446  %2 = udiv i64 %n, %d
447  %3 = select i1 %1, i64 -1, i64 %2
448  ret i64 %3
449}
450
451; https://alive2.llvm.org/ce/z/Si_B7b
452define i4 @icmp_urem(i4 %n, i4 %d) {
453; CHECK-LABEL: @icmp_urem(
454; CHECK-NEXT:    [[TMP1:%.*]] = urem i4 [[N:%.*]], [[D:%.*]]
455; CHECK-NEXT:    ret i4 [[TMP1]]
456;
457  %1 = icmp eq i4 %d, 0
458  %2 = urem i4 %n, %d
459  %3 = select i1 %1, i4 -1, i4 %2
460  ret i4 %3
461}
462
463define i4 @icmp_urem_clobber_by_call(i4 %n, i4 %d) {
464; CHECK-LABEL: @icmp_urem_clobber_by_call(
465; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0
466; CHECK-NEXT:    tail call void @use4(i4 [[D]])
467; CHECK-NEXT:    [[TMP2:%.*]] = urem i4 [[N:%.*]], [[D]]
468; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]
469; CHECK-NEXT:    ret i4 [[TMP3]]
470;
471  %1 = icmp eq i4 %d, 0
472  tail call void @use4(i4 %d)
473  %2 = urem i4 %n, %d
474  %3 = select i1 %1, i4 -1, i4 %2
475  ret i4 %3
476}
477
478; https://alive2.llvm.org/ce/z/Fn3Wac
479define i4 @icmp_srem(i4 %n, i4 %d) {
480; CHECK-LABEL: @icmp_srem(
481; CHECK-NEXT:    [[TMP1:%.*]] = srem i4 [[N:%.*]], [[D:%.*]]
482; CHECK-NEXT:    ret i4 [[TMP1]]
483;
484  %1 = icmp eq i4 %d, 0
485  %2 = srem i4 %n, %d
486  %3 = select i1 %1, i4 -1, i4 %2
487  ret i4 %3
488}
489
490define i4 @icmp_srem_clobber_by_call(i4 %n, i4 %d) {
491; CHECK-LABEL: @icmp_srem_clobber_by_call(
492; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0
493; CHECK-NEXT:    tail call void @use4(i4 [[D]])
494; CHECK-NEXT:    [[TMP2:%.*]] = srem i4 [[N:%.*]], [[D]]
495; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]
496; CHECK-NEXT:    ret i4 [[TMP3]]
497;
498  %1 = icmp eq i4 %d, 0
499  tail call void @use4(i4 %d)
500  %2 = srem i4 %n, %d
501  %3 = select i1 %1, i4 -1, i4 %2
502  ret i4 %3
503}
504