xref: /llvm-project/llvm/test/Transforms/InstSimplify/known-non-zero.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4define i64 @test0(i64 %x) {
5; CHECK-LABEL: @test0(
6; CHECK-NEXT:  start:
7; CHECK-NEXT:    [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
8; CHECK-NEXT:    br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
9; CHECK:       non_zero:
10; CHECK-NEXT:    br i1 false, label [[UNREACHABLE:%.*]], label [[EXIT]]
11; CHECK:       unreachable:
12; CHECK-NEXT:    br label [[EXIT]]
13; CHECK:       exit:
14; CHECK-NEXT:    [[C:%.*]] = phi i64 [ 0, [[START:%.*]] ], [ 1, [[NON_ZERO]] ], [ 2, [[UNREACHABLE]] ]
15; CHECK-NEXT:    ret i64 [[C]]
16;
17start:
18  %a = icmp eq i64 %x, 0
19  br i1 %a, label %exit, label %non_zero
20
21non_zero:
22  %b = icmp eq i64 %x, 0
23  br i1 %b, label %unreachable, label %exit
24
25unreachable:
26  br label %exit
27
28exit:
29  %c = phi i64 [ 0, %start ], [ 1, %non_zero ], [ 2, %unreachable ]
30  ret i64 %c
31}
32
33define i64 @test1(i64 %x) {
34; CHECK-LABEL: @test1(
35; CHECK-NEXT:  start:
36; CHECK-NEXT:    [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
37; CHECK-NEXT:    br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
38; CHECK:       non_zero:
39; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[UNREACHABLE:%.*]]
40; CHECK:       unreachable:
41; CHECK-NEXT:    br label [[EXIT]]
42; CHECK:       exit:
43; CHECK-NEXT:    [[C:%.*]] = phi i64 [ 0, [[START:%.*]] ], [ [[X]], [[NON_ZERO]] ], [ 0, [[UNREACHABLE]] ]
44; CHECK-NEXT:    ret i64 [[C]]
45;
46start:
47  %a = icmp eq i64 %x, 0
48  br i1 %a, label %exit, label %non_zero
49
50non_zero:
51  %b = icmp ugt i64 %x, 0
52  br i1 %b, label %exit, label %unreachable
53
54unreachable:
55  br label %exit
56
57exit:
58  %c = phi i64 [ 0, %start ], [ %x, %non_zero ], [ 0, %unreachable ]
59  ret i64 %c
60}
61
62define i1 @test2(i64 %x, i1 %y) {
63; CHECK-LABEL: @test2(
64; CHECK-NEXT:  start:
65; CHECK-NEXT:    [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
66; CHECK-NEXT:    br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
67; CHECK:       non_zero:
68; CHECK-NEXT:    br i1 [[Y:%.*]], label [[ONE:%.*]], label [[TWO:%.*]]
69; CHECK:       one:
70; CHECK-NEXT:    br label [[MAINBLOCK:%.*]]
71; CHECK:       two:
72; CHECK-NEXT:    br label [[MAINBLOCK]]
73; CHECK:       mainblock:
74; CHECK-NEXT:    br label [[EXIT]]
75; CHECK:       exit:
76; CHECK-NEXT:    [[RES:%.*]] = phi i1 [ false, [[MAINBLOCK]] ], [ true, [[START:%.*]] ]
77; CHECK-NEXT:    ret i1 [[RES]]
78;
79start:
80  %a = icmp eq i64 %x, 0
81  br i1 %a, label %exit, label %non_zero
82
83non_zero:
84  br i1 %y, label %one, label %two
85
86one:
87  br label %mainblock
88
89two:
90  br label %mainblock
91
92mainblock:
93  %p = phi i64 [ %x, %one ], [ 42, %two ]
94  %cmp = icmp eq i64 %p, 0
95  br label %exit
96
97exit:
98  %res = phi i1 [ %cmp, %mainblock ], [ 1, %start ]
99  ret i1 %res
100}
101
102
103; The code below exposed a bug similar to the one exposed by D60846, see the commit 6ea477590085.
104; In a nutshell, we should not replace %result.0 with 0 here.
105
106define zeroext i8 @update_phi_query_loc_in_recursive_call(ptr nocapture readonly %p){
107; CHECK-LABEL: @update_phi_query_loc_in_recursive_call(
108; CHECK-NEXT:  entry:
109; CHECK-NEXT:    br label [[FOR_COND:%.*]]
110; CHECK:       for.cond:
111; CHECK-NEXT:    [[RESULT_0:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[CONV2:%.*]], [[FOR_BODY:%.*]] ]
112; CHECK-NEXT:    [[SHIFT_0:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 1, [[FOR_BODY]] ]
113; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[SHIFT_0]], 0
114; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]
115; CHECK:       for.cond.cleanup:
116; CHECK-NEXT:    ret i8 [[RESULT_0]]
117; CHECK:       for.body:
118; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[P:%.*]], align 1
119; CHECK-NEXT:    [[CONV:%.*]] = zext i8 [[TMP0]] to i32
120; CHECK-NEXT:    [[MUL:%.*]] = shl nuw nsw i32 [[SHIFT_0]], 3
121; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i32 [[CONV]], [[MUL]]
122; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[SHL]] to i8
123; CHECK-NEXT:    [[CONV2]] = or i8 [[RESULT_0]], [[TMP1]]
124; CHECK-NEXT:    br label [[FOR_COND]]
125;
126entry:
127  br label %for.cond
128
129for.cond:                                         ; preds = %for.body, %entry
130  %result.0 = phi i8 [ 0, %entry ], [ %conv2, %for.body ]
131  %shift.0 = phi i32 [ 0, %entry ], [ 1, %for.body ]
132  %cmp = icmp eq i32 %shift.0, 0
133  br i1 %cmp, label %for.body, label %for.cond.cleanup
134
135for.cond.cleanup:                                 ; preds = %for.cond
136  ret i8 %result.0
137
138for.body:                                         ; preds = %for.cond
139  %0 = load i8, ptr %p, align 1
140  %conv = zext i8 %0 to i32
141  %mul = shl nuw nsw i32 %shift.0, 3
142  %shl = shl nuw nsw i32 %conv, %mul
143  %1 = trunc i32 %shl to i8
144  %conv2 = or i8 %result.0, %1
145  %inc = add nuw nsw i32 %shift.0, 1
146  br label %for.cond
147}
148
149define i1 @freeze_nonzero(i8 %x, i8 %mask) {
150; CHECK-LABEL: @freeze_nonzero(
151; CHECK-NEXT:    [[Y:%.*]] = or i8 [[X:%.*]], [[MASK:%.*]]
152; CHECK-NEXT:    [[C:%.*]] = icmp ne i8 [[Y]], 0
153; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
154; CHECK:       A:
155; CHECK-NEXT:    ret i1 false
156; CHECK:       B:
157; CHECK-NEXT:    ret i1 false
158;
159  %y = or i8 %x, %mask
160  %c = icmp ne i8 %y, 0
161  br i1 %c, label %A, label %B
162A:
163  %fr = freeze i8 %y
164  %c2 = icmp eq i8 %fr, 0
165  ret i1 %c2
166B:
167  ret i1 0
168}
169
170define i1 @smax_non_zero(i8 %xx, i8 %y) {
171; CHECK-LABEL: @smax_non_zero(
172; CHECK-NEXT:    ret i1 false
173;
174  %x0 = and i8 %xx, 63
175  %x = add i8 %x0, 1
176  %v = call i8 @llvm.smax.i8(i8 %x, i8 %y)
177  %r = icmp eq i8 %v, 0
178  ret i1 %r
179}
180
181define <4 x i1> @shuf_nonzero_both(<4 x i8> %xx, <4 x i8> %yy) {
182; CHECK-LABEL: @shuf_nonzero_both(
183; CHECK-NEXT:    ret <4 x i1> zeroinitializer
184;
185  %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
186  %y = add nuw <4 x i8> %yy, <i8 1, i8 1, i8 1, i8 1>
187
188  %shuf = shufflevector <4 x i8> %x, <4 x i8> %y, <4 x i32> <i32 0, i32 4, i32 7, i32 2>
189  %r = icmp eq <4 x i8> %shuf, zeroinitializer
190  ret <4 x i1> %r
191}
192
193define <4 x i1> @shuf_nonzero_both_fail(<4 x i8> %xx, <4 x i8> %yy) {
194; CHECK-LABEL: @shuf_nonzero_both_fail(
195; CHECK-NEXT:    [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], splat (i8 1)
196; CHECK-NEXT:    [[Y:%.*]] = add nuw <4 x i8> [[YY:%.*]], <i8 1, i8 1, i8 1, i8 0>
197; CHECK-NEXT:    [[SHUF:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[Y]], <4 x i32> <i32 0, i32 4, i32 7, i32 2>
198; CHECK-NEXT:    [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
199; CHECK-NEXT:    ret <4 x i1> [[R]]
200;
201  %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
202  %y = add nuw <4 x i8> %yy, <i8 1, i8 1, i8 1, i8 0>
203
204  %shuf = shufflevector <4 x i8> %x, <4 x i8> %y, <4 x i32> <i32 0, i32 4, i32 7, i32 2>
205  %r = icmp eq <4 x i8> %shuf, zeroinitializer
206  ret <4 x i1> %r
207}
208
209define <4 x i1> @shuf_nonzero_both_fail2(<4 x i8> %xx, <4 x i8> %yy) {
210; CHECK-LABEL: @shuf_nonzero_both_fail2(
211; CHECK-NEXT:    [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], splat (i8 1)
212; CHECK-NEXT:    [[Y:%.*]] = add <4 x i8> [[YY:%.*]], splat (i8 1)
213; CHECK-NEXT:    [[SHUF:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[Y]], <4 x i32> <i32 0, i32 4, i32 7, i32 2>
214; CHECK-NEXT:    [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
215; CHECK-NEXT:    ret <4 x i1> [[R]]
216;
217  %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
218  %y = add <4 x i8> %yy, <i8 1, i8 1, i8 1, i8 1>
219
220  %shuf = shufflevector <4 x i8> %x, <4 x i8> %y, <4 x i32> <i32 0, i32 4, i32 7, i32 2>
221  %r = icmp eq <4 x i8> %shuf, zeroinitializer
222  ret <4 x i1> %r
223}
224
225define <4 x i1> @shuf_nonzero_lhs(<4 x i8> %xx) {
226; CHECK-LABEL: @shuf_nonzero_lhs(
227; CHECK-NEXT:    ret <4 x i1> zeroinitializer
228;
229  %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
230
231  %shuf = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
232  %r = icmp eq <4 x i8> %shuf, zeroinitializer
233  ret <4 x i1> %r
234}
235
236define <4 x i1> @shuf_nonzero_lhs2(<4 x i8> %xx) {
237; CHECK-LABEL: @shuf_nonzero_lhs2(
238; CHECK-NEXT:    ret <4 x i1> zeroinitializer
239;
240  %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 0>
241
242  %shuf = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 2, i32 0, i32 1, i32 1>
243  %r = icmp eq <4 x i8> %shuf, zeroinitializer
244  ret <4 x i1> %r
245}
246
247define <4 x i1> @shuf_nonzero_lhs2_fail(<4 x i8> %xx) {
248; CHECK-LABEL: @shuf_nonzero_lhs2_fail(
249; CHECK-NEXT:    [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 1, i8 1, i8 1, i8 0>
250; CHECK-NEXT:    [[SHUF:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> poison, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
251; CHECK-NEXT:    [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
252; CHECK-NEXT:    ret <4 x i1> [[R]]
253;
254  %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 0>
255
256  %shuf = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
257  %r = icmp eq <4 x i8> %shuf, zeroinitializer
258  ret <4 x i1> %r
259}
260
261define <4 x i1> @shuf_nonzero_rhs(<4 x i8> %xx) {
262; CHECK-LABEL: @shuf_nonzero_rhs(
263; CHECK-NEXT:    ret <4 x i1> zeroinitializer
264;
265  %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
266
267  %shuf = shufflevector <4 x i8> poison, <4 x i8> %x, <4 x i32> <i32 6, i32 7, i32 5, i32 4>
268  %r = icmp eq <4 x i8> %shuf, zeroinitializer
269  ret <4 x i1> %r
270}
271
272define <4 x i1> @shuf_nonzero_rhs2(<4 x i8> %xx) {
273; CHECK-LABEL: @shuf_nonzero_rhs2(
274; CHECK-NEXT:    ret <4 x i1> zeroinitializer
275;
276  %x = add nuw <4 x i8> %xx, <i8 0, i8 0, i8 1, i8 1>
277
278  %shuf = shufflevector <4 x i8> poison, <4 x i8> %x, <4 x i32> <i32 6, i32 7, i32 7, i32 6>
279  %r = icmp eq <4 x i8> %shuf, zeroinitializer
280  ret <4 x i1> %r
281}
282
283define <4 x i1> @shuf_nonzero_rhs2_fail(<4 x i8> %xx) {
284; CHECK-LABEL: @shuf_nonzero_rhs2_fail(
285; CHECK-NEXT:    [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 0, i8 0, i8 1, i8 1>
286; CHECK-NEXT:    [[SHUF:%.*]] = shufflevector <4 x i8> poison, <4 x i8> [[X]], <4 x i32> <i32 6, i32 7, i32 5, i32 6>
287; CHECK-NEXT:    [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
288; CHECK-NEXT:    ret <4 x i1> [[R]]
289;
290  %x = add nuw <4 x i8> %xx, <i8 0, i8 0, i8 1, i8 1>
291
292  %shuf = shufflevector <4 x i8> poison, <4 x i8> %x, <4 x i32> <i32 6, i32 7, i32 5, i32 6>
293  %r = icmp eq <4 x i8> %shuf, zeroinitializer
294  ret <4 x i1> %r
295}
296
297define <2 x i1> @insert_nonzero0(<2 x i8> %xx, i8 %yy) {
298; CHECK-LABEL: @insert_nonzero0(
299; CHECK-NEXT:    ret <2 x i1> zeroinitializer
300;
301  %x = add nuw <2 x i8> %xx, <i8 1, i8 0>
302  %y = add nuw i8 %yy, 1
303
304  %ins = insertelement <2 x i8> %x, i8 %y, i32 1
305  %r = icmp eq <2 x i8> %ins, zeroinitializer
306  ret <2 x i1> %r
307}
308
309define <2 x i1> @insert_nonzero1(<2 x i8> %xx, i8 %yy) {
310; CHECK-LABEL: @insert_nonzero1(
311; CHECK-NEXT:    ret <2 x i1> zeroinitializer
312;
313  %x = add nuw <2 x i8> %xx, <i8 0, i8 1>
314  %y = add nuw i8 %yy, 1
315
316  %ins = insertelement <2 x i8> %x, i8 %y, i32 0
317  %r = icmp eq <2 x i8> %ins, zeroinitializer
318  ret <2 x i1> %r
319}
320
321define <2 x i1> @insert_nonzero_fail(<2 x i8> %xx, i8 %yy) {
322; CHECK-LABEL: @insert_nonzero_fail(
323; CHECK-NEXT:    [[X:%.*]] = add nuw <2 x i8> [[XX:%.*]], <i8 1, i8 0>
324; CHECK-NEXT:    [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
325; CHECK-NEXT:    [[INS:%.*]] = insertelement <2 x i8> [[X]], i8 [[Y]], i32 0
326; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i8> [[INS]], zeroinitializer
327; CHECK-NEXT:    ret <2 x i1> [[R]]
328;
329  %x = add nuw <2 x i8> %xx, <i8 1, i8 0>
330  %y = add nuw i8 %yy, 1
331
332  %ins = insertelement <2 x i8> %x, i8 %y, i32 0
333  %r = icmp eq <2 x i8> %ins, zeroinitializer
334  ret <2 x i1> %r
335}
336
337define <2 x i1> @insert_nonzero_fail2(<2 x i8> %xx, i8 %yy) {
338; CHECK-LABEL: @insert_nonzero_fail2(
339; CHECK-NEXT:    [[X:%.*]] = add nuw <2 x i8> [[XX:%.*]], <i8 0, i8 1>
340; CHECK-NEXT:    [[Y:%.*]] = add i8 [[YY:%.*]], 1
341; CHECK-NEXT:    [[INS:%.*]] = insertelement <2 x i8> [[X]], i8 [[Y]], i32 0
342; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i8> [[INS]], zeroinitializer
343; CHECK-NEXT:    ret <2 x i1> [[R]]
344;
345  %x = add nuw <2 x i8> %xx, <i8 0, i8 1>
346  %y = add i8 %yy, 1
347
348  %ins = insertelement <2 x i8> %x, i8 %y, i32 0
349  %r = icmp eq <2 x i8> %ins, zeroinitializer
350  ret <2 x i1> %r
351}
352
353define <2 x i1> @insert_nonzero_any_idx(<2 x i8> %xx, i8 %yy, i32 %idx) {
354; CHECK-LABEL: @insert_nonzero_any_idx(
355; CHECK-NEXT:    ret <2 x i1> zeroinitializer
356;
357  %x = add nuw <2 x i8> %xx, <i8 1, i8 1>
358  %y = add nuw i8 %yy, 1
359
360  %ins = insertelement <2 x i8> %x, i8 %y, i32 %idx
361  %r = icmp eq <2 x i8> %ins, zeroinitializer
362  ret <2 x i1> %r
363}
364
365define <2 x i1> @insert_nonzero_any_idx_fail(<2 x i8> %xx, i8 %yy, i32 %idx) {
366; CHECK-LABEL: @insert_nonzero_any_idx_fail(
367; CHECK-NEXT:    [[X:%.*]] = add nuw <2 x i8> [[XX:%.*]], <i8 1, i8 0>
368; CHECK-NEXT:    [[Y:%.*]] = add nuw i8 [[YY:%.*]], 1
369; CHECK-NEXT:    [[INS:%.*]] = insertelement <2 x i8> [[X]], i8 [[Y]], i32 [[IDX:%.*]]
370; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i8> [[INS]], zeroinitializer
371; CHECK-NEXT:    ret <2 x i1> [[R]]
372;
373  %x = add nuw <2 x i8> %xx, <i8 1, i8 0>
374  %y = add nuw i8 %yy, 1
375
376  %ins = insertelement <2 x i8> %x, i8 %y, i32 %idx
377  %r = icmp eq <2 x i8> %ins, zeroinitializer
378  ret <2 x i1> %r
379}
380
381define i1 @nonzero_reduce_or(<2 x i8> %xx) {
382; CHECK-LABEL: @nonzero_reduce_or(
383; CHECK-NEXT:    ret i1 false
384;
385  %x = add nuw <2 x i8> %xx, <i8 1, i8 1>
386  %v = call i8 @llvm.vector.reduce.or(<2 x i8> %x)
387  %r = icmp eq i8 %v, 0
388  ret i1 %r
389}
390
391define i1 @nonzero_reduce_or_fail(<2 x i8> %xx) {
392; CHECK-LABEL: @nonzero_reduce_or_fail(
393; CHECK-NEXT:    [[X:%.*]] = add nsw <2 x i8> [[XX:%.*]], splat (i8 1)
394; CHECK-NEXT:    [[V:%.*]] = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> [[X]])
395; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
396; CHECK-NEXT:    ret i1 [[R]]
397;
398  %x = add nsw <2 x i8> %xx, <i8 1, i8 1>
399  %v = call i8 @llvm.vector.reduce.or(<2 x i8> %x)
400  %r = icmp eq i8 %v, 0
401  ret i1 %r
402}
403
404define i1 @src_x_add_x_eq_0(i8 %x) {
405; CHECK-LABEL: @src_x_add_x_eq_0(
406; CHECK-NEXT:    ret i1 false
407;
408  %x_eq_0 = icmp eq i8 %x, 0
409  %y = zext i1 %x_eq_0 to i8
410  %v = add i8 %x, %y
411  %r = icmp eq i8 %v, 0
412  ret i1 %r
413}
414
415define i1 @src_x_add_x_eq_1_fail(i8 %x) {
416; CHECK-LABEL: @src_x_add_x_eq_1_fail(
417; CHECK-NEXT:    [[X_EQ_1:%.*]] = icmp eq i8 [[X:%.*]], 1
418; CHECK-NEXT:    [[Y:%.*]] = zext i1 [[X_EQ_1]] to i8
419; CHECK-NEXT:    [[V:%.*]] = add i8 [[X]], [[Y]]
420; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
421; CHECK-NEXT:    ret i1 [[R]]
422;
423  %x_eq_1 = icmp eq i8 %x, 1
424  %y = zext i1 %x_eq_1 to i8
425  %v = add i8 %x, %y
426  %r = icmp eq i8 %v, 0
427  ret i1 %r
428}
429
430define i1 @src_x_or_x_eq_0(i8 %x) {
431; CHECK-LABEL: @src_x_or_x_eq_0(
432; CHECK-NEXT:    ret i1 false
433;
434  %x_eq_0 = icmp eq i8 %x, 0
435  %y = sext i1 %x_eq_0 to i8
436  %v = or i8 %x, %y
437  %r = icmp eq i8 %v, 0
438  ret i1 %r
439}
440
441define i1 @src_x_or_x_sle_0_fail(i8 %x) {
442; CHECK-LABEL: @src_x_or_x_sle_0_fail(
443; CHECK-NEXT:    [[X_EQ_0:%.*]] = icmp sle i8 [[X:%.*]], 0
444; CHECK-NEXT:    [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
445; CHECK-NEXT:    [[V:%.*]] = or i8 [[X]], [[Y]]
446; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
447; CHECK-NEXT:    ret i1 [[R]]
448;
449  %x_eq_0 = icmp sle i8 %x, 0
450  %y = sext i1 %x_eq_0 to i8
451  %v = or i8 %x, %y
452  %r = icmp eq i8 %v, 0
453  ret i1 %r
454}
455
456define i1 @src_x_xor_x_eq_0(i8 %x) {
457; CHECK-LABEL: @src_x_xor_x_eq_0(
458; CHECK-NEXT:    ret i1 false
459;
460  %x_eq_0 = icmp eq i8 %x, 0
461  %y = zext i1 %x_eq_0 to i8
462  %v = xor i8 %x, %y
463  %r = icmp eq i8 %v, 0
464  ret i1 %r
465}
466
467define i1 @src_x_xor_x_ne_0_fail(i8 %x) {
468; CHECK-LABEL: @src_x_xor_x_ne_0_fail(
469; CHECK-NEXT:    [[X_NE_0:%.*]] = icmp ne i8 [[X:%.*]], 0
470; CHECK-NEXT:    [[Y:%.*]] = zext i1 [[X_NE_0]] to i8
471; CHECK-NEXT:    [[V:%.*]] = xor i8 [[X]], [[Y]]
472; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
473; CHECK-NEXT:    ret i1 [[R]]
474;
475  %x_ne_0 = icmp ne i8 %x, 0
476  %y = zext i1 %x_ne_0 to i8
477  %v = xor i8 %x, %y
478  %r = icmp eq i8 %v, 0
479  ret i1 %r
480}
481
482define i1 @src_x_sub0_x_eq_0(i8 %x) {
483; CHECK-LABEL: @src_x_sub0_x_eq_0(
484; CHECK-NEXT:    ret i1 false
485;
486  %x_eq_0 = icmp eq i8 %x, 0
487  %y = sext i1 %x_eq_0 to i8
488  %v = sub i8 %x, %y
489  %r = icmp eq i8 %v, 0
490  ret i1 %r
491}
492
493define i1 @src_x_sub0_z_eq_0_fail(i8 %x, i8 %z) {
494; CHECK-LABEL: @src_x_sub0_z_eq_0_fail(
495; CHECK-NEXT:    [[Z_EQ_0:%.*]] = icmp eq i8 [[Z:%.*]], 0
496; CHECK-NEXT:    [[Y:%.*]] = sext i1 [[Z_EQ_0]] to i8
497; CHECK-NEXT:    [[V:%.*]] = sub i8 [[X:%.*]], [[Y]]
498; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
499; CHECK-NEXT:    ret i1 [[R]]
500;
501  %z_eq_0 = icmp eq i8 %z, 0
502  %y = sext i1 %z_eq_0 to i8
503  %v = sub i8 %x, %y
504  %r = icmp eq i8 %v, 0
505  ret i1 %r
506}
507
508define i1 @src_x_sub1_x_eq_0(i8 %x) {
509; CHECK-LABEL: @src_x_sub1_x_eq_0(
510; CHECK-NEXT:    ret i1 false
511;
512  %x_eq_0 = icmp eq i8 %x, 0
513  %y = zext i1 %x_eq_0 to i8
514  %v = sub i8 %y, %x
515  %r = icmp eq i8 %v, 0
516  ret i1 %r
517}
518
519define i1 @src_x_sub1_x_eq_0_or_fail(i8 %x, i1 %c1) {
520; CHECK-LABEL: @src_x_sub1_x_eq_0_or_fail(
521; CHECK-NEXT:    [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
522; CHECK-NEXT:    [[X_EQ_0_OR:%.*]] = or i1 [[X_EQ_0]], [[C1:%.*]]
523; CHECK-NEXT:    [[Y:%.*]] = zext i1 [[X_EQ_0_OR]] to i8
524; CHECK-NEXT:    [[V:%.*]] = sub i8 [[Y]], [[X]]
525; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
526; CHECK-NEXT:    ret i1 [[R]]
527;
528  %x_eq_0 = icmp eq i8 %x, 0
529  %x_eq_0_or = or i1 %x_eq_0, %c1
530  %y = zext i1 %x_eq_0_or to i8
531  %v = sub i8 %y, %x
532  %r = icmp eq i8 %v, 0
533  ret i1 %r
534}
535
536define i1 @src_x_umax_x_eq_0(i8 %x) {
537; CHECK-LABEL: @src_x_umax_x_eq_0(
538; CHECK-NEXT:    ret i1 false
539;
540  %x_eq_0 = icmp eq i8 %x, 0
541  %y = sext i1 %x_eq_0 to i8
542  %v = call i8 @llvm.umax.i8(i8 %y, i8 %x)
543  %r = icmp eq i8 %v, 0
544  ret i1 %r
545}
546
547define i1 @src_x_umax_x_ugt_10_fail(i8 %x) {
548; CHECK-LABEL: @src_x_umax_x_ugt_10_fail(
549; CHECK-NEXT:    [[X_UGT_10:%.*]] = icmp ugt i8 [[X:%.*]], 10
550; CHECK-NEXT:    [[Y:%.*]] = sext i1 [[X_UGT_10]] to i8
551; CHECK-NEXT:    [[V:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
552; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
553; CHECK-NEXT:    ret i1 [[R]]
554;
555  %x_ugt_10 = icmp ugt i8 %x, 10
556  %y = sext i1 %x_ugt_10 to i8
557  %v = call i8 @llvm.umax.i8(i8 %y, i8 %x)
558  %r = icmp eq i8 %v, 0
559  ret i1 %r
560}
561
562define i1 @src_x_uadd.sat_x_eq_0(i8 %x) {
563; CHECK-LABEL: @src_x_uadd.sat_x_eq_0(
564; CHECK-NEXT:    ret i1 false
565;
566  %x_eq_0 = icmp eq i8 %x, 0
567  %y = zext i1 %x_eq_0 to i8
568  %v = call i8 @llvm.uadd.sat.i8(i8 %y, i8 %x)
569  %r = icmp eq i8 %v, 0
570  ret i1 %r
571}
572
573define i1 @src_x_uadd.sat_c1_fail(i8 %x, i1 %c1) {
574; CHECK-LABEL: @src_x_uadd.sat_c1_fail(
575; CHECK-NEXT:    [[Y:%.*]] = zext i1 [[C1:%.*]] to i8
576; CHECK-NEXT:    [[V:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[Y]], i8 [[X:%.*]])
577; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
578; CHECK-NEXT:    ret i1 [[R]]
579;
580  %y = zext i1 %c1 to i8
581  %v = call i8 @llvm.uadd.sat.i8(i8 %y, i8 %x)
582  %r = icmp eq i8 %v, 0
583  ret i1 %r
584}
585
586