xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/minmax.ll (revision 87b1e735b28f81d9012fd302cd07385db50a274f)
1de0d27c1SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2de0d27c1SYingwei Zheng; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3de0d27c1SYingwei Zheng
4de0d27c1SYingwei Zheng; Test from PR63896
5de0d27c1SYingwei Zhengdefine i1 @umax_ugt(i32 %x, i32 %y) {
6de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_ugt
7de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
8de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1)
9de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[Y]], [[MAX]]
10de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
11de0d27c1SYingwei Zheng; CHECK:       if:
1292a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 true, true
13de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
14de0d27c1SYingwei Zheng; CHECK:       end:
15de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
16de0d27c1SYingwei Zheng;
17de0d27c1SYingwei Zheng  %max = call i32 @llvm.umax.i32(i32 %x, i32 1)
18de0d27c1SYingwei Zheng  %cmp = icmp ugt i32 %y, %max
19de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
20de0d27c1SYingwei Zheng
21de0d27c1SYingwei Zhengif:
22de0d27c1SYingwei Zheng  %cmp2 = icmp ugt i32 %y, %x
23de0d27c1SYingwei Zheng  %cmp3 = icmp uge i32 %y, %x
24de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
25de0d27c1SYingwei Zheng  ret i1 %ret
26de0d27c1SYingwei Zheng
27de0d27c1SYingwei Zhengend:
28de0d27c1SYingwei Zheng  ret i1 false
29de0d27c1SYingwei Zheng}
30de0d27c1SYingwei Zheng
31de0d27c1SYingwei Zhengdefine i1 @umax_uge(i32 %x, i32 %y) {
32de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_uge
33de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
34de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1)
35de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i32 [[Y]], [[MAX]]
36de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
37de0d27c1SYingwei Zheng; CHECK:       if:
38de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[Y]], [[X]]
3992a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[CMP2]], true
40de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
41de0d27c1SYingwei Zheng; CHECK:       end:
42de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
43de0d27c1SYingwei Zheng;
44de0d27c1SYingwei Zheng  %max = call i32 @llvm.umax.i32(i32 %x, i32 1)
45de0d27c1SYingwei Zheng  %cmp = icmp uge i32 %y, %max
46de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
47de0d27c1SYingwei Zheng
48de0d27c1SYingwei Zhengif:
49de0d27c1SYingwei Zheng  %cmp2 = icmp ugt i32 %y, %x
50de0d27c1SYingwei Zheng  %cmp3 = icmp uge i32 %y, %x
51de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
52de0d27c1SYingwei Zheng  ret i1 %ret
53de0d27c1SYingwei Zheng
54de0d27c1SYingwei Zhengend:
55de0d27c1SYingwei Zheng  ret i1 false
56de0d27c1SYingwei Zheng}
57de0d27c1SYingwei Zheng
58de0d27c1SYingwei Zhengdefine i1 @umin_ult(i32 %x, i32 %y) {
59de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umin_ult
60de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
61de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[X]], i32 1)
62de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[Y]], [[MIN]]
63de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
64de0d27c1SYingwei Zheng; CHECK:       if:
6592a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 true, true
66de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
67de0d27c1SYingwei Zheng; CHECK:       end:
68de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
69de0d27c1SYingwei Zheng;
70de0d27c1SYingwei Zheng  %min = call i32 @llvm.umin.i32(i32 %x, i32 1)
71de0d27c1SYingwei Zheng  %cmp = icmp ult i32 %y, %min
72de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
73de0d27c1SYingwei Zheng
74de0d27c1SYingwei Zhengif:
75de0d27c1SYingwei Zheng  %cmp2 = icmp ult i32 %y, %x
76de0d27c1SYingwei Zheng  %cmp3 = icmp ule i32 %y, %x
77de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
78de0d27c1SYingwei Zheng  ret i1 %ret
79de0d27c1SYingwei Zheng
80de0d27c1SYingwei Zhengend:
81de0d27c1SYingwei Zheng  ret i1 false
82de0d27c1SYingwei Zheng}
83de0d27c1SYingwei Zheng
84de0d27c1SYingwei Zhengdefine i1 @umin_ule(i32 %x, i32 %y) {
85de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umin_ule
86de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
87de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[X]], i32 1)
88de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ule i32 [[Y]], [[MIN]]
89de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
90de0d27c1SYingwei Zheng; CHECK:       if:
91de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[Y]], [[X]]
9292a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[CMP2]], true
93de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
94de0d27c1SYingwei Zheng; CHECK:       end:
95de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
96de0d27c1SYingwei Zheng;
97de0d27c1SYingwei Zheng  %min = call i32 @llvm.umin.i32(i32 %x, i32 1)
98de0d27c1SYingwei Zheng  %cmp = icmp ule i32 %y, %min
99de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
100de0d27c1SYingwei Zheng
101de0d27c1SYingwei Zhengif:
102de0d27c1SYingwei Zheng  %cmp2 = icmp ult i32 %y, %x
103de0d27c1SYingwei Zheng  %cmp3 = icmp ule i32 %y, %x
104de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
105de0d27c1SYingwei Zheng  ret i1 %ret
106de0d27c1SYingwei Zheng
107de0d27c1SYingwei Zhengend:
108de0d27c1SYingwei Zheng  ret i1 false
109de0d27c1SYingwei Zheng}
110de0d27c1SYingwei Zheng
111de0d27c1SYingwei Zhengdefine i1 @smax_sgt(i32 %x, i32 %y) {
112de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smax_sgt
113de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
114de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1)
115de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[Y]], [[MAX]]
116de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
117de0d27c1SYingwei Zheng; CHECK:       if:
11892a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 true, true
119de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
120de0d27c1SYingwei Zheng; CHECK:       end:
121de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
122de0d27c1SYingwei Zheng;
123de0d27c1SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %x, i32 1)
124de0d27c1SYingwei Zheng  %cmp = icmp sgt i32 %y, %max
125de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
126de0d27c1SYingwei Zheng
127de0d27c1SYingwei Zhengif:
128de0d27c1SYingwei Zheng  %cmp2 = icmp sgt i32 %y, %x
129de0d27c1SYingwei Zheng  %cmp3 = icmp sge i32 %y, %x
130de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
131de0d27c1SYingwei Zheng  ret i1 %ret
132de0d27c1SYingwei Zheng
133de0d27c1SYingwei Zhengend:
134de0d27c1SYingwei Zheng  ret i1 false
135de0d27c1SYingwei Zheng}
136de0d27c1SYingwei Zheng
137de0d27c1SYingwei Zhengdefine i1 @smax_sge(i32 %x, i32 %y) {
138de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smax_sge
139de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
140de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1)
141de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[Y]], [[MAX]]
142de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
143de0d27c1SYingwei Zheng; CHECK:       if:
144de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[Y]], [[X]]
14592a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[CMP2]], true
146de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
147de0d27c1SYingwei Zheng; CHECK:       end:
148de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
149de0d27c1SYingwei Zheng;
150de0d27c1SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %x, i32 1)
151de0d27c1SYingwei Zheng  %cmp = icmp sge i32 %y, %max
152de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
153de0d27c1SYingwei Zheng
154de0d27c1SYingwei Zhengif:
155de0d27c1SYingwei Zheng  %cmp2 = icmp sgt i32 %y, %x
156de0d27c1SYingwei Zheng  %cmp3 = icmp sge i32 %y, %x
157de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
158de0d27c1SYingwei Zheng  ret i1 %ret
159de0d27c1SYingwei Zheng
160de0d27c1SYingwei Zhengend:
161de0d27c1SYingwei Zheng  ret i1 false
162de0d27c1SYingwei Zheng}
163de0d27c1SYingwei Zheng
164de0d27c1SYingwei Zhengdefine i1 @smin_slt(i32 %x, i32 %y) {
165de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_slt
166de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
167de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 1)
168de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[Y]], [[MIN]]
169de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
170de0d27c1SYingwei Zheng; CHECK:       if:
17192a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 true, true
172de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
173de0d27c1SYingwei Zheng; CHECK:       end:
174de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
175de0d27c1SYingwei Zheng;
176de0d27c1SYingwei Zheng  %min = call i32 @llvm.smin.i32(i32 %x, i32 1)
177de0d27c1SYingwei Zheng  %cmp = icmp slt i32 %y, %min
178de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
179de0d27c1SYingwei Zheng
180de0d27c1SYingwei Zhengif:
181de0d27c1SYingwei Zheng  %cmp2 = icmp slt i32 %y, %x
182de0d27c1SYingwei Zheng  %cmp3 = icmp sle i32 %y, %x
183de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
184de0d27c1SYingwei Zheng  ret i1 %ret
185de0d27c1SYingwei Zheng
186de0d27c1SYingwei Zhengend:
187de0d27c1SYingwei Zheng  ret i1 false
188de0d27c1SYingwei Zheng}
189de0d27c1SYingwei Zheng
190de0d27c1SYingwei Zhengdefine i1 @smin_sle(i32 %x, i32 %y) {
191de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_sle
192de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
193de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 1)
194de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[Y]], [[MIN]]
195de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
196de0d27c1SYingwei Zheng; CHECK:       if:
197de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y]], [[X]]
19892a11eb3SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[CMP2]], true
199de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
200de0d27c1SYingwei Zheng; CHECK:       end:
201de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
202de0d27c1SYingwei Zheng;
203de0d27c1SYingwei Zheng  %min = call i32 @llvm.smin.i32(i32 %x, i32 1)
204de0d27c1SYingwei Zheng  %cmp = icmp sle i32 %y, %min
205de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
206de0d27c1SYingwei Zheng
207de0d27c1SYingwei Zhengif:
208de0d27c1SYingwei Zheng  %cmp2 = icmp slt i32 %y, %x
209de0d27c1SYingwei Zheng  %cmp3 = icmp sle i32 %y, %x
210de0d27c1SYingwei Zheng  %ret = xor i1 %cmp2, %cmp3
211de0d27c1SYingwei Zheng  ret i1 %ret
212de0d27c1SYingwei Zheng
213de0d27c1SYingwei Zhengend:
214de0d27c1SYingwei Zheng  ret i1 false
215de0d27c1SYingwei Zheng}
216de0d27c1SYingwei Zheng
217de0d27c1SYingwei Zhengdefine i1 @umax_uge_ugt_with_add_nuw(i32 %x, i32 %y) {
218de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_uge_ugt_with_add_nuw
219de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
220de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1)
221de0d27c1SYingwei Zheng; CHECK-NEXT:    [[SUM:%.*]] = add nuw i32 [[MAX]], 1
222de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i32 [[Y]], [[SUM]]
223de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
224de0d27c1SYingwei Zheng; CHECK:       if:
22592a11eb3SYingwei Zheng; CHECK-NEXT:    ret i1 true
226de0d27c1SYingwei Zheng; CHECK:       end:
227de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
228de0d27c1SYingwei Zheng;
229de0d27c1SYingwei Zheng  %max = call i32 @llvm.umax.i32(i32 %x, i32 1)
230de0d27c1SYingwei Zheng  %sum = add nuw i32 %max, 1
231de0d27c1SYingwei Zheng  %cmp = icmp uge i32 %y, %sum
232de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
233de0d27c1SYingwei Zheng
234de0d27c1SYingwei Zhengif:
235de0d27c1SYingwei Zheng  %cmp2 = icmp ugt i32 %y, %x
236de0d27c1SYingwei Zheng  ret i1 %cmp2
237de0d27c1SYingwei Zheng
238de0d27c1SYingwei Zhengend:
239de0d27c1SYingwei Zheng  ret i1 false
240de0d27c1SYingwei Zheng}
241de0d27c1SYingwei Zheng
242de0d27c1SYingwei Zhengdefine i1 @smin_ule_mixed(i32 %x, i32 %y) {
243de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_ule_mixed
244de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
245de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 1)
246de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ule i32 [[Y]], [[MIN]]
247de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
248de0d27c1SYingwei Zheng; CHECK:       if:
249de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y]], [[X]]
250de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[Y]], [[X]]
251de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP4:%.*]] = icmp ult i32 [[Y]], [[X]]
252de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP5:%.*]] = icmp ule i32 [[Y]], [[X]]
253de0d27c1SYingwei Zheng; CHECK-NEXT:    [[XOR1:%.*]] = xor i1 [[CMP2]], [[CMP3]]
254de0d27c1SYingwei Zheng; CHECK-NEXT:    [[XOR2:%.*]] = xor i1 [[CMP4]], [[CMP5]]
255de0d27c1SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[XOR1]], [[XOR2]]
256de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
257de0d27c1SYingwei Zheng; CHECK:       end:
258de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
259de0d27c1SYingwei Zheng;
260de0d27c1SYingwei Zheng  %min = call i32 @llvm.smin.i32(i32 %x, i32 1)
261de0d27c1SYingwei Zheng  %cmp = icmp ule i32 %y, %min
262de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
263de0d27c1SYingwei Zheng
264de0d27c1SYingwei Zhengif:
265de0d27c1SYingwei Zheng  %cmp2 = icmp slt i32 %y, %x
266de0d27c1SYingwei Zheng  %cmp3 = icmp sle i32 %y, %x
267de0d27c1SYingwei Zheng  %cmp4 = icmp ult i32 %y, %x
268de0d27c1SYingwei Zheng  %cmp5 = icmp ule i32 %y, %x
269de0d27c1SYingwei Zheng  %xor1 = xor i1 %cmp2, %cmp3
270de0d27c1SYingwei Zheng  %xor2 = xor i1 %cmp4, %cmp5
271de0d27c1SYingwei Zheng  %ret = xor i1 %xor1, %xor2
272de0d27c1SYingwei Zheng  ret i1 %ret
273de0d27c1SYingwei Zheng
274de0d27c1SYingwei Zhengend:
275de0d27c1SYingwei Zheng  ret i1 false
276de0d27c1SYingwei Zheng}
277de0d27c1SYingwei Zheng
278de0d27c1SYingwei Zhengdefine i1 @umax_ugt_ugt_both(i32 %x, i32 %y, i32 %z) {
279de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_ugt_ugt_both
280de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
281de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 [[Y]])
282de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[Z]], [[MAX]]
283de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
284de0d27c1SYingwei Zheng; CHECK:       if:
28592a11eb3SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = xor i1 true, true
286de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[AND]]
287de0d27c1SYingwei Zheng; CHECK:       end:
288de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 false
289de0d27c1SYingwei Zheng;
290de0d27c1SYingwei Zheng  %max = call i32 @llvm.umax.i32(i32 %x, i32 %y)
291de0d27c1SYingwei Zheng  %cmp = icmp ugt i32 %z, %max
292de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
293de0d27c1SYingwei Zheng
294de0d27c1SYingwei Zhengif:
295de0d27c1SYingwei Zheng  %cmp2 = icmp ugt i32 %z, %x
296de0d27c1SYingwei Zheng  %cmp3 = icmp ugt i32 %z, %y
297de0d27c1SYingwei Zheng  %and = xor i1 %cmp2, %cmp3
298de0d27c1SYingwei Zheng  ret i1 %and
299de0d27c1SYingwei Zheng
300de0d27c1SYingwei Zhengend:
301de0d27c1SYingwei Zheng  ret i1 false
302de0d27c1SYingwei Zheng}
303de0d27c1SYingwei Zheng
304de0d27c1SYingwei Zhengdefine i1 @smin_branchless(i32 %x, i32 %y) {
305de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_branchless
306de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
307de0d27c1SYingwei Zheng; CHECK-NEXT:  entry:
308de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y]])
3093d91d961SFlorian Hahn; CHECK-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[MIN]], [[X]]
3103d91d961SFlorian Hahn; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[MIN]], [[X]]
3113d91d961SFlorian Hahn; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[CMP1]], [[CMP2]]
312de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
313de0d27c1SYingwei Zheng;
314de0d27c1SYingwei Zhengentry:
315de0d27c1SYingwei Zheng  %min = call i32 @llvm.smin.i32(i32 %x, i32 %y)
316de0d27c1SYingwei Zheng  %cmp1 = icmp sle i32 %min, %x
317de0d27c1SYingwei Zheng  %cmp2 = icmp sgt i32 %min, %x
318de0d27c1SYingwei Zheng  %ret = xor i1 %cmp1, %cmp2
319de0d27c1SYingwei Zheng  ret i1 %ret
320de0d27c1SYingwei Zheng}
321de0d27c1SYingwei Zheng
322de0d27c1SYingwei Zhengdefine i32 @simplify_smax(i32 %x, i32 %y, i32 %z) {
323de0d27c1SYingwei Zheng; CHECK-LABEL: define i32 @simplify_smax
324de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
325de0d27c1SYingwei Zheng; CHECK-NEXT:  entry:
326de0d27c1SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X]], [[Y]]
327de0d27c1SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
328de0d27c1SYingwei Zheng; CHECK:       if:
329de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX1:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 [[Z]])
330de0d27c1SYingwei Zheng; CHECK-NEXT:    [[MAX2:%.*]] = call i32 @llvm.smax.i32(i32 [[Y]], i32 [[MAX1]])
331de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i32 [[MAX2]]
332de0d27c1SYingwei Zheng; CHECK:       end:
333de0d27c1SYingwei Zheng; CHECK-NEXT:    ret i32 0
334de0d27c1SYingwei Zheng;
335de0d27c1SYingwei Zhengentry:
336de0d27c1SYingwei Zheng  %cmp = icmp slt i32 %x, %y
337de0d27c1SYingwei Zheng  br i1 %cmp, label %if, label %end
338de0d27c1SYingwei Zhengif:
339de0d27c1SYingwei Zheng  %max1 = call i32 @llvm.smax.i32(i32 %x, i32 %z)
340de0d27c1SYingwei Zheng  %max2 = call i32 @llvm.smax.i32(i32 %y, i32 %max1)
341de0d27c1SYingwei Zheng  ret i32 %max2
342de0d27c1SYingwei Zhengend:
343de0d27c1SYingwei Zheng  ret i32 0
344de0d27c1SYingwei Zheng}
345de0d27c1SYingwei Zheng
346bc9c2be3SYingwei Zheng; Test from PR75155
347bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val(i32 %a, i32 %b) {
348bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val
349bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
350bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
351bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
352bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
353bc9c2be3SYingwei Zheng; CHECK:       then:
354bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
355bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[B]]
356bc9c2be3SYingwei Zheng; CHECK:       else:
357bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
358bc9c2be3SYingwei Zheng;
359bc9c2be3SYingwei Zhengstart:
360bc9c2be3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
361bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
362bc9c2be3SYingwei Zhengthen:
363bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
364bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
365bc9c2be3SYingwei Zheng  ret i32 %max
366bc9c2be3SYingwei Zhengelse:
367bc9c2be3SYingwei Zheng  ret i32 -1
368bc9c2be3SYingwei Zheng}
369bc9c2be3SYingwei Zheng
370bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val_commuted(i32 %a, i32 %b) {
371bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val_commuted
372bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
373bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
374bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
375bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
376bc9c2be3SYingwei Zheng; CHECK:       then:
377bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
378bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[B]]
379bc9c2be3SYingwei Zheng; CHECK:       else:
380bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
381bc9c2be3SYingwei Zheng;
382bc9c2be3SYingwei Zhengstart:
383bc9c2be3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
384bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
385bc9c2be3SYingwei Zhengthen:
386bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
387bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %add, i32 %b)
388bc9c2be3SYingwei Zheng  ret i32 %max
389bc9c2be3SYingwei Zhengelse:
390bc9c2be3SYingwei Zheng  ret i32 -1
391bc9c2be3SYingwei Zheng}
392bc9c2be3SYingwei Zheng
393bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val_at_use(i32 %a, i32 %b) {
394bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val_at_use
395bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
396bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
397bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
398bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
399bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
400bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
401bc9c2be3SYingwei Zheng; CHECK:       then:
402bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[MAX]]
403bc9c2be3SYingwei Zheng; CHECK:       else:
404bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
405bc9c2be3SYingwei Zheng;
406bc9c2be3SYingwei Zhengstart:
407bc9c2be3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
408bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
409bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
410bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
411bc9c2be3SYingwei Zhengthen:
412bc9c2be3SYingwei Zheng  ret i32 %max
413bc9c2be3SYingwei Zhengelse:
414bc9c2be3SYingwei Zheng  ret i32 -1
415bc9c2be3SYingwei Zheng}
416bc9c2be3SYingwei Zheng
417bc9c2be3SYingwei Zhengdefine i32 @simplify_sgt_smax_val(i32 %a, i32 %b) {
418bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_sgt_smax_val
419bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
420bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
421bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], [[B]]
422bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
423bc9c2be3SYingwei Zheng; CHECK:       then:
424bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
425bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[ADD]]
426bc9c2be3SYingwei Zheng; CHECK:       else:
427bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
428bc9c2be3SYingwei Zheng;
429bc9c2be3SYingwei Zhengstart:
430bc9c2be3SYingwei Zheng  %cmp = icmp sgt i32 %a, %b
431bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
432bc9c2be3SYingwei Zhengthen:
433bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
434bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
435bc9c2be3SYingwei Zheng  ret i32 %max
436bc9c2be3SYingwei Zhengelse:
437bc9c2be3SYingwei Zheng  ret i32 -1
438bc9c2be3SYingwei Zheng}
439bc9c2be3SYingwei Zheng
440bc9c2be3SYingwei Zhengdefine i32 @simplify_sle_smax_val(i32 %a, i32 %b) {
441bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_sle_smax_val
442bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
443bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
444bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A]], [[B]]
445bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
446bc9c2be3SYingwei Zheng; CHECK:       then:
447bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
448bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
449bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[MAX]]
450bc9c2be3SYingwei Zheng; CHECK:       else:
451bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
452bc9c2be3SYingwei Zheng;
453bc9c2be3SYingwei Zhengstart:
454bc9c2be3SYingwei Zheng  %cmp = icmp sle i32 %a, %b
455bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
456bc9c2be3SYingwei Zhengthen:
457bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
458bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
459bc9c2be3SYingwei Zheng  ret i32 %max
460bc9c2be3SYingwei Zhengelse:
461bc9c2be3SYingwei Zheng  ret i32 -1
462bc9c2be3SYingwei Zheng}
463bc9c2be3SYingwei Zheng
464bc9c2be3SYingwei Zhengdefine i32 @simplify_sge_smax_val(i32 %a, i32 %b) {
465bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_sge_smax_val
466bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
467bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
468bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[A]], [[B]]
469bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
470bc9c2be3SYingwei Zheng; CHECK:       then:
471bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
472bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[ADD]]
473bc9c2be3SYingwei Zheng; CHECK:       else:
474bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
475bc9c2be3SYingwei Zheng;
476bc9c2be3SYingwei Zhengstart:
477bc9c2be3SYingwei Zheng  %cmp = icmp sge i32 %a, %b
478bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
479bc9c2be3SYingwei Zhengthen:
480bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
481bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
482bc9c2be3SYingwei Zheng  ret i32 %max
483bc9c2be3SYingwei Zhengelse:
484bc9c2be3SYingwei Zheng  ret i32 -1
485bc9c2be3SYingwei Zheng}
486bc9c2be3SYingwei Zheng
487bc9c2be3SYingwei Zhengdefine i32 @simplify_ult_umax_val(i32 %a, i32 %b) {
488bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_ult_umax_val
489bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
490bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
491bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
492bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
493bc9c2be3SYingwei Zheng; CHECK:       then:
494bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nuw i32 [[A]], 1
495bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[B]]
496bc9c2be3SYingwei Zheng; CHECK:       else:
497bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
498bc9c2be3SYingwei Zheng;
499bc9c2be3SYingwei Zhengstart:
500bc9c2be3SYingwei Zheng  %cmp = icmp ult i32 %a, %b
501bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
502bc9c2be3SYingwei Zhengthen:
503bc9c2be3SYingwei Zheng  %add = add nuw i32 %a, 1
504bc9c2be3SYingwei Zheng  %max = call i32 @llvm.umax.i32(i32 %b, i32 %add)
505bc9c2be3SYingwei Zheng  ret i32 %max
506bc9c2be3SYingwei Zhengelse:
507bc9c2be3SYingwei Zheng  ret i32 -1
508bc9c2be3SYingwei Zheng}
509bc9c2be3SYingwei Zheng
510bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smin_val(i32 %a, i32 %b) {
511bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smin_val
512bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
513bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
514bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
515bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
516bc9c2be3SYingwei Zheng; CHECK:       then:
517bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
518bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[ADD]]
519bc9c2be3SYingwei Zheng; CHECK:       else:
520bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
521bc9c2be3SYingwei Zheng;
522bc9c2be3SYingwei Zhengstart:
523bc9c2be3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
524bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
525bc9c2be3SYingwei Zhengthen:
526bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
527bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smin.i32(i32 %b, i32 %add)
528bc9c2be3SYingwei Zheng  ret i32 %max
529bc9c2be3SYingwei Zhengelse:
530bc9c2be3SYingwei Zheng  ret i32 -1
531bc9c2be3SYingwei Zheng}
532bc9c2be3SYingwei Zheng
533bc9c2be3SYingwei Zhengdefine i32 @simplify_ult_umin_val(i32 %a, i32 %b) {
534bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_ult_umin_val
535bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
536bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
537bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
538bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
539bc9c2be3SYingwei Zheng; CHECK:       then:
540bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nuw i32 [[A]], 1
541bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[ADD]]
542bc9c2be3SYingwei Zheng; CHECK:       else:
543bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
544bc9c2be3SYingwei Zheng;
545bc9c2be3SYingwei Zhengstart:
546bc9c2be3SYingwei Zheng  %cmp = icmp ult i32 %a, %b
547bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
548bc9c2be3SYingwei Zhengthen:
549bc9c2be3SYingwei Zheng  %add = add nuw i32 %a, 1
550bc9c2be3SYingwei Zheng  %max = call i32 @llvm.umin.i32(i32 %b, i32 %add)
551bc9c2be3SYingwei Zheng  ret i32 %max
552bc9c2be3SYingwei Zhengelse:
553bc9c2be3SYingwei Zheng  ret i32 -1
554bc9c2be3SYingwei Zheng}
555bc9c2be3SYingwei Zheng
556bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val_fail1(i32 %a, i32 %b) {
557bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val_fail1
558bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
559bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
560bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
561bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
562bc9c2be3SYingwei Zheng; CHECK:       then:
563bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 2
564bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
565bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[MAX]]
566bc9c2be3SYingwei Zheng; CHECK:       else:
567bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
568bc9c2be3SYingwei Zheng;
569bc9c2be3SYingwei Zhengstart:
570bc9c2be3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
571bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
572bc9c2be3SYingwei Zhengthen:
573bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 2
574bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
575bc9c2be3SYingwei Zheng  ret i32 %max
576bc9c2be3SYingwei Zhengelse:
577bc9c2be3SYingwei Zheng  ret i32 -1
578bc9c2be3SYingwei Zheng}
579bc9c2be3SYingwei Zheng
580bc9c2be3SYingwei Zhengdefine i32 @simplify_ult_smax_val_fail2(i32 %a, i32 %b) {
581bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_ult_smax_val_fail2
582bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
583bc9c2be3SYingwei Zheng; CHECK-NEXT:  start:
584bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
585bc9c2be3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
586bc9c2be3SYingwei Zheng; CHECK:       then:
587bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 1
588bc9c2be3SYingwei Zheng; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
589bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 [[MAX]]
590bc9c2be3SYingwei Zheng; CHECK:       else:
591bc9c2be3SYingwei Zheng; CHECK-NEXT:    ret i32 -1
592bc9c2be3SYingwei Zheng;
593bc9c2be3SYingwei Zhengstart:
594bc9c2be3SYingwei Zheng  %cmp = icmp ult i32 %a, %b
595bc9c2be3SYingwei Zheng  br i1 %cmp, label %then, label %else
596bc9c2be3SYingwei Zhengthen:
597bc9c2be3SYingwei Zheng  %add = add nsw i32 %a, 1
598bc9c2be3SYingwei Zheng  %max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
599bc9c2be3SYingwei Zheng  ret i32 %max
600bc9c2be3SYingwei Zhengelse:
601bc9c2be3SYingwei Zheng  ret i32 -1
602bc9c2be3SYingwei Zheng}
603bc9c2be3SYingwei Zheng
6048ca351d3SYingwei Zhengdefine i64 @pr82271(i32 %a, i32 %b){
6058ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271
6068ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
6078ca351d3SYingwei Zheng; CHECK-NEXT:  entry:
6088ca351d3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
6098ca351d3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
6108ca351d3SYingwei Zheng; CHECK:       then:
6118ca351d3SYingwei Zheng; CHECK-NEXT:    [[SA:%.*]] = sext i32 [[A]] to i64
6128ca351d3SYingwei Zheng; CHECK-NEXT:    [[SB:%.*]] = sext i32 [[B]] to i64
6138ca351d3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
614*87b1e735SYingwei Zheng; CHECK-NEXT:    ret i64 [[SB]]
6158ca351d3SYingwei Zheng; CHECK:       else:
6168ca351d3SYingwei Zheng; CHECK-NEXT:    ret i64 0
6178ca351d3SYingwei Zheng;
6188ca351d3SYingwei Zhengentry:
6198ca351d3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
6208ca351d3SYingwei Zheng  br i1 %cmp, label %then, label %else
6218ca351d3SYingwei Zheng
6228ca351d3SYingwei Zhengthen:
6238ca351d3SYingwei Zheng  %sa = sext i32 %a to i64
6248ca351d3SYingwei Zheng  %sb = sext i32 %b to i64
6258ca351d3SYingwei Zheng  %add = add nsw i64 %sa, 1
6268ca351d3SYingwei Zheng  %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
6278ca351d3SYingwei Zheng  ret i64 %smax
6288ca351d3SYingwei Zheng
6298ca351d3SYingwei Zhengelse:
6308ca351d3SYingwei Zheng  ret i64 0
6318ca351d3SYingwei Zheng}
6328ca351d3SYingwei Zheng
6338ca351d3SYingwei Zhengdefine i64 @pr82271_sext_zext_nneg(i32 %a, i32 %b){
6348ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271_sext_zext_nneg
6358ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
6368ca351d3SYingwei Zheng; CHECK-NEXT:  entry:
6378ca351d3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
6388ca351d3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
6398ca351d3SYingwei Zheng; CHECK:       then:
6408ca351d3SYingwei Zheng; CHECK-NEXT:    [[SA:%.*]] = sext i32 [[A]] to i64
6418ca351d3SYingwei Zheng; CHECK-NEXT:    [[SB:%.*]] = zext nneg i32 [[B]] to i64
6428ca351d3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
643*87b1e735SYingwei Zheng; CHECK-NEXT:    ret i64 [[SB]]
6448ca351d3SYingwei Zheng; CHECK:       else:
6458ca351d3SYingwei Zheng; CHECK-NEXT:    ret i64 0
6468ca351d3SYingwei Zheng;
6478ca351d3SYingwei Zhengentry:
6488ca351d3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
6498ca351d3SYingwei Zheng  br i1 %cmp, label %then, label %else
6508ca351d3SYingwei Zheng
6518ca351d3SYingwei Zhengthen:
6528ca351d3SYingwei Zheng  %sa = sext i32 %a to i64
6538ca351d3SYingwei Zheng  %sb = zext nneg i32 %b to i64
6548ca351d3SYingwei Zheng  %add = add nsw i64 %sa, 1
6558ca351d3SYingwei Zheng  %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
6568ca351d3SYingwei Zheng  ret i64 %smax
6578ca351d3SYingwei Zheng
6588ca351d3SYingwei Zhengelse:
6598ca351d3SYingwei Zheng  ret i64 0
6608ca351d3SYingwei Zheng}
6618ca351d3SYingwei Zheng
6628ca351d3SYingwei Zhengdefine i64 @pr82271_zext_nneg(i32 %a, i32 %b){
6638ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271_zext_nneg
6648ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
6658ca351d3SYingwei Zheng; CHECK-NEXT:  entry:
6668ca351d3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
6678ca351d3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
6688ca351d3SYingwei Zheng; CHECK:       then:
6698ca351d3SYingwei Zheng; CHECK-NEXT:    [[SA:%.*]] = zext nneg i32 [[A]] to i64
6708ca351d3SYingwei Zheng; CHECK-NEXT:    [[SB:%.*]] = zext nneg i32 [[B]] to i64
6718ca351d3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
672*87b1e735SYingwei Zheng; CHECK-NEXT:    ret i64 [[SB]]
6738ca351d3SYingwei Zheng; CHECK:       else:
6748ca351d3SYingwei Zheng; CHECK-NEXT:    ret i64 0
6758ca351d3SYingwei Zheng;
6768ca351d3SYingwei Zhengentry:
6778ca351d3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
6788ca351d3SYingwei Zheng  br i1 %cmp, label %then, label %else
6798ca351d3SYingwei Zheng
6808ca351d3SYingwei Zhengthen:
6818ca351d3SYingwei Zheng  %sa = zext nneg i32 %a to i64
6828ca351d3SYingwei Zheng  %sb = zext nneg i32 %b to i64
6838ca351d3SYingwei Zheng  %add = add nsw i64 %sa, 1
6848ca351d3SYingwei Zheng  %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
6858ca351d3SYingwei Zheng  ret i64 %smax
6868ca351d3SYingwei Zheng
6878ca351d3SYingwei Zhengelse:
6888ca351d3SYingwei Zheng  ret i64 0
6898ca351d3SYingwei Zheng}
6908ca351d3SYingwei Zheng
6918ca351d3SYingwei Zhengdefine i64 @pr82271_zext(i32 %a, i32 %b){
6928ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271_zext
6938ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
6948ca351d3SYingwei Zheng; CHECK-NEXT:  entry:
6958ca351d3SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
6968ca351d3SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
6978ca351d3SYingwei Zheng; CHECK:       then:
6988ca351d3SYingwei Zheng; CHECK-NEXT:    [[SA:%.*]] = zext i32 [[A]] to i64
6998ca351d3SYingwei Zheng; CHECK-NEXT:    [[SB:%.*]] = zext i32 [[B]] to i64
7008ca351d3SYingwei Zheng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[SA]], 1
7018ca351d3SYingwei Zheng; CHECK-NEXT:    [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
7028ca351d3SYingwei Zheng; CHECK-NEXT:    ret i64 [[SMAX]]
7038ca351d3SYingwei Zheng; CHECK:       else:
7048ca351d3SYingwei Zheng; CHECK-NEXT:    ret i64 0
7058ca351d3SYingwei Zheng;
7068ca351d3SYingwei Zhengentry:
7078ca351d3SYingwei Zheng  %cmp = icmp slt i32 %a, %b
7088ca351d3SYingwei Zheng  br i1 %cmp, label %then, label %else
7098ca351d3SYingwei Zheng
7108ca351d3SYingwei Zhengthen:
7118ca351d3SYingwei Zheng  %sa = zext i32 %a to i64
7128ca351d3SYingwei Zheng  %sb = zext i32 %b to i64
7138ca351d3SYingwei Zheng  %add = add nsw i64 %sa, 1
7148ca351d3SYingwei Zheng  %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
7158ca351d3SYingwei Zheng  ret i64 %smax
7168ca351d3SYingwei Zheng
7178ca351d3SYingwei Zhengelse:
7188ca351d3SYingwei Zheng  ret i64 0
7198ca351d3SYingwei Zheng}
7208ca351d3SYingwei Zheng
721de0d27c1SYingwei Zhengdeclare i32 @llvm.smin.i32(i32, i32)
722de0d27c1SYingwei Zhengdeclare i32 @llvm.smax.i32(i32, i32)
723de0d27c1SYingwei Zhengdeclare i32 @llvm.umin.i32(i32, i32)
724de0d27c1SYingwei Zhengdeclare i32 @llvm.umax.i32(i32, i32)
725