xref: /llvm-project/llvm/test/CodeGen/X86/xaluo.ll (revision cca49663a56d90f6773f140269940d606aa61430)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefixes=CHECK,SDAG,GENERIC
3; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort=1 < %s | FileCheck %s --check-prefixes=CHECK,FAST
4; RUN: llc -mtriple=x86_64-darwin-unknown -mcpu=knl < %s | FileCheck %s --check-prefixes=CHECK,SDAG,KNL
5
6;
7; Get the actual value of the overflow bit.
8;
9; SADDO reg, reg
10define zeroext i1 @saddoi8(i8 signext %v1, i8 signext %v2, ptr %res) {
11; SDAG-LABEL: saddoi8:
12; SDAG:       ## %bb.0:
13; SDAG-NEXT:    addb %sil, %dil
14; SDAG-NEXT:    seto %al
15; SDAG-NEXT:    movb %dil, (%rdx)
16; SDAG-NEXT:    retq
17;
18; FAST-LABEL: saddoi8:
19; FAST:       ## %bb.0:
20; FAST-NEXT:    addb %sil, %dil
21; FAST-NEXT:    seto %al
22; FAST-NEXT:    movb %dil, (%rdx)
23; FAST-NEXT:    andb $1, %al
24; FAST-NEXT:    retq
25  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 %v2)
26  %val = extractvalue {i8, i1} %t, 0
27  %obit = extractvalue {i8, i1} %t, 1
28  store i8 %val, ptr %res
29  ret i1 %obit
30}
31
32define zeroext i1 @saddoi16(i16 %v1, i16 %v2, ptr %res) {
33; SDAG-LABEL: saddoi16:
34; SDAG:       ## %bb.0:
35; SDAG-NEXT:    addw %si, %di
36; SDAG-NEXT:    seto %al
37; SDAG-NEXT:    movw %di, (%rdx)
38; SDAG-NEXT:    retq
39;
40; FAST-LABEL: saddoi16:
41; FAST:       ## %bb.0:
42; FAST-NEXT:    addw %si, %di
43; FAST-NEXT:    seto %al
44; FAST-NEXT:    movw %di, (%rdx)
45; FAST-NEXT:    andb $1, %al
46; FAST-NEXT:    retq
47  %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 %v2)
48  %val = extractvalue {i16, i1} %t, 0
49  %obit = extractvalue {i16, i1} %t, 1
50  store i16 %val, ptr %res
51  ret i1 %obit
52}
53
54define zeroext i1 @saddoi32(i32 %v1, i32 %v2, ptr %res) {
55; SDAG-LABEL: saddoi32:
56; SDAG:       ## %bb.0:
57; SDAG-NEXT:    addl %esi, %edi
58; SDAG-NEXT:    seto %al
59; SDAG-NEXT:    movl %edi, (%rdx)
60; SDAG-NEXT:    retq
61;
62; FAST-LABEL: saddoi32:
63; FAST:       ## %bb.0:
64; FAST-NEXT:    addl %esi, %edi
65; FAST-NEXT:    seto %al
66; FAST-NEXT:    movl %edi, (%rdx)
67; FAST-NEXT:    andb $1, %al
68; FAST-NEXT:    retq
69  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
70  %val = extractvalue {i32, i1} %t, 0
71  %obit = extractvalue {i32, i1} %t, 1
72  store i32 %val, ptr %res
73  ret i1 %obit
74}
75
76define zeroext i1 @saddoi64(i64 %v1, i64 %v2, ptr %res) {
77; SDAG-LABEL: saddoi64:
78; SDAG:       ## %bb.0:
79; SDAG-NEXT:    addq %rsi, %rdi
80; SDAG-NEXT:    seto %al
81; SDAG-NEXT:    movq %rdi, (%rdx)
82; SDAG-NEXT:    retq
83;
84; FAST-LABEL: saddoi64:
85; FAST:       ## %bb.0:
86; FAST-NEXT:    addq %rsi, %rdi
87; FAST-NEXT:    seto %al
88; FAST-NEXT:    movq %rdi, (%rdx)
89; FAST-NEXT:    andb $1, %al
90; FAST-NEXT:    retq
91  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
92  %val = extractvalue {i64, i1} %t, 0
93  %obit = extractvalue {i64, i1} %t, 1
94  store i64 %val, ptr %res
95  ret i1 %obit
96}
97
98; SADDO reg, 1 | INC
99define zeroext i1 @saddoinci8(i8 %v1, ptr %res) {
100; SDAG-LABEL: saddoinci8:
101; SDAG:       ## %bb.0:
102; SDAG-NEXT:    incb %dil
103; SDAG-NEXT:    seto %al
104; SDAG-NEXT:    movb %dil, (%rsi)
105; SDAG-NEXT:    retq
106;
107; FAST-LABEL: saddoinci8:
108; FAST:       ## %bb.0:
109; FAST-NEXT:    incb %dil
110; FAST-NEXT:    seto %al
111; FAST-NEXT:    movb %dil, (%rsi)
112; FAST-NEXT:    andb $1, %al
113; FAST-NEXT:    retq
114  %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 1)
115  %val = extractvalue {i8, i1} %t, 0
116  %obit = extractvalue {i8, i1} %t, 1
117  store i8 %val, ptr %res
118  ret i1 %obit
119}
120
121define zeroext i1 @saddoinci16(i16 %v1, ptr %res) {
122; SDAG-LABEL: saddoinci16:
123; SDAG:       ## %bb.0:
124; SDAG-NEXT:    incw %di
125; SDAG-NEXT:    seto %al
126; SDAG-NEXT:    movw %di, (%rsi)
127; SDAG-NEXT:    retq
128;
129; FAST-LABEL: saddoinci16:
130; FAST:       ## %bb.0:
131; FAST-NEXT:    incw %di
132; FAST-NEXT:    seto %al
133; FAST-NEXT:    movw %di, (%rsi)
134; FAST-NEXT:    andb $1, %al
135; FAST-NEXT:    retq
136  %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 1)
137  %val = extractvalue {i16, i1} %t, 0
138  %obit = extractvalue {i16, i1} %t, 1
139  store i16 %val, ptr %res
140  ret i1 %obit
141}
142
143define zeroext i1 @saddoinci32(i32 %v1, ptr %res) {
144; SDAG-LABEL: saddoinci32:
145; SDAG:       ## %bb.0:
146; SDAG-NEXT:    incl %edi
147; SDAG-NEXT:    seto %al
148; SDAG-NEXT:    movl %edi, (%rsi)
149; SDAG-NEXT:    retq
150;
151; FAST-LABEL: saddoinci32:
152; FAST:       ## %bb.0:
153; FAST-NEXT:    incl %edi
154; FAST-NEXT:    seto %al
155; FAST-NEXT:    movl %edi, (%rsi)
156; FAST-NEXT:    andb $1, %al
157; FAST-NEXT:    retq
158  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1)
159  %val = extractvalue {i32, i1} %t, 0
160  %obit = extractvalue {i32, i1} %t, 1
161  store i32 %val, ptr %res
162  ret i1 %obit
163}
164
165define zeroext i1 @saddoinci64(i64 %v1, ptr %res) {
166; SDAG-LABEL: saddoinci64:
167; SDAG:       ## %bb.0:
168; SDAG-NEXT:    incq %rdi
169; SDAG-NEXT:    seto %al
170; SDAG-NEXT:    movq %rdi, (%rsi)
171; SDAG-NEXT:    retq
172;
173; FAST-LABEL: saddoinci64:
174; FAST:       ## %bb.0:
175; FAST-NEXT:    incq %rdi
176; FAST-NEXT:    seto %al
177; FAST-NEXT:    movq %rdi, (%rsi)
178; FAST-NEXT:    andb $1, %al
179; FAST-NEXT:    retq
180  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1)
181  %val = extractvalue {i64, i1} %t, 0
182  %obit = extractvalue {i64, i1} %t, 1
183  store i64 %val, ptr %res
184  ret i1 %obit
185}
186
187; SADDO reg, imm | imm, reg
188define zeroext i1 @saddoi64imm1(i64 %v1, ptr %res) {
189; SDAG-LABEL: saddoi64imm1:
190; SDAG:       ## %bb.0:
191; SDAG-NEXT:    addq $2, %rdi
192; SDAG-NEXT:    seto %al
193; SDAG-NEXT:    movq %rdi, (%rsi)
194; SDAG-NEXT:    retq
195;
196; FAST-LABEL: saddoi64imm1:
197; FAST:       ## %bb.0:
198; FAST-NEXT:    addq $2, %rdi
199; FAST-NEXT:    seto %al
200; FAST-NEXT:    movq %rdi, (%rsi)
201; FAST-NEXT:    andb $1, %al
202; FAST-NEXT:    retq
203  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1)
204  %val = extractvalue {i64, i1} %t, 0
205  %obit = extractvalue {i64, i1} %t, 1
206  store i64 %val, ptr %res
207  ret i1 %obit
208}
209
210; Check boundary conditions for large immediates.
211define zeroext i1 @saddoi64imm2(i64 %v1, ptr %res) {
212; SDAG-LABEL: saddoi64imm2:
213; SDAG:       ## %bb.0:
214; SDAG-NEXT:    addq $-2147483648, %rdi ## imm = 0x80000000
215; SDAG-NEXT:    seto %al
216; SDAG-NEXT:    movq %rdi, (%rsi)
217; SDAG-NEXT:    retq
218;
219; FAST-LABEL: saddoi64imm2:
220; FAST:       ## %bb.0:
221; FAST-NEXT:    addq $-2147483648, %rdi ## imm = 0x80000000
222; FAST-NEXT:    seto %al
223; FAST-NEXT:    movq %rdi, (%rsi)
224; FAST-NEXT:    andb $1, %al
225; FAST-NEXT:    retq
226  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648)
227  %val = extractvalue {i64, i1} %t, 0
228  %obit = extractvalue {i64, i1} %t, 1
229  store i64 %val, ptr %res
230  ret i1 %obit
231}
232
233define zeroext i1 @saddoi64imm3(i64 %v1, ptr %res) {
234; SDAG-LABEL: saddoi64imm3:
235; SDAG:       ## %bb.0:
236; SDAG-NEXT:    movabsq $-21474836489, %rcx ## imm = 0xFFFFFFFAFFFFFFF7
237; SDAG-NEXT:    addq %rdi, %rcx
238; SDAG-NEXT:    seto %al
239; SDAG-NEXT:    movq %rcx, (%rsi)
240; SDAG-NEXT:    retq
241;
242; FAST-LABEL: saddoi64imm3:
243; FAST:       ## %bb.0:
244; FAST-NEXT:    movabsq $-21474836489, %rcx ## imm = 0xFFFFFFFAFFFFFFF7
245; FAST-NEXT:    addq %rdi, %rcx
246; FAST-NEXT:    seto %al
247; FAST-NEXT:    movq %rcx, (%rsi)
248; FAST-NEXT:    andb $1, %al
249; FAST-NEXT:    retq
250  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489)
251  %val = extractvalue {i64, i1} %t, 0
252  %obit = extractvalue {i64, i1} %t, 1
253  store i64 %val, ptr %res
254  ret i1 %obit
255}
256
257define zeroext i1 @saddoi64imm4(i64 %v1, ptr %res) {
258; SDAG-LABEL: saddoi64imm4:
259; SDAG:       ## %bb.0:
260; SDAG-NEXT:    addq $2147483647, %rdi ## imm = 0x7FFFFFFF
261; SDAG-NEXT:    seto %al
262; SDAG-NEXT:    movq %rdi, (%rsi)
263; SDAG-NEXT:    retq
264;
265; FAST-LABEL: saddoi64imm4:
266; FAST:       ## %bb.0:
267; FAST-NEXT:    addq $2147483647, %rdi ## imm = 0x7FFFFFFF
268; FAST-NEXT:    seto %al
269; FAST-NEXT:    movq %rdi, (%rsi)
270; FAST-NEXT:    andb $1, %al
271; FAST-NEXT:    retq
272  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647)
273  %val = extractvalue {i64, i1} %t, 0
274  %obit = extractvalue {i64, i1} %t, 1
275  store i64 %val, ptr %res
276  ret i1 %obit
277}
278
279define zeroext i1 @saddoi64imm5(i64 %v1, ptr %res) {
280; SDAG-LABEL: saddoi64imm5:
281; SDAG:       ## %bb.0:
282; SDAG-NEXT:    subq $-2147483648, %rdi ## imm = 0x80000000
283; SDAG-NEXT:    seto %al
284; SDAG-NEXT:    movq %rdi, (%rsi)
285; SDAG-NEXT:    retq
286;
287; FAST-LABEL: saddoi64imm5:
288; FAST:       ## %bb.0:
289; FAST-NEXT:    movl $2147483648, %ecx ## imm = 0x80000000
290; FAST-NEXT:    addq %rdi, %rcx
291; FAST-NEXT:    seto %al
292; FAST-NEXT:    movq %rcx, (%rsi)
293; FAST-NEXT:    andb $1, %al
294; FAST-NEXT:    retq
295  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648)
296  %val = extractvalue {i64, i1} %t, 0
297  %obit = extractvalue {i64, i1} %t, 1
298  store i64 %val, ptr %res
299  ret i1 %obit
300}
301
302; UADDO
303define zeroext i1 @uaddoi32(i32 %v1, i32 %v2, ptr %res) {
304; SDAG-LABEL: uaddoi32:
305; SDAG:       ## %bb.0:
306; SDAG-NEXT:    addl %esi, %edi
307; SDAG-NEXT:    setb %al
308; SDAG-NEXT:    movl %edi, (%rdx)
309; SDAG-NEXT:    retq
310;
311; FAST-LABEL: uaddoi32:
312; FAST:       ## %bb.0:
313; FAST-NEXT:    addl %esi, %edi
314; FAST-NEXT:    setb %al
315; FAST-NEXT:    movl %edi, (%rdx)
316; FAST-NEXT:    andb $1, %al
317; FAST-NEXT:    retq
318  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
319  %val = extractvalue {i32, i1} %t, 0
320  %obit = extractvalue {i32, i1} %t, 1
321  store i32 %val, ptr %res
322  ret i1 %obit
323}
324
325define zeroext i1 @uaddoi64(i64 %v1, i64 %v2, ptr %res) {
326; SDAG-LABEL: uaddoi64:
327; SDAG:       ## %bb.0:
328; SDAG-NEXT:    addq %rsi, %rdi
329; SDAG-NEXT:    setb %al
330; SDAG-NEXT:    movq %rdi, (%rdx)
331; SDAG-NEXT:    retq
332;
333; FAST-LABEL: uaddoi64:
334; FAST:       ## %bb.0:
335; FAST-NEXT:    addq %rsi, %rdi
336; FAST-NEXT:    setb %al
337; FAST-NEXT:    movq %rdi, (%rdx)
338; FAST-NEXT:    andb $1, %al
339; FAST-NEXT:    retq
340  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
341  %val = extractvalue {i64, i1} %t, 0
342  %obit = extractvalue {i64, i1} %t, 1
343  store i64 %val, ptr %res
344  ret i1 %obit
345}
346
347; UADDO reg, 1 | NOT INC
348define zeroext i1 @uaddoinci8(i8 %v1, ptr %res) {
349; SDAG-LABEL: uaddoinci8:
350; SDAG:       ## %bb.0:
351; SDAG-NEXT:    incb %dil
352; SDAG-NEXT:    sete %al
353; SDAG-NEXT:    movb %dil, (%rsi)
354; SDAG-NEXT:    retq
355;
356; FAST-LABEL: uaddoinci8:
357; FAST:       ## %bb.0:
358; FAST-NEXT:    addb $1, %dil
359; FAST-NEXT:    setb %al
360; FAST-NEXT:    movb %dil, (%rsi)
361; FAST-NEXT:    andb $1, %al
362; FAST-NEXT:    retq
363  %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v1, i8 1)
364  %val = extractvalue {i8, i1} %t, 0
365  %obit = extractvalue {i8, i1} %t, 1
366  store i8 %val, ptr %res
367  ret i1 %obit
368}
369
370define zeroext i1 @uaddoinci16(i16 %v1, ptr %res) {
371; SDAG-LABEL: uaddoinci16:
372; SDAG:       ## %bb.0:
373; SDAG-NEXT:    incw %di
374; SDAG-NEXT:    sete %al
375; SDAG-NEXT:    movw %di, (%rsi)
376; SDAG-NEXT:    retq
377;
378; FAST-LABEL: uaddoinci16:
379; FAST:       ## %bb.0:
380; FAST-NEXT:    addw $1, %di
381; FAST-NEXT:    setb %al
382; FAST-NEXT:    movw %di, (%rsi)
383; FAST-NEXT:    andb $1, %al
384; FAST-NEXT:    retq
385  %t = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %v1, i16 1)
386  %val = extractvalue {i16, i1} %t, 0
387  %obit = extractvalue {i16, i1} %t, 1
388  store i16 %val, ptr %res
389  ret i1 %obit
390}
391
392define zeroext i1 @uaddoinci32(i32 %v1, ptr %res) {
393; SDAG-LABEL: uaddoinci32:
394; SDAG:       ## %bb.0:
395; SDAG-NEXT:    incl %edi
396; SDAG-NEXT:    sete %al
397; SDAG-NEXT:    movl %edi, (%rsi)
398; SDAG-NEXT:    retq
399;
400; FAST-LABEL: uaddoinci32:
401; FAST:       ## %bb.0:
402; FAST-NEXT:    addl $1, %edi
403; FAST-NEXT:    setb %al
404; FAST-NEXT:    movl %edi, (%rsi)
405; FAST-NEXT:    andb $1, %al
406; FAST-NEXT:    retq
407  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 1)
408  %val = extractvalue {i32, i1} %t, 0
409  %obit = extractvalue {i32, i1} %t, 1
410  store i32 %val, ptr %res
411  ret i1 %obit
412}
413
414define zeroext i1 @uaddoinci64(i64 %v1, ptr %res) {
415; SDAG-LABEL: uaddoinci64:
416; SDAG:       ## %bb.0:
417; SDAG-NEXT:    incq %rdi
418; SDAG-NEXT:    sete %al
419; SDAG-NEXT:    movq %rdi, (%rsi)
420; SDAG-NEXT:    retq
421;
422; FAST-LABEL: uaddoinci64:
423; FAST:       ## %bb.0:
424; FAST-NEXT:    addq $1, %rdi
425; FAST-NEXT:    setb %al
426; FAST-NEXT:    movq %rdi, (%rsi)
427; FAST-NEXT:    andb $1, %al
428; FAST-NEXT:    retq
429  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 1)
430  %val = extractvalue {i64, i1} %t, 0
431  %obit = extractvalue {i64, i1} %t, 1
432  store i64 %val, ptr %res
433  ret i1 %obit
434}
435
436; SSUBO
437define zeroext i1 @ssuboi32(i32 %v1, i32 %v2, ptr %res) {
438; SDAG-LABEL: ssuboi32:
439; SDAG:       ## %bb.0:
440; SDAG-NEXT:    subl %esi, %edi
441; SDAG-NEXT:    seto %al
442; SDAG-NEXT:    movl %edi, (%rdx)
443; SDAG-NEXT:    retq
444;
445; FAST-LABEL: ssuboi32:
446; FAST:       ## %bb.0:
447; FAST-NEXT:    subl %esi, %edi
448; FAST-NEXT:    seto %al
449; FAST-NEXT:    movl %edi, (%rdx)
450; FAST-NEXT:    andb $1, %al
451; FAST-NEXT:    retq
452  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
453  %val = extractvalue {i32, i1} %t, 0
454  %obit = extractvalue {i32, i1} %t, 1
455  store i32 %val, ptr %res
456  ret i1 %obit
457}
458
459define zeroext i1 @ssuboi64(i64 %v1, i64 %v2, ptr %res) {
460; SDAG-LABEL: ssuboi64:
461; SDAG:       ## %bb.0:
462; SDAG-NEXT:    subq %rsi, %rdi
463; SDAG-NEXT:    seto %al
464; SDAG-NEXT:    movq %rdi, (%rdx)
465; SDAG-NEXT:    retq
466;
467; FAST-LABEL: ssuboi64:
468; FAST:       ## %bb.0:
469; FAST-NEXT:    subq %rsi, %rdi
470; FAST-NEXT:    seto %al
471; FAST-NEXT:    movq %rdi, (%rdx)
472; FAST-NEXT:    andb $1, %al
473; FAST-NEXT:    retq
474  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
475  %val = extractvalue {i64, i1} %t, 0
476  %obit = extractvalue {i64, i1} %t, 1
477  store i64 %val, ptr %res
478  ret i1 %obit
479}
480
481; USUBO
482define zeroext i1 @usuboi32(i32 %v1, i32 %v2, ptr %res) {
483; SDAG-LABEL: usuboi32:
484; SDAG:       ## %bb.0:
485; SDAG-NEXT:    subl %esi, %edi
486; SDAG-NEXT:    setb %al
487; SDAG-NEXT:    movl %edi, (%rdx)
488; SDAG-NEXT:    retq
489;
490; FAST-LABEL: usuboi32:
491; FAST:       ## %bb.0:
492; FAST-NEXT:    subl %esi, %edi
493; FAST-NEXT:    setb %al
494; FAST-NEXT:    movl %edi, (%rdx)
495; FAST-NEXT:    andb $1, %al
496; FAST-NEXT:    retq
497  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
498  %val = extractvalue {i32, i1} %t, 0
499  %obit = extractvalue {i32, i1} %t, 1
500  store i32 %val, ptr %res
501  ret i1 %obit
502}
503
504define zeroext i1 @usuboi64(i64 %v1, i64 %v2, ptr %res) {
505; SDAG-LABEL: usuboi64:
506; SDAG:       ## %bb.0:
507; SDAG-NEXT:    subq %rsi, %rdi
508; SDAG-NEXT:    setb %al
509; SDAG-NEXT:    movq %rdi, (%rdx)
510; SDAG-NEXT:    retq
511;
512; FAST-LABEL: usuboi64:
513; FAST:       ## %bb.0:
514; FAST-NEXT:    subq %rsi, %rdi
515; FAST-NEXT:    setb %al
516; FAST-NEXT:    movq %rdi, (%rdx)
517; FAST-NEXT:    andb $1, %al
518; FAST-NEXT:    retq
519  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
520  %val = extractvalue {i64, i1} %t, 0
521  %obit = extractvalue {i64, i1} %t, 1
522  store i64 %val, ptr %res
523  ret i1 %obit
524}
525
526;
527; Check the use of the overflow bit in combination with a select instruction.
528;
529define i32 @saddoselecti32(i32 %v1, i32 %v2) {
530; CHECK-LABEL: saddoselecti32:
531; CHECK:       ## %bb.0:
532; CHECK-NEXT:    movl %esi, %eax
533; CHECK-NEXT:    movl %edi, %ecx
534; CHECK-NEXT:    addl %esi, %ecx
535; CHECK-NEXT:    cmovol %edi, %eax
536; CHECK-NEXT:    retq
537  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
538  %obit = extractvalue {i32, i1} %t, 1
539  %ret = select i1 %obit, i32 %v1, i32 %v2
540  ret i32 %ret
541}
542
543define i64 @saddoselecti64(i64 %v1, i64 %v2) {
544; CHECK-LABEL: saddoselecti64:
545; CHECK:       ## %bb.0:
546; CHECK-NEXT:    movq %rsi, %rax
547; CHECK-NEXT:    movq %rdi, %rcx
548; CHECK-NEXT:    addq %rsi, %rcx
549; CHECK-NEXT:    cmovoq %rdi, %rax
550; CHECK-NEXT:    retq
551  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
552  %obit = extractvalue {i64, i1} %t, 1
553  %ret = select i1 %obit, i64 %v1, i64 %v2
554  ret i64 %ret
555}
556
557define i32 @uaddoselecti32(i32 %v1, i32 %v2) {
558; CHECK-LABEL: uaddoselecti32:
559; CHECK:       ## %bb.0:
560; CHECK-NEXT:    movl %esi, %eax
561; CHECK-NEXT:    movl %edi, %ecx
562; CHECK-NEXT:    addl %esi, %ecx
563; CHECK-NEXT:    cmovbl %edi, %eax
564; CHECK-NEXT:    retq
565  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
566  %obit = extractvalue {i32, i1} %t, 1
567  %ret = select i1 %obit, i32 %v1, i32 %v2
568  ret i32 %ret
569}
570
571define i64 @uaddoselecti64(i64 %v1, i64 %v2) {
572; CHECK-LABEL: uaddoselecti64:
573; CHECK:       ## %bb.0:
574; CHECK-NEXT:    movq %rsi, %rax
575; CHECK-NEXT:    movq %rdi, %rcx
576; CHECK-NEXT:    addq %rsi, %rcx
577; CHECK-NEXT:    cmovbq %rdi, %rax
578; CHECK-NEXT:    retq
579  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
580  %obit = extractvalue {i64, i1} %t, 1
581  %ret = select i1 %obit, i64 %v1, i64 %v2
582  ret i64 %ret
583}
584
585define i32 @ssuboselecti32(i32 %v1, i32 %v2) {
586; CHECK-LABEL: ssuboselecti32:
587; CHECK:       ## %bb.0:
588; CHECK-NEXT:    movl %esi, %eax
589; CHECK-NEXT:    cmpl %esi, %edi
590; CHECK-NEXT:    cmovol %edi, %eax
591; CHECK-NEXT:    retq
592  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
593  %obit = extractvalue {i32, i1} %t, 1
594  %ret = select i1 %obit, i32 %v1, i32 %v2
595  ret i32 %ret
596}
597
598define i64 @ssuboselecti64(i64 %v1, i64 %v2) {
599; CHECK-LABEL: ssuboselecti64:
600; CHECK:       ## %bb.0:
601; CHECK-NEXT:    movq %rsi, %rax
602; CHECK-NEXT:    cmpq %rsi, %rdi
603; CHECK-NEXT:    cmovoq %rdi, %rax
604; CHECK-NEXT:    retq
605  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
606  %obit = extractvalue {i64, i1} %t, 1
607  %ret = select i1 %obit, i64 %v1, i64 %v2
608  ret i64 %ret
609}
610
611define i32 @usuboselecti32(i32 %v1, i32 %v2) {
612; CHECK-LABEL: usuboselecti32:
613; CHECK:       ## %bb.0:
614; CHECK-NEXT:    movl %esi, %eax
615; CHECK-NEXT:    cmpl %esi, %edi
616; CHECK-NEXT:    cmovbl %edi, %eax
617; CHECK-NEXT:    retq
618  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
619  %obit = extractvalue {i32, i1} %t, 1
620  %ret = select i1 %obit, i32 %v1, i32 %v2
621  ret i32 %ret
622}
623
624define i64 @usuboselecti64(i64 %v1, i64 %v2) {
625; CHECK-LABEL: usuboselecti64:
626; CHECK:       ## %bb.0:
627; CHECK-NEXT:    movq %rsi, %rax
628; CHECK-NEXT:    cmpq %rsi, %rdi
629; CHECK-NEXT:    cmovbq %rdi, %rax
630; CHECK-NEXT:    retq
631  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
632  %obit = extractvalue {i64, i1} %t, 1
633  %ret = select i1 %obit, i64 %v1, i64 %v2
634  ret i64 %ret
635}
636
637;
638; Check the use of the overflow bit in combination with a branch instruction.
639;
640define zeroext i1 @saddobri32(i32 %v1, i32 %v2) {
641; SDAG-LABEL: saddobri32:
642; SDAG:       ## %bb.0:
643; SDAG-NEXT:    addl %esi, %edi
644; SDAG-NEXT:    jo LBB31_1
645; SDAG-NEXT:  ## %bb.2: ## %continue
646; SDAG-NEXT:    movb $1, %al
647; SDAG-NEXT:    retq
648; SDAG-NEXT:  LBB31_1: ## %overflow
649; SDAG-NEXT:    xorl %eax, %eax
650; SDAG-NEXT:    retq
651;
652; FAST-LABEL: saddobri32:
653; FAST:       ## %bb.0:
654; FAST-NEXT:    addl %esi, %edi
655; FAST-NEXT:    jo LBB31_1
656; FAST-NEXT:  ## %bb.2: ## %continue
657; FAST-NEXT:    movb $1, %al
658; FAST-NEXT:    andb $1, %al
659; FAST-NEXT:    retq
660; FAST-NEXT:  LBB31_1: ## %overflow
661; FAST-NEXT:    xorl %eax, %eax
662; FAST-NEXT:    andb $1, %al
663; FAST-NEXT:    ## kill: def $al killed $al killed $eax
664; FAST-NEXT:    retq
665  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
666  %val = extractvalue {i32, i1} %t, 0
667  %obit = extractvalue {i32, i1} %t, 1
668  br i1 %obit, label %overflow, label %continue, !prof !0
669
670overflow:
671  ret i1 false
672
673continue:
674  ret i1 true
675}
676
677define zeroext i1 @saddobri64(i64 %v1, i64 %v2) {
678; SDAG-LABEL: saddobri64:
679; SDAG:       ## %bb.0:
680; SDAG-NEXT:    addq %rsi, %rdi
681; SDAG-NEXT:    jo LBB32_1
682; SDAG-NEXT:  ## %bb.2: ## %continue
683; SDAG-NEXT:    movb $1, %al
684; SDAG-NEXT:    retq
685; SDAG-NEXT:  LBB32_1: ## %overflow
686; SDAG-NEXT:    xorl %eax, %eax
687; SDAG-NEXT:    retq
688;
689; FAST-LABEL: saddobri64:
690; FAST:       ## %bb.0:
691; FAST-NEXT:    addq %rsi, %rdi
692; FAST-NEXT:    jo LBB32_1
693; FAST-NEXT:  ## %bb.2: ## %continue
694; FAST-NEXT:    movb $1, %al
695; FAST-NEXT:    andb $1, %al
696; FAST-NEXT:    retq
697; FAST-NEXT:  LBB32_1: ## %overflow
698; FAST-NEXT:    xorl %eax, %eax
699; FAST-NEXT:    andb $1, %al
700; FAST-NEXT:    ## kill: def $al killed $al killed $eax
701; FAST-NEXT:    retq
702  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)
703  %val = extractvalue {i64, i1} %t, 0
704  %obit = extractvalue {i64, i1} %t, 1
705  br i1 %obit, label %overflow, label %continue, !prof !0
706
707overflow:
708  ret i1 false
709
710continue:
711  ret i1 true
712}
713
714define zeroext i1 @uaddobri32(i32 %v1, i32 %v2) {
715; SDAG-LABEL: uaddobri32:
716; SDAG:       ## %bb.0:
717; SDAG-NEXT:    addl %esi, %edi
718; SDAG-NEXT:    jb LBB33_1
719; SDAG-NEXT:  ## %bb.2: ## %continue
720; SDAG-NEXT:    movb $1, %al
721; SDAG-NEXT:    retq
722; SDAG-NEXT:  LBB33_1: ## %overflow
723; SDAG-NEXT:    xorl %eax, %eax
724; SDAG-NEXT:    retq
725;
726; FAST-LABEL: uaddobri32:
727; FAST:       ## %bb.0:
728; FAST-NEXT:    addl %esi, %edi
729; FAST-NEXT:    jb LBB33_1
730; FAST-NEXT:  ## %bb.2: ## %continue
731; FAST-NEXT:    movb $1, %al
732; FAST-NEXT:    andb $1, %al
733; FAST-NEXT:    retq
734; FAST-NEXT:  LBB33_1: ## %overflow
735; FAST-NEXT:    xorl %eax, %eax
736; FAST-NEXT:    andb $1, %al
737; FAST-NEXT:    ## kill: def $al killed $al killed $eax
738; FAST-NEXT:    retq
739  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
740  %val = extractvalue {i32, i1} %t, 0
741  %obit = extractvalue {i32, i1} %t, 1
742  br i1 %obit, label %overflow, label %continue, !prof !0
743
744overflow:
745  ret i1 false
746
747continue:
748  ret i1 true
749}
750
751define zeroext i1 @uaddobri64(i64 %v1, i64 %v2) {
752; SDAG-LABEL: uaddobri64:
753; SDAG:       ## %bb.0:
754; SDAG-NEXT:    addq %rsi, %rdi
755; SDAG-NEXT:    jb LBB34_1
756; SDAG-NEXT:  ## %bb.2: ## %continue
757; SDAG-NEXT:    movb $1, %al
758; SDAG-NEXT:    retq
759; SDAG-NEXT:  LBB34_1: ## %overflow
760; SDAG-NEXT:    xorl %eax, %eax
761; SDAG-NEXT:    retq
762;
763; FAST-LABEL: uaddobri64:
764; FAST:       ## %bb.0:
765; FAST-NEXT:    addq %rsi, %rdi
766; FAST-NEXT:    jb LBB34_1
767; FAST-NEXT:  ## %bb.2: ## %continue
768; FAST-NEXT:    movb $1, %al
769; FAST-NEXT:    andb $1, %al
770; FAST-NEXT:    retq
771; FAST-NEXT:  LBB34_1: ## %overflow
772; FAST-NEXT:    xorl %eax, %eax
773; FAST-NEXT:    andb $1, %al
774; FAST-NEXT:    ## kill: def $al killed $al killed $eax
775; FAST-NEXT:    retq
776  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)
777  %val = extractvalue {i64, i1} %t, 0
778  %obit = extractvalue {i64, i1} %t, 1
779  br i1 %obit, label %overflow, label %continue, !prof !0
780
781overflow:
782  ret i1 false
783
784continue:
785  ret i1 true
786}
787
788define zeroext i1 @ssubobri32(i32 %v1, i32 %v2) {
789; SDAG-LABEL: ssubobri32:
790; SDAG:       ## %bb.0:
791; SDAG-NEXT:    cmpl %esi, %edi
792; SDAG-NEXT:    jo LBB35_1
793; SDAG-NEXT:  ## %bb.2: ## %continue
794; SDAG-NEXT:    movb $1, %al
795; SDAG-NEXT:    retq
796; SDAG-NEXT:  LBB35_1: ## %overflow
797; SDAG-NEXT:    xorl %eax, %eax
798; SDAG-NEXT:    retq
799;
800; FAST-LABEL: ssubobri32:
801; FAST:       ## %bb.0:
802; FAST-NEXT:    cmpl %esi, %edi
803; FAST-NEXT:    jo LBB35_1
804; FAST-NEXT:  ## %bb.2: ## %continue
805; FAST-NEXT:    movb $1, %al
806; FAST-NEXT:    andb $1, %al
807; FAST-NEXT:    retq
808; FAST-NEXT:  LBB35_1: ## %overflow
809; FAST-NEXT:    xorl %eax, %eax
810; FAST-NEXT:    andb $1, %al
811; FAST-NEXT:    ## kill: def $al killed $al killed $eax
812; FAST-NEXT:    retq
813  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
814  %val = extractvalue {i32, i1} %t, 0
815  %obit = extractvalue {i32, i1} %t, 1
816  br i1 %obit, label %overflow, label %continue, !prof !0
817
818overflow:
819  ret i1 false
820
821continue:
822  ret i1 true
823}
824
825define zeroext i1 @ssubobri64(i64 %v1, i64 %v2) {
826; SDAG-LABEL: ssubobri64:
827; SDAG:       ## %bb.0:
828; SDAG-NEXT:    cmpq %rsi, %rdi
829; SDAG-NEXT:    jo LBB36_1
830; SDAG-NEXT:  ## %bb.2: ## %continue
831; SDAG-NEXT:    movb $1, %al
832; SDAG-NEXT:    retq
833; SDAG-NEXT:  LBB36_1: ## %overflow
834; SDAG-NEXT:    xorl %eax, %eax
835; SDAG-NEXT:    retq
836;
837; FAST-LABEL: ssubobri64:
838; FAST:       ## %bb.0:
839; FAST-NEXT:    cmpq %rsi, %rdi
840; FAST-NEXT:    jo LBB36_1
841; FAST-NEXT:  ## %bb.2: ## %continue
842; FAST-NEXT:    movb $1, %al
843; FAST-NEXT:    andb $1, %al
844; FAST-NEXT:    retq
845; FAST-NEXT:  LBB36_1: ## %overflow
846; FAST-NEXT:    xorl %eax, %eax
847; FAST-NEXT:    andb $1, %al
848; FAST-NEXT:    ## kill: def $al killed $al killed $eax
849; FAST-NEXT:    retq
850  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)
851  %val = extractvalue {i64, i1} %t, 0
852  %obit = extractvalue {i64, i1} %t, 1
853  br i1 %obit, label %overflow, label %continue, !prof !0
854
855overflow:
856  ret i1 false
857
858continue:
859  ret i1 true
860}
861
862define zeroext i1 @usubobri32(i32 %v1, i32 %v2) {
863; SDAG-LABEL: usubobri32:
864; SDAG:       ## %bb.0:
865; SDAG-NEXT:    cmpl %esi, %edi
866; SDAG-NEXT:    jb LBB37_1
867; SDAG-NEXT:  ## %bb.2: ## %continue
868; SDAG-NEXT:    movb $1, %al
869; SDAG-NEXT:    retq
870; SDAG-NEXT:  LBB37_1: ## %overflow
871; SDAG-NEXT:    xorl %eax, %eax
872; SDAG-NEXT:    retq
873;
874; FAST-LABEL: usubobri32:
875; FAST:       ## %bb.0:
876; FAST-NEXT:    cmpl %esi, %edi
877; FAST-NEXT:    jb LBB37_1
878; FAST-NEXT:  ## %bb.2: ## %continue
879; FAST-NEXT:    movb $1, %al
880; FAST-NEXT:    andb $1, %al
881; FAST-NEXT:    retq
882; FAST-NEXT:  LBB37_1: ## %overflow
883; FAST-NEXT:    xorl %eax, %eax
884; FAST-NEXT:    andb $1, %al
885; FAST-NEXT:    ## kill: def $al killed $al killed $eax
886; FAST-NEXT:    retq
887  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
888  %val = extractvalue {i32, i1} %t, 0
889  %obit = extractvalue {i32, i1} %t, 1
890  br i1 %obit, label %overflow, label %continue, !prof !0
891
892overflow:
893  ret i1 false
894
895continue:
896  ret i1 true
897}
898
899define zeroext i1 @usubobri64(i64 %v1, i64 %v2) {
900; SDAG-LABEL: usubobri64:
901; SDAG:       ## %bb.0:
902; SDAG-NEXT:    cmpq %rsi, %rdi
903; SDAG-NEXT:    jb LBB38_1
904; SDAG-NEXT:  ## %bb.2: ## %continue
905; SDAG-NEXT:    movb $1, %al
906; SDAG-NEXT:    retq
907; SDAG-NEXT:  LBB38_1: ## %overflow
908; SDAG-NEXT:    xorl %eax, %eax
909; SDAG-NEXT:    retq
910;
911; FAST-LABEL: usubobri64:
912; FAST:       ## %bb.0:
913; FAST-NEXT:    cmpq %rsi, %rdi
914; FAST-NEXT:    jb LBB38_1
915; FAST-NEXT:  ## %bb.2: ## %continue
916; FAST-NEXT:    movb $1, %al
917; FAST-NEXT:    andb $1, %al
918; FAST-NEXT:    retq
919; FAST-NEXT:  LBB38_1: ## %overflow
920; FAST-NEXT:    xorl %eax, %eax
921; FAST-NEXT:    andb $1, %al
922; FAST-NEXT:    ## kill: def $al killed $al killed $eax
923; FAST-NEXT:    retq
924  %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)
925  %val = extractvalue {i64, i1} %t, 0
926  %obit = extractvalue {i64, i1} %t, 1
927  br i1 %obit, label %overflow, label %continue, !prof !0
928
929overflow:
930  ret i1 false
931
932continue:
933  ret i1 true
934}
935
936define {i64, i1} @saddoovf(i64 %a, i64 %b) {
937; CHECK-LABEL: saddoovf:
938; CHECK:       ## %bb.0:
939; CHECK-NEXT:    sarq $17, %rdi
940; CHECK-NEXT:    shrq $31, %rsi
941; CHECK-NEXT:    leaq (%rsi,%rdi), %rax
942; CHECK-NEXT:    xorl %edx, %edx
943; CHECK-NEXT:    retq
944  %1 = ashr i64 %a, 17
945  %2 = lshr i64 %b, 31
946  %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %1, i64 %2)
947  ret {i64, i1} %t
948}
949
950define {i64, i1} @ssuboovf(i64 %a, i64 %b) {
951; CHECK-LABEL: ssuboovf:
952; CHECK:       ## %bb.0:
953; CHECK-NEXT:    movzwl %di, %eax
954; CHECK-NEXT:    shrq $22, %rsi
955; CHECK-NEXT:    subq %rsi, %rax
956; CHECK-NEXT:    xorl %edx, %edx
957; CHECK-NEXT:    retq
958  %1 = and i64 %a, 65535
959  %2 = lshr i64 %b, 22
960  %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %1, i64 %2)
961  ret {i64, i1} %t
962}
963
964define {i64, i1} @uaddoovf(i64 %a, i64 %b) {
965; CHECK-LABEL: uaddoovf:
966; CHECK:       ## %bb.0:
967; CHECK-NEXT:    movzbl %dil, %ecx
968; CHECK-NEXT:    movzbl %sil, %eax
969; CHECK-NEXT:    addq %rcx, %rax
970; CHECK-NEXT:    xorl %edx, %edx
971; CHECK-NEXT:    retq
972  %1 = and i64 %a, 255
973  %2 = and i64 %b, 255
974  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %1, i64 %2)
975  ret {i64, i1} %t
976}
977
978define {i64, i1} @usuboovf(i64 %a, i64 %b) {
979; CHECK-LABEL: usuboovf:
980; CHECK:       ## %bb.0:
981; CHECK-NEXT:    movq %rsi, %rax
982; CHECK-NEXT:    notq %rax
983; CHECK-NEXT:    xorl %edx, %edx
984; CHECK-NEXT:    retq
985  %t0 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 %a)
986  %v0 = extractvalue {i64, i1} %t0, 0
987  %o0 = extractvalue {i64, i1} %t0, 1
988  %t1 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 -1, i64 %b)
989  %v1 = extractvalue {i64, i1} %t1, 0
990  %o1 = extractvalue {i64, i1} %t1, 1
991  %oo = or i1 %o0, %o1
992  %t2 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v0)
993  %v2 = extractvalue {i64, i1} %t2, 0
994  %o2 = extractvalue {i64, i1} %t2, 1
995  %ooo = or i1 %oo, %o2
996  %t = insertvalue {i64, i1} %t2, i1 %ooo, 1
997  ret {i64, i1} %t
998}
999
1000; Make sure we select an INC for both the data use and the flag use.
1001define i32 @incovfselectstore(i32 %v1, i32 %v2, ptr %x) {
1002; CHECK-LABEL: incovfselectstore:
1003; CHECK:       ## %bb.0:
1004; CHECK-NEXT:    movl %esi, %eax
1005; CHECK-NEXT:    movl %edi, %ecx
1006; CHECK-NEXT:    incl %ecx
1007; CHECK-NEXT:    cmovol %edi, %eax
1008; CHECK-NEXT:    movl %ecx, (%rdx)
1009; CHECK-NEXT:    retq
1010  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1)
1011  %obit = extractvalue {i32, i1} %t, 1
1012  %ret = select i1 %obit, i32 %v1, i32 %v2
1013  %val = extractvalue {i32, i1} %t, 0
1014  store i32 %val, ptr %x
1015  ret i32 %ret
1016}
1017
1018; Make sure we select a DEC for both the data use and the flag use.
1019define i32 @decovfselectstore(i32 %v1, i32 %v2, ptr %x) {
1020; GENERIC-LABEL: decovfselectstore:
1021; GENERIC:       ## %bb.0:
1022; GENERIC-NEXT:    movl %esi, %eax
1023; GENERIC-NEXT:    movl %edi, %ecx
1024; GENERIC-NEXT:    decl %ecx
1025; GENERIC-NEXT:    cmovol %edi, %eax
1026; GENERIC-NEXT:    movl %ecx, (%rdx)
1027; GENERIC-NEXT:    retq
1028;
1029; FAST-LABEL: decovfselectstore:
1030; FAST:       ## %bb.0:
1031; FAST-NEXT:    movl %esi, %eax
1032; FAST-NEXT:    movl %edi, %ecx
1033; FAST-NEXT:    decl %ecx
1034; FAST-NEXT:    cmovol %edi, %eax
1035; FAST-NEXT:    movl %ecx, (%rdx)
1036; FAST-NEXT:    retq
1037;
1038; KNL-LABEL: decovfselectstore:
1039; KNL:       ## %bb.0:
1040; KNL-NEXT:    movl %esi, %eax
1041; KNL-NEXT:    movl %edi, %ecx
1042; KNL-NEXT:    addl $-1, %ecx
1043; KNL-NEXT:    cmovol %edi, %eax
1044; KNL-NEXT:    movl %ecx, (%rdx)
1045; KNL-NEXT:    retq
1046  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 1)
1047  %obit = extractvalue {i32, i1} %t, 1
1048  %ret = select i1 %obit, i32 %v1, i32 %v2
1049  %val = extractvalue {i32, i1} %t, 0
1050  store i32 %val, ptr %x
1051  ret i32 %ret
1052}
1053
1054declare {i8,  i1} @llvm.sadd.with.overflow.i8 (i8,  i8 ) nounwind readnone
1055declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
1056declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
1057declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
1058declare {i8,  i1} @llvm.uadd.with.overflow.i8 (i8,  i8 ) nounwind readnone
1059declare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone
1060declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
1061declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
1062declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
1063declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
1064declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
1065declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone
1066
1067!0 = !{!"branch_weights", i32 0, i32 2147483647}
1068