xref: /llvm-project/llvm/test/Transforms/InstCombine/overflow_to_sat.ll (revision d2ec416c7babe65947ab841f9c9eb08844af3549)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -instcombine < %s | FileCheck %s
3
4define i32 @uadd(i32 %x, i32 %y) {
5; CHECK-LABEL: @uadd(
6; CHECK-NEXT:    [[AO:%.*]] = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
7; CHECK-NEXT:    [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
8; CHECK-NEXT:    [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
9; CHECK-NEXT:    [[S:%.*]] = select i1 [[O]], i32 -1, i32 [[A]]
10; CHECK-NEXT:    ret i32 [[S]]
11;
12  %ao = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
13  %o = extractvalue { i32, i1 } %ao, 1
14  %a = extractvalue { i32, i1 } %ao, 0
15  %s = select i1 %o, i32 -1, i32 %a
16  ret i32 %s
17}
18
19define i32 @usub(i32 %x, i32 %y) {
20; CHECK-LABEL: @usub(
21; CHECK-NEXT:    [[AO:%.*]] = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
22; CHECK-NEXT:    [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
23; CHECK-NEXT:    [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
24; CHECK-NEXT:    [[S:%.*]] = select i1 [[O]], i32 0, i32 [[A]]
25; CHECK-NEXT:    ret i32 [[S]]
26;
27  %ao = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %x, i32 %y)
28  %o = extractvalue { i32, i1 } %ao, 1
29  %a = extractvalue { i32, i1 } %ao, 0
30  %s = select i1 %o, i32 0, i32 %a
31  ret i32 %s
32}
33
34
35define i8 @sadd_x_lt_min(i8 %x, i8 %y) {
36; CHECK-LABEL: @sadd_x_lt_min(
37; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
38; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
39; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
40; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 0
41; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
42; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
43; CHECK-NEXT:    ret i8 [[R]]
44;
45  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
46  %o = extractvalue { i8, i1 } %ao, 1
47  %a = extractvalue { i8, i1 } %ao, 0
48  %c = icmp slt i8 %x, 0
49  %s = select i1 %c, i8 127, i8 -128
50  %r = select i1 %o, i8 %s, i8 %a
51  ret i8 %r
52}
53
54define i8 @sadd_x_lt_max(i8 %x, i8 %y) {
55; CHECK-LABEL: @sadd_x_lt_max(
56; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
57; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
58; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
59; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 0
60; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
61; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
62; CHECK-NEXT:    ret i8 [[R]]
63;
64  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
65  %o = extractvalue { i8, i1 } %ao, 1
66  %a = extractvalue { i8, i1 } %ao, 0
67  %c = icmp slt i8 %x, 0
68  %s = select i1 %c, i8 -128, i8 127
69  %r = select i1 %o, i8 %s, i8 %a
70  ret i8 %r
71}
72
73define i8 @sadd_x_le_min(i8 %x, i8 %y) {
74; CHECK-LABEL: @sadd_x_le_min(
75; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
76; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
77; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
78; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 1
79; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
80; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
81; CHECK-NEXT:    ret i8 [[R]]
82;
83  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
84  %o = extractvalue { i8, i1 } %ao, 1
85  %a = extractvalue { i8, i1 } %ao, 0
86  %c = icmp sle i8 %x, 0
87  %s = select i1 %c, i8 127, i8 -128
88  %r = select i1 %o, i8 %s, i8 %a
89  ret i8 %r
90}
91
92define i8 @sadd_x_le_max(i8 %x, i8 %y) {
93; CHECK-LABEL: @sadd_x_le_max(
94; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
95; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
96; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
97; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 1
98; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
99; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
100; CHECK-NEXT:    ret i8 [[R]]
101;
102  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
103  %o = extractvalue { i8, i1 } %ao, 1
104  %a = extractvalue { i8, i1 } %ao, 0
105  %c = icmp sle i8 %x, 0
106  %s = select i1 %c, i8 -128, i8 127
107  %r = select i1 %o, i8 %s, i8 %a
108  ret i8 %r
109}
110
111define i8 @sadd_x_gt_min(i8 %x, i8 %y) {
112; CHECK-LABEL: @sadd_x_gt_min(
113; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
114; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
115; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
116; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], 0
117; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
118; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
119; CHECK-NEXT:    ret i8 [[R]]
120;
121  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
122  %o = extractvalue { i8, i1 } %ao, 1
123  %a = extractvalue { i8, i1 } %ao, 0
124  %c = icmp sgt i8 %x, 0
125  %s = select i1 %c, i8 127, i8 -128
126  %r = select i1 %o, i8 %s, i8 %a
127  ret i8 %r
128}
129
130define i8 @sadd_x_gt_max(i8 %x, i8 %y) {
131; CHECK-LABEL: @sadd_x_gt_max(
132; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
133; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
134; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
135; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], 0
136; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
137; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
138; CHECK-NEXT:    ret i8 [[R]]
139;
140  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
141  %o = extractvalue { i8, i1 } %ao, 1
142  %a = extractvalue { i8, i1 } %ao, 0
143  %c = icmp sgt i8 %x, 0
144  %s = select i1 %c, i8 -128, i8 127
145  %r = select i1 %o, i8 %s, i8 %a
146  ret i8 %r
147}
148
149define i8 @sadd_x_ge_min(i8 %x, i8 %y) {
150; CHECK-LABEL: @sadd_x_ge_min(
151; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
152; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
153; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
154; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], -1
155; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
156; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
157; CHECK-NEXT:    ret i8 [[R]]
158;
159  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
160  %o = extractvalue { i8, i1 } %ao, 1
161  %a = extractvalue { i8, i1 } %ao, 0
162  %c = icmp sge i8 %x, 0
163  %s = select i1 %c, i8 127, i8 -128
164  %r = select i1 %o, i8 %s, i8 %a
165  ret i8 %r
166}
167
168define i8 @sadd_x_ge_max(i8 %x, i8 %y) {
169; CHECK-LABEL: @sadd_x_ge_max(
170; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
171; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
172; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
173; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], -1
174; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
175; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
176; CHECK-NEXT:    ret i8 [[R]]
177;
178  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
179  %o = extractvalue { i8, i1 } %ao, 1
180  %a = extractvalue { i8, i1 } %ao, 0
181  %c = icmp sge i8 %x, 0
182  %s = select i1 %c, i8 -128, i8 127
183  %r = select i1 %o, i8 %s, i8 %a
184  ret i8 %r
185}
186
187
188define i8 @sadd_y_lt_min(i8 %x, i8 %y) {
189; CHECK-LABEL: @sadd_y_lt_min(
190; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
191; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
192; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
193; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 0
194; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
195; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
196; CHECK-NEXT:    ret i8 [[R]]
197;
198  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
199  %o = extractvalue { i8, i1 } %ao, 1
200  %a = extractvalue { i8, i1 } %ao, 0
201  %c = icmp slt i8 %y, 0
202  %s = select i1 %c, i8 127, i8 -128
203  %r = select i1 %o, i8 %s, i8 %a
204  ret i8 %r
205}
206
207define i8 @sadd_y_lt_max(i8 %x, i8 %y) {
208; CHECK-LABEL: @sadd_y_lt_max(
209; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
210; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
211; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
212; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 0
213; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
214; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
215; CHECK-NEXT:    ret i8 [[R]]
216;
217  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
218  %o = extractvalue { i8, i1 } %ao, 1
219  %a = extractvalue { i8, i1 } %ao, 0
220  %c = icmp slt i8 %y, 0
221  %s = select i1 %c, i8 -128, i8 127
222  %r = select i1 %o, i8 %s, i8 %a
223  ret i8 %r
224}
225
226define i8 @sadd_y_le_min(i8 %x, i8 %y) {
227; CHECK-LABEL: @sadd_y_le_min(
228; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
229; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
230; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
231; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 1
232; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
233; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
234; CHECK-NEXT:    ret i8 [[R]]
235;
236  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
237  %o = extractvalue { i8, i1 } %ao, 1
238  %a = extractvalue { i8, i1 } %ao, 0
239  %c = icmp sle i8 %y, 0
240  %s = select i1 %c, i8 127, i8 -128
241  %r = select i1 %o, i8 %s, i8 %a
242  ret i8 %r
243}
244
245define i8 @sadd_y_le_max(i8 %x, i8 %y) {
246; CHECK-LABEL: @sadd_y_le_max(
247; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
248; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
249; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
250; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 1
251; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
252; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
253; CHECK-NEXT:    ret i8 [[R]]
254;
255  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
256  %o = extractvalue { i8, i1 } %ao, 1
257  %a = extractvalue { i8, i1 } %ao, 0
258  %c = icmp sle i8 %y, 0
259  %s = select i1 %c, i8 -128, i8 127
260  %r = select i1 %o, i8 %s, i8 %a
261  ret i8 %r
262}
263
264define i8 @sadd_y_gt_min(i8 %x, i8 %y) {
265; CHECK-LABEL: @sadd_y_gt_min(
266; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
267; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
268; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
269; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], 0
270; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
271; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
272; CHECK-NEXT:    ret i8 [[R]]
273;
274  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
275  %o = extractvalue { i8, i1 } %ao, 1
276  %a = extractvalue { i8, i1 } %ao, 0
277  %c = icmp sgt i8 %y, 0
278  %s = select i1 %c, i8 127, i8 -128
279  %r = select i1 %o, i8 %s, i8 %a
280  ret i8 %r
281}
282
283define i8 @sadd_y_gt_max(i8 %x, i8 %y) {
284; CHECK-LABEL: @sadd_y_gt_max(
285; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
286; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
287; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
288; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], 0
289; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
290; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
291; CHECK-NEXT:    ret i8 [[R]]
292;
293  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
294  %o = extractvalue { i8, i1 } %ao, 1
295  %a = extractvalue { i8, i1 } %ao, 0
296  %c = icmp sgt i8 %y, 0
297  %s = select i1 %c, i8 -128, i8 127
298  %r = select i1 %o, i8 %s, i8 %a
299  ret i8 %r
300}
301
302define i8 @sadd_y_ge_min(i8 %x, i8 %y) {
303; CHECK-LABEL: @sadd_y_ge_min(
304; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
305; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
306; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
307; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], -1
308; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
309; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
310; CHECK-NEXT:    ret i8 [[R]]
311;
312  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
313  %o = extractvalue { i8, i1 } %ao, 1
314  %a = extractvalue { i8, i1 } %ao, 0
315  %c = icmp sge i8 %y, 0
316  %s = select i1 %c, i8 127, i8 -128
317  %r = select i1 %o, i8 %s, i8 %a
318  ret i8 %r
319}
320
321define i8 @sadd_y_ge_max(i8 %x, i8 %y) {
322; CHECK-LABEL: @sadd_y_ge_max(
323; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
324; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
325; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
326; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], -1
327; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
328; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
329; CHECK-NEXT:    ret i8 [[R]]
330;
331  %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
332  %o = extractvalue { i8, i1 } %ao, 1
333  %a = extractvalue { i8, i1 } %ao, 0
334  %c = icmp sge i8 %y, 0
335  %s = select i1 %c, i8 -128, i8 127
336  %r = select i1 %o, i8 %s, i8 %a
337  ret i8 %r
338}
339
340
341
342
343define i8 @ssub_x_lt_min(i8 %x, i8 %y) {
344; CHECK-LABEL: @ssub_x_lt_min(
345; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
346; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
347; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
348; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 0
349; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
350; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
351; CHECK-NEXT:    ret i8 [[R]]
352;
353  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
354  %o = extractvalue { i8, i1 } %ao, 1
355  %a = extractvalue { i8, i1 } %ao, 0
356  %c = icmp slt i8 %x, 0
357  %s = select i1 %c, i8 127, i8 -128
358  %r = select i1 %o, i8 %s, i8 %a
359  ret i8 %r
360}
361
362define i8 @ssub_x_lt_max(i8 %x, i8 %y) {
363; CHECK-LABEL: @ssub_x_lt_max(
364; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
365; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
366; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
367; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 0
368; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
369; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
370; CHECK-NEXT:    ret i8 [[R]]
371;
372  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
373  %o = extractvalue { i8, i1 } %ao, 1
374  %a = extractvalue { i8, i1 } %ao, 0
375  %c = icmp slt i8 %x, 0
376  %s = select i1 %c, i8 -128, i8 127
377  %r = select i1 %o, i8 %s, i8 %a
378  ret i8 %r
379}
380
381define i8 @ssub_x_le_min(i8 %x, i8 %y) {
382; CHECK-LABEL: @ssub_x_le_min(
383; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
384; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
385; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
386; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 1
387; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
388; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
389; CHECK-NEXT:    ret i8 [[R]]
390;
391  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
392  %o = extractvalue { i8, i1 } %ao, 1
393  %a = extractvalue { i8, i1 } %ao, 0
394  %c = icmp sle i8 %x, 0
395  %s = select i1 %c, i8 127, i8 -128
396  %r = select i1 %o, i8 %s, i8 %a
397  ret i8 %r
398}
399
400define i8 @ssub_x_le_max(i8 %x, i8 %y) {
401; CHECK-LABEL: @ssub_x_le_max(
402; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
403; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
404; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
405; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[X]], 1
406; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
407; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
408; CHECK-NEXT:    ret i8 [[R]]
409;
410  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
411  %o = extractvalue { i8, i1 } %ao, 1
412  %a = extractvalue { i8, i1 } %ao, 0
413  %c = icmp sle i8 %x, 0
414  %s = select i1 %c, i8 -128, i8 127
415  %r = select i1 %o, i8 %s, i8 %a
416  ret i8 %r
417}
418
419define i8 @ssub_x_gt_min(i8 %x, i8 %y) {
420; CHECK-LABEL: @ssub_x_gt_min(
421; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
422; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
423; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
424; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], 0
425; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
426; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
427; CHECK-NEXT:    ret i8 [[R]]
428;
429  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
430  %o = extractvalue { i8, i1 } %ao, 1
431  %a = extractvalue { i8, i1 } %ao, 0
432  %c = icmp sgt i8 %x, 0
433  %s = select i1 %c, i8 127, i8 -128
434  %r = select i1 %o, i8 %s, i8 %a
435  ret i8 %r
436}
437
438define i8 @ssub_x_gt_max(i8 %x, i8 %y) {
439; CHECK-LABEL: @ssub_x_gt_max(
440; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
441; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
442; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
443; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], 0
444; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
445; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
446; CHECK-NEXT:    ret i8 [[R]]
447;
448  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
449  %o = extractvalue { i8, i1 } %ao, 1
450  %a = extractvalue { i8, i1 } %ao, 0
451  %c = icmp sgt i8 %x, 0
452  %s = select i1 %c, i8 -128, i8 127
453  %r = select i1 %o, i8 %s, i8 %a
454  ret i8 %r
455}
456
457define i8 @ssub_x_ge_min(i8 %x, i8 %y) {
458; CHECK-LABEL: @ssub_x_ge_min(
459; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
460; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
461; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
462; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], -1
463; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
464; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
465; CHECK-NEXT:    ret i8 [[R]]
466;
467  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
468  %o = extractvalue { i8, i1 } %ao, 1
469  %a = extractvalue { i8, i1 } %ao, 0
470  %c = icmp sge i8 %x, 0
471  %s = select i1 %c, i8 127, i8 -128
472  %r = select i1 %o, i8 %s, i8 %a
473  ret i8 %r
474}
475
476define i8 @ssub_x_ge_max(i8 %x, i8 %y) {
477; CHECK-LABEL: @ssub_x_ge_max(
478; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
479; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
480; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
481; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[X]], -1
482; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
483; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
484; CHECK-NEXT:    ret i8 [[R]]
485;
486  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
487  %o = extractvalue { i8, i1 } %ao, 1
488  %a = extractvalue { i8, i1 } %ao, 0
489  %c = icmp sge i8 %x, 0
490  %s = select i1 %c, i8 -128, i8 127
491  %r = select i1 %o, i8 %s, i8 %a
492  ret i8 %r
493}
494
495
496define i8 @ssub_y_lt_min(i8 %x, i8 %y) {
497; CHECK-LABEL: @ssub_y_lt_min(
498; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
499; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
500; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
501; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 0
502; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
503; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
504; CHECK-NEXT:    ret i8 [[R]]
505;
506  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
507  %o = extractvalue { i8, i1 } %ao, 1
508  %a = extractvalue { i8, i1 } %ao, 0
509  %c = icmp slt i8 %y, 0
510  %s = select i1 %c, i8 127, i8 -128
511  %r = select i1 %o, i8 %s, i8 %a
512  ret i8 %r
513}
514
515define i8 @ssub_y_lt_max(i8 %x, i8 %y) {
516; CHECK-LABEL: @ssub_y_lt_max(
517; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
518; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
519; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
520; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 0
521; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
522; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
523; CHECK-NEXT:    ret i8 [[R]]
524;
525  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
526  %o = extractvalue { i8, i1 } %ao, 1
527  %a = extractvalue { i8, i1 } %ao, 0
528  %c = icmp slt i8 %y, 0
529  %s = select i1 %c, i8 -128, i8 127
530  %r = select i1 %o, i8 %s, i8 %a
531  ret i8 %r
532}
533
534define i8 @ssub_y_le_min(i8 %x, i8 %y) {
535; CHECK-LABEL: @ssub_y_le_min(
536; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
537; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
538; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
539; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 1
540; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
541; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
542; CHECK-NEXT:    ret i8 [[R]]
543;
544  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
545  %o = extractvalue { i8, i1 } %ao, 1
546  %a = extractvalue { i8, i1 } %ao, 0
547  %c = icmp sle i8 %y, 0
548  %s = select i1 %c, i8 127, i8 -128
549  %r = select i1 %o, i8 %s, i8 %a
550  ret i8 %r
551}
552
553define i8 @ssub_y_le_max(i8 %x, i8 %y) {
554; CHECK-LABEL: @ssub_y_le_max(
555; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
556; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
557; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
558; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[Y]], 1
559; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
560; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
561; CHECK-NEXT:    ret i8 [[R]]
562;
563  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
564  %o = extractvalue { i8, i1 } %ao, 1
565  %a = extractvalue { i8, i1 } %ao, 0
566  %c = icmp sle i8 %y, 0
567  %s = select i1 %c, i8 -128, i8 127
568  %r = select i1 %o, i8 %s, i8 %a
569  ret i8 %r
570}
571
572define i8 @ssub_y_gt_min(i8 %x, i8 %y) {
573; CHECK-LABEL: @ssub_y_gt_min(
574; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
575; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
576; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
577; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], 0
578; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
579; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
580; CHECK-NEXT:    ret i8 [[R]]
581;
582  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
583  %o = extractvalue { i8, i1 } %ao, 1
584  %a = extractvalue { i8, i1 } %ao, 0
585  %c = icmp sgt i8 %y, 0
586  %s = select i1 %c, i8 127, i8 -128
587  %r = select i1 %o, i8 %s, i8 %a
588  ret i8 %r
589}
590
591define i8 @ssub_y_gt_max(i8 %x, i8 %y) {
592; CHECK-LABEL: @ssub_y_gt_max(
593; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
594; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
595; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
596; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], 0
597; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
598; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
599; CHECK-NEXT:    ret i8 [[R]]
600;
601  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
602  %o = extractvalue { i8, i1 } %ao, 1
603  %a = extractvalue { i8, i1 } %ao, 0
604  %c = icmp sgt i8 %y, 0
605  %s = select i1 %c, i8 -128, i8 127
606  %r = select i1 %o, i8 %s, i8 %a
607  ret i8 %r
608}
609
610define i8 @ssub_y_ge_min(i8 %x, i8 %y) {
611; CHECK-LABEL: @ssub_y_ge_min(
612; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
613; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
614; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
615; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], -1
616; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
617; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
618; CHECK-NEXT:    ret i8 [[R]]
619;
620  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
621  %o = extractvalue { i8, i1 } %ao, 1
622  %a = extractvalue { i8, i1 } %ao, 0
623  %c = icmp sge i8 %y, 0
624  %s = select i1 %c, i8 127, i8 -128
625  %r = select i1 %o, i8 %s, i8 %a
626  ret i8 %r
627}
628
629define i8 @ssub_y_ge_max(i8 %x, i8 %y) {
630; CHECK-LABEL: @ssub_y_ge_max(
631; CHECK-NEXT:    [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
632; CHECK-NEXT:    [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
633; CHECK-NEXT:    [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
634; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[Y]], -1
635; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
636; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
637; CHECK-NEXT:    ret i8 [[R]]
638;
639  %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
640  %o = extractvalue { i8, i1 } %ao, 1
641  %a = extractvalue { i8, i1 } %ao, 0
642  %c = icmp sge i8 %y, 0
643  %s = select i1 %c, i8 -128, i8 127
644  %r = select i1 %o, i8 %s, i8 %a
645  ret i8 %r
646}
647
648
649define i32 @sadd_i32(i32 %x, i32 %y) {
650; CHECK-LABEL: @sadd_i32(
651; CHECK-NEXT:    [[AO:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
652; CHECK-NEXT:    [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
653; CHECK-NEXT:    [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
654; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 [[X]], 0
655; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i32 -2147483648, i32 2147483647
656; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]
657; CHECK-NEXT:    ret i32 [[R]]
658;
659  %ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)
660  %o = extractvalue { i32, i1 } %ao, 1
661  %a = extractvalue { i32, i1 } %ao, 0
662  %c = icmp slt i32 %x, 0
663  %s = select i1 %c, i32 -2147483648, i32 2147483647
664  %r = select i1 %o, i32 %s, i32 %a
665  ret i32 %r
666}
667
668define i32 @ssub_i32(i32 %x, i32 %y) {
669; CHECK-LABEL: @ssub_i32(
670; CHECK-NEXT:    [[AO:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
671; CHECK-NEXT:    [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
672; CHECK-NEXT:    [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
673; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 [[X]], 0
674; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i32 -2147483648, i32 2147483647
675; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]
676; CHECK-NEXT:    ret i32 [[R]]
677;
678  %ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)
679  %o = extractvalue { i32, i1 } %ao, 1
680  %a = extractvalue { i32, i1 } %ao, 0
681  %c = icmp slt i32 %x, 0
682  %s = select i1 %c, i32 -2147483648, i32 2147483647
683  %r = select i1 %o, i32 %s, i32 %a
684  ret i32 %r
685}
686
687define i32 @sadd_bounds(i32 %x, i32 %y) {
688; CHECK-LABEL: @sadd_bounds(
689; CHECK-NEXT:    [[AO:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
690; CHECK-NEXT:    [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
691; CHECK-NEXT:    [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
692; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 [[X]], 0
693; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i32 -128, i32 127
694; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]
695; CHECK-NEXT:    ret i32 [[R]]
696;
697  %ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)
698  %o = extractvalue { i32, i1 } %ao, 1
699  %a = extractvalue { i32, i1 } %ao, 0
700  %c = icmp slt i32 %x, 0
701  %s = select i1 %c, i32 -128, i32 127
702  %r = select i1 %o, i32 %s, i32 %a
703  ret i32 %r
704}
705
706define i32 @ssub_bounds(i32 %x, i32 %y) {
707; CHECK-LABEL: @ssub_bounds(
708; CHECK-NEXT:    [[AO:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
709; CHECK-NEXT:    [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
710; CHECK-NEXT:    [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
711; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 [[X]], 0
712; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i32 -128, i32 127
713; CHECK-NEXT:    [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]
714; CHECK-NEXT:    ret i32 [[R]]
715;
716  %ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)
717  %o = extractvalue { i32, i1 } %ao, 1
718  %a = extractvalue { i32, i1 } %ao, 0
719  %c = icmp slt i32 %x, 0
720  %s = select i1 %c, i32 -128, i32 127
721  %r = select i1 %o, i32 %s, i32 %a
722  ret i32 %r
723}
724
725declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %0, i32 %1)
726declare { i32, i1 } @llvm.usub.with.overflow.i32(i32 %0, i32 %1)
727declare { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %0, i8 %1)
728declare { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %0, i8 %1)
729declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %0, i32 %1)
730declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %0, i32 %1)
731