xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/usub-with-overflow.ll (revision 98e016d99732dc8fef8cfd61d6ce1edd042309a1)
1aac6629fSZain Jaffal; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2aac6629fSZain Jaffal; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3aac6629fSZain Jaffal
4aac6629fSZain Jaffaldeclare { i8, i1 } @llvm.usub.with.overflow.i8(i8, i8)
5aac6629fSZain Jaffal
6aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_cmp_condition(i8 %a, i8 %b) {
7aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_cmp_condition(
8aac6629fSZain Jaffal; CHECK-NEXT:  entry:
9aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[A:%.*]]
10aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[C_1]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]
11aac6629fSZain Jaffal; CHECK:       math:
12aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
13aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
14aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
15aac6629fSZain Jaffal; CHECK:       exit.ok:
16aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
17aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
18aac6629fSZain Jaffal; CHECK:       exit.fail:
19aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
20aac6629fSZain Jaffal;
21aac6629fSZain Jaffalentry:
22aac6629fSZain Jaffal  %c.1 = icmp uge i8 %b, %a
23aac6629fSZain Jaffal  br i1 %c.1, label %math, label %exit.fail
24aac6629fSZain Jaffal
25aac6629fSZain Jaffalmath:
26aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
27aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
28aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
29aac6629fSZain Jaffal
30aac6629fSZain Jaffalexit.ok:
31aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
32aac6629fSZain Jaffal  ret i8 %res
33aac6629fSZain Jaffal
34aac6629fSZain Jaffalexit.fail:
35aac6629fSZain Jaffal  ret i8 0
36aac6629fSZain Jaffal}
37aac6629fSZain Jaffal
38aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_cmp_condition2(i8 %a, i8 %b) {
39aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_cmp_condition2(
40aac6629fSZain Jaffal; CHECK-NEXT:  entry:
41aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]]
42aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]
43aac6629fSZain Jaffal; CHECK:       math:
44aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
45aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
46aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
47aac6629fSZain Jaffal; CHECK:       exit.ok:
48aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
49aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
50aac6629fSZain Jaffal; CHECK:       exit.fail:
51aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
52aac6629fSZain Jaffal;
53aac6629fSZain Jaffalentry:
54aac6629fSZain Jaffal  %c.1 = icmp ule i8 %b, %a
55aac6629fSZain Jaffal  br i1 %c.1, label %exit.fail, label %math
56aac6629fSZain Jaffal
57aac6629fSZain Jaffalmath:
58aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
59aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
60aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
61aac6629fSZain Jaffal
62aac6629fSZain Jaffalexit.ok:
63aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
64aac6629fSZain Jaffal  ret i8 %res
65aac6629fSZain Jaffal
66aac6629fSZain Jaffalexit.fail:
67aac6629fSZain Jaffal  ret i8 0
68aac6629fSZain Jaffal}
69aac6629fSZain Jaffal
70aac6629fSZain Jaffaldeclare void @use_res({ i8, i1 })
71aac6629fSZain Jaffal
72aac6629fSZain Jaffaldefine i8 @sub_no_overflow_due_to_cmp_condition_result_used(i8 %a, i8 %b) {
73aac6629fSZain Jaffal; CHECK-LABEL: @sub_no_overflow_due_to_cmp_condition_result_used(
74aac6629fSZain Jaffal; CHECK-NEXT:  entry:
75aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]]
76aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]
77aac6629fSZain Jaffal; CHECK:       math:
78aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
79aac6629fSZain Jaffal; CHECK-NEXT:    call void @use_res({ i8, i1 } [[OP]])
80aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
81aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
82aac6629fSZain Jaffal; CHECK:       exit.ok:
83aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
84aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
85aac6629fSZain Jaffal; CHECK:       exit.fail:
86aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
87aac6629fSZain Jaffal;
88aac6629fSZain Jaffalentry:
89aac6629fSZain Jaffal  %c.1 = icmp ule i8 %b, %a
90aac6629fSZain Jaffal  br i1 %c.1, label %exit.fail, label %math
91aac6629fSZain Jaffal
92aac6629fSZain Jaffalmath:
93aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
94aac6629fSZain Jaffal  call void @use_res({ i8, i1 } %op)
95aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
96aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
97aac6629fSZain Jaffal
98aac6629fSZain Jaffalexit.ok:
99aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
100aac6629fSZain Jaffal  ret i8 %res
101aac6629fSZain Jaffal
102aac6629fSZain Jaffalexit.fail:
103aac6629fSZain Jaffal  ret i8 0
104aac6629fSZain Jaffal}
105aac6629fSZain Jaffal
106aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_or_conds(i8 %a, i8 %b) {
107aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_or_conds(
108aac6629fSZain Jaffal; CHECK-NEXT:  entry:
109aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]]
110aac6629fSZain Jaffal; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[A]], 0
111aac6629fSZain Jaffal; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_2]], [[C_1]]
112aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[OR]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]
113aac6629fSZain Jaffal; CHECK:       math:
114aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
115aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
116aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
117aac6629fSZain Jaffal; CHECK:       exit.ok:
118aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
119aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
120aac6629fSZain Jaffal; CHECK:       exit.fail:
121aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
122aac6629fSZain Jaffal;
123aac6629fSZain Jaffalentry:
124aac6629fSZain Jaffal  %c.1 = icmp ule i8 %b, %a
125aac6629fSZain Jaffal  %c.2 = icmp ule i8 %a, 0
126aac6629fSZain Jaffal  %or = or i1 %c.2, %c.1
127aac6629fSZain Jaffal  br i1 %or, label %exit.fail, label %math
128aac6629fSZain Jaffal
129aac6629fSZain Jaffalmath:
130aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
131aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
132aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
133aac6629fSZain Jaffal
134aac6629fSZain Jaffalexit.ok:
135aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
136aac6629fSZain Jaffal  ret i8 %res
137aac6629fSZain Jaffal
138aac6629fSZain Jaffalexit.fail:
139aac6629fSZain Jaffal  ret i8 0
140aac6629fSZain Jaffal}
141aac6629fSZain Jaffal
142aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_or_conds_sub_result_not_used(i8 %a, i8 %b) {
143aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_or_conds_sub_result_not_used(
144aac6629fSZain Jaffal; CHECK-NEXT:  entry:
145aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]]
146aac6629fSZain Jaffal; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[A]], 0
147aac6629fSZain Jaffal; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_2]], [[C_1]]
148aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[OR]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]
149aac6629fSZain Jaffal; CHECK:       math:
150aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
151aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
152aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
153aac6629fSZain Jaffal; CHECK:       exit.ok:
154aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 20
155aac6629fSZain Jaffal; CHECK:       exit.fail:
156aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
157aac6629fSZain Jaffal;
158aac6629fSZain Jaffalentry:
159aac6629fSZain Jaffal  %c.1 = icmp ule i8 %b, %a
160aac6629fSZain Jaffal  %c.2 = icmp ule i8 %a, 0
161aac6629fSZain Jaffal  %or = or i1 %c.2, %c.1
162aac6629fSZain Jaffal  br i1 %or, label %exit.fail, label %math
163aac6629fSZain Jaffal
164aac6629fSZain Jaffalmath:
165aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
166aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
167aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
168aac6629fSZain Jaffal
169aac6629fSZain Jaffalexit.ok:
170aac6629fSZain Jaffal  ret i8 20
171aac6629fSZain Jaffal
172aac6629fSZain Jaffalexit.fail:
173aac6629fSZain Jaffal  ret i8 0
174aac6629fSZain Jaffal}
175aac6629fSZain Jaffal
176aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_and_conds(i8 %a, i8 %b) {
177aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_and_conds(
178aac6629fSZain Jaffal; CHECK-NEXT:  entry:
179aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[A:%.*]]
180aac6629fSZain Jaffal; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[A]], -1
181aac6629fSZain Jaffal; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], [[C_1]]
182aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[AND]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]
183aac6629fSZain Jaffal; CHECK:       math:
184aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
185aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
186aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
187aac6629fSZain Jaffal; CHECK:       exit.ok:
188aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
189aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
190aac6629fSZain Jaffal; CHECK:       exit.fail:
191aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
192aac6629fSZain Jaffal;
193aac6629fSZain Jaffalentry:
194aac6629fSZain Jaffal  %c.1 = icmp uge i8 %b, %a
195aac6629fSZain Jaffal  %c.2 = icmp uge i8 %a, -1
196aac6629fSZain Jaffal  %and = and i1 %c.2, %c.1
197aac6629fSZain Jaffal  br i1 %and, label %math, label %exit.fail
198aac6629fSZain Jaffal
199aac6629fSZain Jaffalmath:
200aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
201aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
202aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
203aac6629fSZain Jaffal
204aac6629fSZain Jaffalexit.ok:
205aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
206aac6629fSZain Jaffal  ret i8 %res
207aac6629fSZain Jaffal
208aac6629fSZain Jaffalexit.fail:
209aac6629fSZain Jaffal  ret i8 0
210aac6629fSZain Jaffal}
211aac6629fSZain Jaffal
212aac6629fSZain Jaffaldefine i8 @usub_may_overflow1(i8 %a, i8 %b) {
213aac6629fSZain Jaffal; CHECK-LABEL: @usub_may_overflow1(
214aac6629fSZain Jaffal; CHECK-NEXT:  entry:
215*98e016d9SFlorian Hahn; CHECK-NEXT:    br i1 true, label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]
216aac6629fSZain Jaffal; CHECK:       math:
217*98e016d9SFlorian Hahn; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B:%.*]], i8 [[A:%.*]])
218aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
219aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
220aac6629fSZain Jaffal; CHECK:       exit.ok:
221aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
222aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
223aac6629fSZain Jaffal; CHECK:       exit.fail:
224aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
225aac6629fSZain Jaffal;
226aac6629fSZain Jaffalentry:
227aac6629fSZain Jaffal  %c.1 = icmp uge i8 %a, 0
228aac6629fSZain Jaffal  br i1 %c.1, label %math, label %exit.fail
229aac6629fSZain Jaffal
230aac6629fSZain Jaffalmath:
231aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
232aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
233aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
234aac6629fSZain Jaffal
235aac6629fSZain Jaffalexit.ok:
236aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
237aac6629fSZain Jaffal  ret i8 %res
238aac6629fSZain Jaffal
239aac6629fSZain Jaffalexit.fail:
240aac6629fSZain Jaffal  ret i8 0
241aac6629fSZain Jaffal}
242aac6629fSZain Jaffal
243aac6629fSZain Jaffal
244aac6629fSZain Jaffaldefine i8 @usub_may_overflow2(i8 %a, i8 %b) {
245aac6629fSZain Jaffal; CHECK-LABEL: @usub_may_overflow2(
246aac6629fSZain Jaffal; CHECK-NEXT:  entry:
247aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[A:%.*]]
248aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[C_1]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]
249aac6629fSZain Jaffal; CHECK:       math:
250aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
251aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
252aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
253aac6629fSZain Jaffal; CHECK:       exit.ok:
254aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
255aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
256aac6629fSZain Jaffal; CHECK:       exit.fail:
257aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
258aac6629fSZain Jaffal;
259aac6629fSZain Jaffalentry:
260aac6629fSZain Jaffal  %c.1 = icmp sge i8 %b, %a
261aac6629fSZain Jaffal  br i1 %c.1, label %math, label %exit.fail
262aac6629fSZain Jaffal
263aac6629fSZain Jaffalmath:
264aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
265aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
266aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
267aac6629fSZain Jaffal
268aac6629fSZain Jaffalexit.ok:
269aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
270aac6629fSZain Jaffal  ret i8 %res
271aac6629fSZain Jaffal
272aac6629fSZain Jaffalexit.fail:
273aac6629fSZain Jaffal  ret i8 0
274aac6629fSZain Jaffal}
275aac6629fSZain Jaffal
276aac6629fSZain Jaffaldefine i8 @usub_may_overflow3(i8 %a, i8 %b) {
277aac6629fSZain Jaffal; CHECK-LABEL: @usub_may_overflow3(
278aac6629fSZain Jaffal; CHECK-NEXT:  entry:
279aac6629fSZain Jaffal; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i8 [[B:%.*]], [[A:%.*]]
280aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]
281aac6629fSZain Jaffal; CHECK:       math:
282aac6629fSZain Jaffal; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]])
283aac6629fSZain Jaffal; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1
284aac6629fSZain Jaffal; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]
285aac6629fSZain Jaffal; CHECK:       exit.ok:
286aac6629fSZain Jaffal; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0
287aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 [[RES]]
288aac6629fSZain Jaffal; CHECK:       exit.fail:
289aac6629fSZain Jaffal; CHECK-NEXT:    ret i8 0
290aac6629fSZain Jaffal;
291aac6629fSZain Jaffalentry:
292aac6629fSZain Jaffal  %c.1 = icmp slt i8 %b, %a
293aac6629fSZain Jaffal  br i1 %c.1, label %exit.fail, label %math
294aac6629fSZain Jaffalmath:
295aac6629fSZain Jaffal  %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a)
296aac6629fSZain Jaffal  %status = extractvalue { i8, i1 } %op, 1
297aac6629fSZain Jaffal  br i1 %status, label %exit.fail, label %exit.ok
298aac6629fSZain Jaffal
299aac6629fSZain Jaffalexit.ok:
300aac6629fSZain Jaffal  %res = extractvalue { i8, i1 } %op, 0
301aac6629fSZain Jaffal  ret i8 %res
302aac6629fSZain Jaffal
303aac6629fSZain Jaffalexit.fail:
304aac6629fSZain Jaffal  ret i8 0
305aac6629fSZain Jaffal}
306aac6629fSZain Jaffal
307