1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4; TODO: the instructions having poison operands should be folded to poison
5
6declare i3 @llvm.uadd.sat.i3(i3, i3)
7declare i8 @llvm.uadd.sat.i8(i8, i8)
8declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
9declare <2 x i9> @llvm.uadd.sat.v2i9(<2 x i9>, <2 x i9>)
10
11declare i8 @llvm.sadd.sat.i8(i8, i8)
12declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
13
14declare i8 @llvm.usub.sat.i8(i8, i8)
15declare i8 @llvm.ssub.sat.i8(i8, i8)
16declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>)
17declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
18
19define i8 @uadd_scalar_0(i8 %a) {
20; CHECK-LABEL: @uadd_scalar_0(
21; CHECK-NEXT:    ret i8 [[A:%.*]]
22;
23  %x1 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 0)
24  ret i8 %x1
25}
26
27define <2 x i8> @uadd_vector_0(<2 x i8> %a) {
28; CHECK-LABEL: @uadd_vector_0(
29; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
30;
31  %x1v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer)
32  ret <2 x i8> %x1v
33}
34
35define i3 @uadd_scalar_0_commute(i3 %a) {
36; CHECK-LABEL: @uadd_scalar_0_commute(
37; CHECK-NEXT:    ret i3 [[A:%.*]]
38;
39  %x2 = call i3 @llvm.uadd.sat.i3(i3 0, i3 %a)
40  ret i3 %x2
41}
42
43define <2 x i8> @uadd_vector_0_commute(<2 x i8> %a) {
44; CHECK-LABEL: @uadd_vector_0_commute(
45; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
46;
47  %x2v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> <i8 0, i8 undef>, <2 x i8> %a)
48  ret <2 x i8> %x2v
49}
50
51define i8 @uadd_scalar_maxval(i8 %a) {
52; CHECK-LABEL: @uadd_scalar_maxval(
53; CHECK-NEXT:    ret i8 -1
54;
55  %x3 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 255)
56  ret i8 %x3
57}
58
59define <2 x i9> @uadd_vector_maxval(<2 x i9> %a) {
60; CHECK-LABEL: @uadd_vector_maxval(
61; CHECK-NEXT:    ret <2 x i9> <i9 -1, i9 -1>
62;
63  %x3v = call <2 x i9> @llvm.uadd.sat.v2i9(<2 x i9> %a, <2 x i9> <i9 511, i9 511>)
64  ret <2 x i9> %x3v
65}
66
67define i3 @uadd_scalar_maxval_commute(i3 %a) {
68; CHECK-LABEL: @uadd_scalar_maxval_commute(
69; CHECK-NEXT:    ret i3 -1
70;
71  %x4 = call i3 @llvm.uadd.sat.i3(i3 7, i3 %a)
72  ret i3 %x4
73}
74
75define <2 x i8> @uadd_vector_maxval_commute(<2 x i8> %a) {
76; CHECK-LABEL: @uadd_vector_maxval_commute(
77; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
78;
79  %x4v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> <i8 255, i8 255>, <2 x i8> %a)
80  ret <2 x i8> %x4v
81}
82
83define i8 @uadd_scalar_undef(i8 %a) {
84; CHECK-LABEL: @uadd_scalar_undef(
85; CHECK-NEXT:    ret i8 -1
86;
87  %x5 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 undef)
88  ret i8 %x5
89}
90
91define i8 @uadd_scalar_poison(i8 %a) {
92; CHECK-LABEL: @uadd_scalar_poison(
93; CHECK-NEXT:    ret i8 -1
94;
95  %x5 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 poison)
96  ret i8 %x5
97}
98
99define <2 x i8> @uadd_vector_undef(<2 x i8> %a) {
100; CHECK-LABEL: @uadd_vector_undef(
101; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
102;
103  %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 undef>)
104  ret <2 x i8> %x5v
105}
106
107define <2 x i8> @uadd_vector_poison(<2 x i8> %a) {
108; CHECK-LABEL: @uadd_vector_poison(
109; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
110;
111  %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 poison, i8 poison>)
112  ret <2 x i8> %x5v
113}
114
115define i8 @uadd_scalar_undef_commute(i8 %a) {
116; CHECK-LABEL: @uadd_scalar_undef_commute(
117; CHECK-NEXT:    ret i8 -1
118;
119  %x6 = call i8 @llvm.uadd.sat.i8(i8 undef, i8 %a)
120  ret i8 %x6
121}
122
123define i8 @uadd_scalar_poison_commute(i8 %a) {
124; CHECK-LABEL: @uadd_scalar_poison_commute(
125; CHECK-NEXT:    ret i8 -1
126;
127  %x6 = call i8 @llvm.uadd.sat.i8(i8 poison, i8 %a)
128  ret i8 %x6
129}
130
131define <2 x i8> @uadd_vector_undef_commute(<2 x i8> %a) {
132; CHECK-LABEL: @uadd_vector_undef_commute(
133; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
134;
135  %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> undef, <2 x i8> %a)
136  ret <2 x i8> %x5v
137}
138
139define <2 x i8> @uadd_vector_poison_commute(<2 x i8> %a) {
140; CHECK-LABEL: @uadd_vector_poison_commute(
141; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
142;
143  %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> poison, <2 x i8> %a)
144  ret <2 x i8> %x5v
145}
146
147define i8 @sadd_scalar_0(i8 %a) {
148; CHECK-LABEL: @sadd_scalar_0(
149; CHECK-NEXT:    ret i8 [[A:%.*]]
150;
151  %y1 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 0)
152  ret i8 %y1
153}
154
155define <2 x i8> @sadd_vector_0(<2 x i8> %a) {
156; CHECK-LABEL: @sadd_vector_0(
157; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
158;
159  %y1v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 0>)
160  ret <2 x i8> %y1v
161}
162
163define i8 @sadd_scalar_0_commute(i8 %a) {
164; CHECK-LABEL: @sadd_scalar_0_commute(
165; CHECK-NEXT:    ret i8 [[A:%.*]]
166;
167  %y2 = call i8 @llvm.sadd.sat.i8(i8 0, i8 %a)
168  ret i8 %y2
169}
170
171define <2 x i8> @sadd_vector_0_commute(<2 x i8> %a) {
172; CHECK-LABEL: @sadd_vector_0_commute(
173; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
174;
175  %y2v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> zeroinitializer, <2 x i8> %a)
176  ret <2 x i8> %y2v
177}
178
179define i8 @sadd_scalar_maxval(i8 %a) {
180; CHECK-LABEL: @sadd_scalar_maxval(
181; CHECK-NEXT:    [[Y3:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 127)
182; CHECK-NEXT:    ret i8 [[Y3]]
183;
184  %y3 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 127)
185  ret i8 %y3
186}
187
188define <2 x i8> @sadd_vector_maxval(<2 x i8> %a) {
189; CHECK-LABEL: @sadd_vector_maxval(
190; CHECK-NEXT:    [[Y3V:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> [[A:%.*]], <2 x i8> <i8 127, i8 127>)
191; CHECK-NEXT:    ret <2 x i8> [[Y3V]]
192;
193  %y3v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 127, i8 127>)
194  ret <2 x i8> %y3v
195}
196
197define i8 @sadd_scalar_maxval_commute(i8 %a) {
198; CHECK-LABEL: @sadd_scalar_maxval_commute(
199; CHECK-NEXT:    [[Y4:%.*]] = call i8 @llvm.sadd.sat.i8(i8 127, i8 [[A:%.*]])
200; CHECK-NEXT:    ret i8 [[Y4]]
201;
202  %y4 = call i8 @llvm.sadd.sat.i8(i8 127, i8 %a)
203  ret i8 %y4
204}
205
206define <2 x i8> @sadd_vector_maxval_commute(<2 x i8> %a) {
207; CHECK-LABEL: @sadd_vector_maxval_commute(
208; CHECK-NEXT:    [[Y4V:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> <i8 undef, i8 127>, <2 x i8> [[A:%.*]])
209; CHECK-NEXT:    ret <2 x i8> [[Y4V]]
210;
211  %y4v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> <i8 undef, i8 127>, <2 x i8> %a)
212  ret <2 x i8> %y4v
213}
214
215define i8 @sadd_scalar_undef(i8 %a) {
216; CHECK-LABEL: @sadd_scalar_undef(
217; CHECK-NEXT:    ret i8 -1
218;
219  %y5 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 undef)
220  ret i8 %y5
221}
222
223define i8 @sadd_scalar_poison(i8 %a) {
224; CHECK-LABEL: @sadd_scalar_poison(
225; CHECK-NEXT:    ret i8 -1
226;
227  %y5 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 poison)
228  ret i8 %y5
229}
230
231define <2 x i8> @sadd_vector_undef(<2 x i8> %a) {
232; CHECK-LABEL: @sadd_vector_undef(
233; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
234;
235  %y5v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> undef)
236  ret <2 x i8> %y5v
237}
238
239define <2 x i8> @sadd_vector_poison(<2 x i8> %a) {
240; CHECK-LABEL: @sadd_vector_poison(
241; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
242;
243  %y5v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> poison)
244  ret <2 x i8> %y5v
245}
246
247define i8 @sadd_scalar_undef_commute(i8 %a) {
248; CHECK-LABEL: @sadd_scalar_undef_commute(
249; CHECK-NEXT:    ret i8 -1
250;
251  %y6 = call i8 @llvm.sadd.sat.i8(i8 undef, i8 %a)
252  ret i8 %y6
253}
254
255define i8 @sadd_scalar_poison_commute(i8 %a) {
256; CHECK-LABEL: @sadd_scalar_poison_commute(
257; CHECK-NEXT:    ret i8 -1
258;
259  %y6 = call i8 @llvm.sadd.sat.i8(i8 poison, i8 %a)
260  ret i8 %y6
261}
262
263define <2 x i8> @sadd_vector_undef_commute(<2 x i8> %a) {
264; CHECK-LABEL: @sadd_vector_undef_commute(
265; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
266;
267  %y6v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> undef, <2 x i8> %a)
268  ret <2 x i8> %y6v
269}
270
271define <2 x i8> @sadd_vector_poison_commute(<2 x i8> %a) {
272; CHECK-LABEL: @sadd_vector_poison_commute(
273; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
274;
275  %y6v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> poison, <2 x i8> %a)
276  ret <2 x i8> %y6v
277}
278
279define i8 @usub_scalar_0(i8 %a) {
280; CHECK-LABEL: @usub_scalar_0(
281; CHECK-NEXT:    ret i8 [[A:%.*]]
282;
283  %x1 = call i8 @llvm.usub.sat.i8(i8 %a, i8 0)
284  ret i8 %x1
285}
286
287define <2 x i8> @usub_vector_0(<2 x i8> %a) {
288; CHECK-LABEL: @usub_vector_0(
289; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
290;
291  %x1v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 0, i8 0>)
292  ret <2 x i8> %x1v
293}
294
295define i8 @usub_scalar_0_commute(i8 %a) {
296; CHECK-LABEL: @usub_scalar_0_commute(
297; CHECK-NEXT:    ret i8 0
298;
299  %x2 = call i8 @llvm.usub.sat.i8(i8 0, i8 %a)
300  ret i8 %x2
301}
302
303define <2 x i8> @usub_vector_0_commute(<2 x i8> %a) {
304; CHECK-LABEL: @usub_vector_0_commute(
305; CHECK-NEXT:    ret <2 x i8> zeroinitializer
306;
307  %x2v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 0, i8 0>, <2 x i8> %a)
308  ret <2 x i8> %x2v
309}
310
311define i8 @usub_scalar_maxval(i8 %a) {
312; CHECK-LABEL: @usub_scalar_maxval(
313; CHECK-NEXT:    ret i8 0
314;
315  %x3 = call i8 @llvm.usub.sat.i8(i8 %a, i8 255)
316  ret i8 %x3
317}
318
319define <2 x i8> @usub_vector_maxval(<2 x i8> %a) {
320; CHECK-LABEL: @usub_vector_maxval(
321; CHECK-NEXT:    ret <2 x i8> zeroinitializer
322;
323  %x3v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 255, i8 255>)
324  ret <2 x i8> %x3v
325}
326
327define i8 @usub_scalar_undef(i8 %a) {
328; CHECK-LABEL: @usub_scalar_undef(
329; CHECK-NEXT:    ret i8 0
330;
331  %x4 = call i8 @llvm.usub.sat.i8(i8 %a, i8 undef)
332  ret i8 %x4
333}
334
335define i8 @usub_scalar_poison(i8 %a) {
336; CHECK-LABEL: @usub_scalar_poison(
337; CHECK-NEXT:    ret i8 0
338;
339  %x4 = call i8 @llvm.usub.sat.i8(i8 %a, i8 poison)
340  ret i8 %x4
341}
342
343define <2 x i8> @usub_vector_undef(<2 x i8> %a) {
344; CHECK-LABEL: @usub_vector_undef(
345; CHECK-NEXT:    ret <2 x i8> zeroinitializer
346;
347  %x4v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 undef>)
348  ret <2 x i8> %x4v
349}
350
351define <2 x i8> @usub_vector_poison(<2 x i8> %a) {
352; CHECK-LABEL: @usub_vector_poison(
353; CHECK-NEXT:    ret <2 x i8> zeroinitializer
354;
355  %x4v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 poison, i8 poison>)
356  ret <2 x i8> %x4v
357}
358
359define i8 @usub_scalar_undef_commute(i8 %a) {
360; CHECK-LABEL: @usub_scalar_undef_commute(
361; CHECK-NEXT:    ret i8 0
362;
363  %x5 = call i8 @llvm.usub.sat.i8(i8 undef, i8 %a)
364  ret i8 %x5
365}
366
367define i8 @usub_scalar_poison_commute(i8 %a) {
368; CHECK-LABEL: @usub_scalar_poison_commute(
369; CHECK-NEXT:    ret i8 0
370;
371  %x5 = call i8 @llvm.usub.sat.i8(i8 poison, i8 %a)
372  ret i8 %x5
373}
374
375define <2 x i8> @usub_vector_undef_commute(<2 x i8> %a) {
376; CHECK-LABEL: @usub_vector_undef_commute(
377; CHECK-NEXT:    ret <2 x i8> zeroinitializer
378;
379  %x5v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 undef, i8 undef>, <2 x i8> %a)
380  ret <2 x i8> %x5v
381}
382
383define <2 x i8> @usub_vector_poison_commute(<2 x i8> %a) {
384; CHECK-LABEL: @usub_vector_poison_commute(
385; CHECK-NEXT:    ret <2 x i8> zeroinitializer
386;
387  %x5v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 poison, i8 poison>, <2 x i8> %a)
388  ret <2 x i8> %x5v
389}
390
391define i8 @usub_scalar_same(i8 %a) {
392; CHECK-LABEL: @usub_scalar_same(
393; CHECK-NEXT:    ret i8 0
394;
395  %x6 = call i8 @llvm.usub.sat.i8(i8 %a, i8 %a)
396  ret i8 %x6
397}
398
399define <2 x i8> @usub_vector_same(<2 x i8> %a) {
400; CHECK-LABEL: @usub_vector_same(
401; CHECK-NEXT:    ret <2 x i8> zeroinitializer
402;
403  %x6v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> %a)
404  ret <2 x i8> %x6v
405}
406
407define i8 @ssub_scalar_0(i8 %a) {
408; CHECK-LABEL: @ssub_scalar_0(
409; CHECK-NEXT:    ret i8 [[A:%.*]]
410;
411  %y1 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 0)
412  ret i8 %y1
413}
414
415define <2 x i8> @ssub_vector_0(<2 x i8> %a) {
416; CHECK-LABEL: @ssub_vector_0(
417; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
418;
419  %y1v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 0, i8 0>)
420  ret <2 x i8> %y1v
421}
422
423define i8 @ssub_scalar_0_commute(i8 %a) {
424; CHECK-LABEL: @ssub_scalar_0_commute(
425; CHECK-NEXT:    [[Y2:%.*]] = call i8 @llvm.ssub.sat.i8(i8 0, i8 [[A:%.*]])
426; CHECK-NEXT:    ret i8 [[Y2]]
427;
428  %y2 = call i8 @llvm.ssub.sat.i8(i8 0, i8 %a)
429  ret i8 %y2
430}
431
432define <2 x i8> @ssub_vector_0_commute(<2 x i8> %a) {
433; CHECK-LABEL: @ssub_vector_0_commute(
434; CHECK-NEXT:    [[Y2V:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> zeroinitializer, <2 x i8> [[A:%.*]])
435; CHECK-NEXT:    ret <2 x i8> [[Y2V]]
436;
437  %y2v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 0, i8 0>, <2 x i8> %a)
438  ret <2 x i8> %y2v
439}
440
441define i8 @ssub_scalar_maxval(i8 %a) {
442; CHECK-LABEL: @ssub_scalar_maxval(
443; CHECK-NEXT:    [[Y3:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 127)
444; CHECK-NEXT:    ret i8 [[Y3]]
445;
446  %y3 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 127)
447  ret i8 %y3
448}
449
450define <2 x i8> @ssub_vector_maxval(<2 x i8> %a) {
451; CHECK-LABEL: @ssub_vector_maxval(
452; CHECK-NEXT:    [[Y3V:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> [[A:%.*]], <2 x i8> <i8 127, i8 127>)
453; CHECK-NEXT:    ret <2 x i8> [[Y3V]]
454;
455  %y3v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 127, i8 127>)
456  ret <2 x i8> %y3v
457}
458
459define i8 @ssub_scalar_undef(i8 %a) {
460; CHECK-LABEL: @ssub_scalar_undef(
461; CHECK-NEXT:    ret i8 0
462;
463  %y4 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 undef)
464  ret i8 %y4
465}
466
467define i8 @ssub_scalar_poison(i8 %a) {
468; CHECK-LABEL: @ssub_scalar_poison(
469; CHECK-NEXT:    ret i8 0
470;
471  %y4 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 poison)
472  ret i8 %y4
473}
474
475define <2 x i8> @ssub_vector_undef(<2 x i8> %a) {
476; CHECK-LABEL: @ssub_vector_undef(
477; CHECK-NEXT:    ret <2 x i8> zeroinitializer
478;
479  %y4v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> undef)
480  ret <2 x i8> %y4v
481}
482
483define <2 x i8> @ssub_vector_poison(<2 x i8> %a) {
484; CHECK-LABEL: @ssub_vector_poison(
485; CHECK-NEXT:    ret <2 x i8> zeroinitializer
486;
487  %y4v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> poison)
488  ret <2 x i8> %y4v
489}
490
491define i8 @ssub_scalar_undef_commute(i8 %a) {
492; CHECK-LABEL: @ssub_scalar_undef_commute(
493; CHECK-NEXT:    ret i8 0
494;
495  %y5 = call i8 @llvm.ssub.sat.i8(i8 undef, i8 %a)
496  ret i8 %y5
497}
498
499define i8 @ssub_scalar_poison_commute(i8 %a) {
500; CHECK-LABEL: @ssub_scalar_poison_commute(
501; CHECK-NEXT:    ret i8 0
502;
503  %y5 = call i8 @llvm.ssub.sat.i8(i8 poison, i8 %a)
504  ret i8 %y5
505}
506
507define <2 x i8> @ssub_vector_undef_commute(<2 x i8> %a) {
508; CHECK-LABEL: @ssub_vector_undef_commute(
509; CHECK-NEXT:    ret <2 x i8> zeroinitializer
510;
511  %y5v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 undef, i8 undef>, <2 x i8> %a)
512  ret <2 x i8> %y5v
513}
514
515define <2 x i8> @ssub_vector_poison_commute(<2 x i8> %a) {
516; CHECK-LABEL: @ssub_vector_poison_commute(
517; CHECK-NEXT:    ret <2 x i8> zeroinitializer
518;
519  %y5v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 poison, i8 poison>, <2 x i8> %a)
520  ret <2 x i8> %y5v
521}
522
523define i8 @ssub_scalar_same(i8 %a) {
524; CHECK-LABEL: @ssub_scalar_same(
525; CHECK-NEXT:    ret i8 0
526;
527  %y6 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 %a)
528  ret i8 %y6
529}
530
531define <2 x i8> @ssub_vector_same(<2 x i8> %a) {
532; CHECK-LABEL: @ssub_vector_same(
533; CHECK-NEXT:    ret <2 x i8> zeroinitializer
534;
535  %y6v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> %a)
536  ret <2 x i8> %y6v
537}
538
539define i1 @uadd_icmp_op0_known(i8 %a) {
540; CHECK-LABEL: @uadd_icmp_op0_known(
541; CHECK-NEXT:    ret i1 true
542;
543  %b = call i8 @llvm.uadd.sat.i8(i8 10, i8 %a)
544  %c = icmp uge i8 %b, 10
545  ret i1 %c
546}
547
548define i1 @uadd_icmp_op0_unknown(i8 %a) {
549; CHECK-LABEL: @uadd_icmp_op0_unknown(
550; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.uadd.sat.i8(i8 10, i8 [[A:%.*]])
551; CHECK-NEXT:    [[C:%.*]] = icmp ugt i8 [[B]], 10
552; CHECK-NEXT:    ret i1 [[C]]
553;
554  %b = call i8 @llvm.uadd.sat.i8(i8 10, i8 %a)
555  %c = icmp ugt i8 %b, 10
556  ret i1 %c
557}
558
559define i1 @uadd_icmp_op1_known(i8 %a) {
560; CHECK-LABEL: @uadd_icmp_op1_known(
561; CHECK-NEXT:    ret i1 true
562;
563  %b = call i8 @llvm.uadd.sat.i8(i8 %a, i8 10)
564  %c = icmp uge i8 %b, 10
565  ret i1 %c
566}
567
568define i1 @uadd_icmp_op1_unknown(i8 %a) {
569; CHECK-LABEL: @uadd_icmp_op1_unknown(
570; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[A:%.*]], i8 10)
571; CHECK-NEXT:    [[C:%.*]] = icmp ugt i8 [[B]], 10
572; CHECK-NEXT:    ret i1 [[C]]
573;
574  %b = call i8 @llvm.uadd.sat.i8(i8 %a, i8 10)
575  %c = icmp ugt i8 %b, 10
576  ret i1 %c
577}
578
579define i1 @sadd_icmp_op0_pos_known(i8 %a) {
580; CHECK-LABEL: @sadd_icmp_op0_pos_known(
581; CHECK-NEXT:    ret i1 true
582;
583  %b = call i8 @llvm.sadd.sat.i8(i8 10, i8 %a)
584  %c = icmp sge i8 %b, -118
585  ret i1 %c
586}
587
588define i1 @sadd_icmp_op0_pos_unknown(i8 %a) {
589; CHECK-LABEL: @sadd_icmp_op0_pos_unknown(
590; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 10, i8 [[A:%.*]])
591; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -118
592; CHECK-NEXT:    ret i1 [[C]]
593;
594  %b = call i8 @llvm.sadd.sat.i8(i8 10, i8 %a)
595  %c = icmp sgt i8 %b, -118
596  ret i1 %c
597}
598
599define i1 @sadd_icmp_op0_neg_known(i8 %a) {
600; CHECK-LABEL: @sadd_icmp_op0_neg_known(
601; CHECK-NEXT:    ret i1 true
602;
603  %b = call i8 @llvm.sadd.sat.i8(i8 -10, i8 %a)
604  %c = icmp sle i8 %b, 117
605  ret i1 %c
606}
607
608define i1 @sadd_icmp_op0_neg_unknown(i8 %a) {
609; CHECK-LABEL: @sadd_icmp_op0_neg_unknown(
610; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 -10, i8 [[A:%.*]])
611; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 117
612; CHECK-NEXT:    ret i1 [[C]]
613;
614  %b = call i8 @llvm.sadd.sat.i8(i8 -10, i8 %a)
615  %c = icmp slt i8 %b, 117
616  ret i1 %c
617}
618
619define i1 @sadd_icmp_op1_pos_known(i8 %a) {
620; CHECK-LABEL: @sadd_icmp_op1_pos_known(
621; CHECK-NEXT:    ret i1 true
622;
623  %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 10)
624  %c = icmp sge i8 %b, -118
625  ret i1 %c
626}
627
628define i1 @sadd_icmp_op1_pos_unknown(i8 %a) {
629; CHECK-LABEL: @sadd_icmp_op1_pos_unknown(
630; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 10)
631; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -118
632; CHECK-NEXT:    ret i1 [[C]]
633;
634  %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 10)
635  %c = icmp sgt i8 %b, -118
636  ret i1 %c
637}
638
639define i1 @sadd_icmp_op1_neg_known(i8 %a) {
640; CHECK-LABEL: @sadd_icmp_op1_neg_known(
641; CHECK-NEXT:    ret i1 true
642;
643  %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 -10)
644  %c = icmp sle i8 %b, 117
645  ret i1 %c
646}
647
648define i1 @sadd_icmp_op1_neg_unknown(i8 %a) {
649; CHECK-LABEL: @sadd_icmp_op1_neg_unknown(
650; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 -10)
651; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 117
652; CHECK-NEXT:    ret i1 [[C]]
653;
654  %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 -10)
655  %c = icmp slt i8 %b, 117
656  ret i1 %c
657}
658
659define i1 @usub_icmp_op0_known(i8 %a) {
660; CHECK-LABEL: @usub_icmp_op0_known(
661; CHECK-NEXT:    ret i1 true
662;
663  %b = call i8 @llvm.usub.sat.i8(i8 10, i8 %a)
664  %c = icmp ule i8 %b, 10
665  ret i1 %c
666}
667
668define i1 @usub_icmp_op0_unknown(i8 %a) {
669; CHECK-LABEL: @usub_icmp_op0_unknown(
670; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.usub.sat.i8(i8 10, i8 [[A:%.*]])
671; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[B]], 10
672; CHECK-NEXT:    ret i1 [[C]]
673;
674  %b = call i8 @llvm.usub.sat.i8(i8 10, i8 %a)
675  %c = icmp ult i8 %b, 10
676  ret i1 %c
677}
678
679define i1 @usub_icmp_op1_known(i8 %a) {
680; CHECK-LABEL: @usub_icmp_op1_known(
681; CHECK-NEXT:    ret i1 true
682;
683  %b = call i8 @llvm.usub.sat.i8(i8 %a, i8 10)
684  %c = icmp ule i8 %b, 245
685  ret i1 %c
686}
687
688define i1 @usub_icmp_op1_unknown(i8 %a) {
689; CHECK-LABEL: @usub_icmp_op1_unknown(
690; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A:%.*]], i8 10)
691; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[B]], -11
692; CHECK-NEXT:    ret i1 [[C]]
693;
694  %b = call i8 @llvm.usub.sat.i8(i8 %a, i8 10)
695  %c = icmp ult i8 %b, 245
696  ret i1 %c
697}
698
699define i1 @ssub_icmp_op0_pos_known(i8 %a) {
700; CHECK-LABEL: @ssub_icmp_op0_pos_known(
701; CHECK-NEXT:    ret i1 true
702;
703  %b = call i8 @llvm.ssub.sat.i8(i8 10, i8 %a)
704  %c = icmp sge i8 %b, -117
705  ret i1 %c
706}
707
708define i1 @ssub_icmp_op0_pos_unknown(i8 %a) {
709; CHECK-LABEL: @ssub_icmp_op0_pos_unknown(
710; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 10, i8 [[A:%.*]])
711; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -117
712; CHECK-NEXT:    ret i1 [[C]]
713;
714  %b = call i8 @llvm.ssub.sat.i8(i8 10, i8 %a)
715  %c = icmp sgt i8 %b, -117
716  ret i1 %c
717}
718
719define i1 @ssub_icmp_op0_neg_known(i8 %a) {
720; CHECK-LABEL: @ssub_icmp_op0_neg_known(
721; CHECK-NEXT:    ret i1 true
722;
723  %b = call i8 @llvm.ssub.sat.i8(i8 -10, i8 %a)
724  %c = icmp sle i8 %b, 118
725  ret i1 %c
726}
727
728define i1 @ssub_icmp_op0_neg_unknown(i8 %a) {
729; CHECK-LABEL: @ssub_icmp_op0_neg_unknown(
730; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 -10, i8 [[A:%.*]])
731; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 118
732; CHECK-NEXT:    ret i1 [[C]]
733;
734  %b = call i8 @llvm.ssub.sat.i8(i8 -10, i8 %a)
735  %c = icmp slt i8 %b, 118
736  ret i1 %c
737}
738
739; Peculiar case: ssub.sat(0, x) is never signed min.
740define i1 @ssub_icmp_op0_zero(i8 %a) {
741; CHECK-LABEL: @ssub_icmp_op0_zero(
742; CHECK-NEXT:    ret i1 true
743;
744  %b = call i8 @llvm.ssub.sat.i8(i8 0, i8 %a)
745  %c = icmp ne i8 %b, -128
746  ret i1 %c
747}
748
749define i1 @ssub_icmp_op1_pos_known(i8 %a) {
750; CHECK-LABEL: @ssub_icmp_op1_pos_known(
751; CHECK-NEXT:    ret i1 true
752;
753  %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 10)
754  %c = icmp sle i8 %b, 117
755  ret i1 %c
756}
757
758define i1 @ssub_icmp_op1_pos_unknown(i8 %a) {
759; CHECK-LABEL: @ssub_icmp_op1_pos_unknown(
760; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 10)
761; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 117
762; CHECK-NEXT:    ret i1 [[C]]
763;
764  %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 10)
765  %c = icmp slt i8 %b, 117
766  ret i1 %c
767}
768
769define i1 @ssub_icmp_op1_neg_known(i8 %a) {
770; CHECK-LABEL: @ssub_icmp_op1_neg_known(
771; CHECK-NEXT:    ret i1 true
772;
773  %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -10)
774  %c = icmp sge i8 %b, -118
775  ret i1 %c
776}
777
778define i1 @ssub_icmp_op1_neg_unknown(i8 %a) {
779; CHECK-LABEL: @ssub_icmp_op1_neg_unknown(
780; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 -10)
781; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -118
782; CHECK-NEXT:    ret i1 [[C]]
783;
784  %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -10)
785  %c = icmp sgt i8 %b, -118
786  ret i1 %c
787}
788
789define i1 @ssub_icmp_op1_smin(i8 %a) {
790; CHECK-LABEL: @ssub_icmp_op1_smin(
791; CHECK-NEXT:    ret i1 true
792;
793  %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -128)
794  %c = icmp sge i8 %b, 0
795  ret i1 %c
796}
797