xref: /llvm-project/llvm/test/Transforms/InstCombine/intrinsic-distributive.ll (revision fcd51dee42792bf264d26ab4978eb0a3a3001728)
1*fcd51deeSJorge Botto; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2*fcd51deeSJorge Botto; RUN: opt -S -passes=instcombine < %s 2>&1 | FileCheck %s
3*fcd51deeSJorge Botto
4*fcd51deeSJorge Botto
5*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw(i8 %a, i8 %b, i8 %c) {
6*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw(
7*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
8*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
9*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]
10*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
11*fcd51deeSJorge Botto;
12*fcd51deeSJorge Botto  %add1 = add nuw i8 %b, %a
13*fcd51deeSJorge Botto  %add2 = add nuw i8 %c, %a
14*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
15*fcd51deeSJorge Botto  ret i8 %max
16*fcd51deeSJorge Botto}
17*fcd51deeSJorge Botto
18*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw_comm(i8 %a, i8 %b, i8 %c) {
19*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw_comm(
20*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
21*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
22*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]
23*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
24*fcd51deeSJorge Botto;
25*fcd51deeSJorge Botto  %add1 = add nuw i8 %a, %b
26*fcd51deeSJorge Botto  %add2 = add nuw i8 %a, %c
27*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
28*fcd51deeSJorge Botto  ret i8 %max
29*fcd51deeSJorge Botto}
30*fcd51deeSJorge Botto
31*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw_nsw_lhs(i8 %a, i8 %b, i8 %c) {
32*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_lhs(
33*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
34*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
35*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]
36*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
37*fcd51deeSJorge Botto;
38*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %b, %a
39*fcd51deeSJorge Botto  %add2 = add nuw i8 %c, %a
40*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
41*fcd51deeSJorge Botto  ret i8 %max
42*fcd51deeSJorge Botto}
43*fcd51deeSJorge Botto
44*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw_nsw_lhs_comm(i8 %a, i8 %b, i8 %c) {
45*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_lhs_comm(
46*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
47*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
48*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]
49*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
50*fcd51deeSJorge Botto;
51*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %a, %b
52*fcd51deeSJorge Botto  %add2 = add nuw i8 %a, %c
53*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
54*fcd51deeSJorge Botto  ret i8 %max
55*fcd51deeSJorge Botto}
56*fcd51deeSJorge Botto
57*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw_nsw_rhs(i8 %a, i8 %b, i8 %c) {
58*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_rhs(
59*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
60*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
61*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]
62*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
63*fcd51deeSJorge Botto;
64*fcd51deeSJorge Botto  %add1 = add nuw i8 %b, %a
65*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %c, %a
66*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
67*fcd51deeSJorge Botto  ret i8 %max
68*fcd51deeSJorge Botto}
69*fcd51deeSJorge Botto
70*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw_nsw_rhs_comm(i8 %a, i8 %b, i8 %c) {
71*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_rhs_comm(
72*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
73*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
74*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]
75*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
76*fcd51deeSJorge Botto;
77*fcd51deeSJorge Botto  %add1 = add nuw i8 %a, %b
78*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %a, %c
79*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
80*fcd51deeSJorge Botto  ret i8 %max
81*fcd51deeSJorge Botto}
82*fcd51deeSJorge Botto
83*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw_nsw(i8 %a, i8 %b, i8 %c) {
84*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw(
85*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
86*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
87*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
88*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
89*fcd51deeSJorge Botto;
90*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %b, %a
91*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %c, %a
92*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
93*fcd51deeSJorge Botto  ret i8 %max
94*fcd51deeSJorge Botto}
95*fcd51deeSJorge Botto
96*fcd51deeSJorge Bottodefine i8 @umax_of_add_nuw_nsw_comm(i8 %a, i8 %b, i8 %c) {
97*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_comm(
98*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
99*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])
100*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
101*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
102*fcd51deeSJorge Botto;
103*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %a, %b
104*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %a, %c
105*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
106*fcd51deeSJorge Botto  ret i8 %max
107*fcd51deeSJorge Botto}
108*fcd51deeSJorge Botto
109*fcd51deeSJorge Botto; negative test
110*fcd51deeSJorge Bottodefine i8 @umax_of_add_nsw(i8 %a, i8 %b, i8 %c) {
111*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add_nsw(
112*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
113*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i8 [[B]], [[A]]
114*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add nsw i8 [[C]], [[A]]
115*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[ADD1]], i8 [[ADD2]])
116*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
117*fcd51deeSJorge Botto;
118*fcd51deeSJorge Botto  %add1 = add nsw i8 %b, %a
119*fcd51deeSJorge Botto  %add2 = add nsw i8 %c, %a
120*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
121*fcd51deeSJorge Botto  ret i8 %max
122*fcd51deeSJorge Botto}
123*fcd51deeSJorge Botto
124*fcd51deeSJorge Botto; negative test
125*fcd51deeSJorge Bottodefine i8 @umax_of_add(i8 %a, i8 %b, i8 %c) {
126*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umax_of_add(
127*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
128*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]
129*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]
130*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[ADD1]], i8 [[ADD2]])
131*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
132*fcd51deeSJorge Botto;
133*fcd51deeSJorge Botto  %add1 = add i8 %b, %a
134*fcd51deeSJorge Botto  %add2 = add i8 %c, %a
135*fcd51deeSJorge Botto  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)
136*fcd51deeSJorge Botto  ret i8 %max
137*fcd51deeSJorge Botto}
138*fcd51deeSJorge Botto
139*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw(i8 %a, i8 %b, i8 %c) {
140*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw(
141*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
142*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
143*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]
144*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
145*fcd51deeSJorge Botto;
146*fcd51deeSJorge Botto  %add1 = add nuw i8 %b, %a
147*fcd51deeSJorge Botto  %add2 = add nuw i8 %c, %a
148*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
149*fcd51deeSJorge Botto  ret i8 %min
150*fcd51deeSJorge Botto}
151*fcd51deeSJorge Botto
152*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw_comm(i8 %a, i8 %b, i8 %c) {
153*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw_comm(
154*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
155*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
156*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]
157*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
158*fcd51deeSJorge Botto;
159*fcd51deeSJorge Botto  %add1 = add nuw i8 %a, %b
160*fcd51deeSJorge Botto  %add2 = add nuw i8 %a, %c
161*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
162*fcd51deeSJorge Botto  ret i8 %min
163*fcd51deeSJorge Botto}
164*fcd51deeSJorge Botto
165*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw_nsw_lhs(i8 %a, i8 %b, i8 %c) {
166*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_lhs(
167*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
168*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
169*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]
170*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
171*fcd51deeSJorge Botto;
172*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %b, %a
173*fcd51deeSJorge Botto  %add2 = add nuw i8 %c, %a
174*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
175*fcd51deeSJorge Botto  ret i8 %min
176*fcd51deeSJorge Botto}
177*fcd51deeSJorge Botto
178*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw_nsw_lhs_comm(i8 %a, i8 %b, i8 %c) {
179*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_lhs_comm(
180*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
181*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
182*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]
183*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
184*fcd51deeSJorge Botto;
185*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %a, %b
186*fcd51deeSJorge Botto  %add2 = add nuw i8 %a, %c
187*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
188*fcd51deeSJorge Botto  ret i8 %min
189*fcd51deeSJorge Botto}
190*fcd51deeSJorge Botto
191*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw_nsw_rhs(i8 %a, i8 %b, i8 %c) {
192*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_rhs(
193*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
194*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
195*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]
196*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
197*fcd51deeSJorge Botto;
198*fcd51deeSJorge Botto  %add1 = add nuw i8 %b, %a
199*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %c, %a
200*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
201*fcd51deeSJorge Botto  ret i8 %min
202*fcd51deeSJorge Botto}
203*fcd51deeSJorge Botto
204*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw_nsw_rhs_comm(i8 %a, i8 %b, i8 %c) {
205*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_rhs_comm(
206*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
207*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
208*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]
209*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
210*fcd51deeSJorge Botto;
211*fcd51deeSJorge Botto  %add1 = add nuw i8 %a, %b
212*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %a, %c
213*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
214*fcd51deeSJorge Botto  ret i8 %min
215*fcd51deeSJorge Botto}
216*fcd51deeSJorge Botto
217*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw_nsw(i8 %a, i8 %b, i8 %c) {
218*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw(
219*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
220*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
221*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
222*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
223*fcd51deeSJorge Botto;
224*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %b, %a
225*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %c, %a
226*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
227*fcd51deeSJorge Botto  ret i8 %min
228*fcd51deeSJorge Botto}
229*fcd51deeSJorge Botto
230*fcd51deeSJorge Bottodefine i8 @umin_of_add_nuw_nsw_comm(i8 %a, i8 %b, i8 %c) {
231*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_comm(
232*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
233*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])
234*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
235*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
236*fcd51deeSJorge Botto;
237*fcd51deeSJorge Botto  %add1 = add nuw nsw i8 %a, %b
238*fcd51deeSJorge Botto  %add2 = add nuw nsw i8 %a, %c
239*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
240*fcd51deeSJorge Botto  ret i8 %min
241*fcd51deeSJorge Botto}
242*fcd51deeSJorge Botto
243*fcd51deeSJorge Botto; negative test
244*fcd51deeSJorge Bottodefine i8 @umin_of_add_nsw(i8 %a, i8 %b, i8 %c) {
245*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add_nsw(
246*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
247*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i8 [[B]], [[A]]
248*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add nsw i8 [[C]], [[A]]
249*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[ADD1]], i8 [[ADD2]])
250*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
251*fcd51deeSJorge Botto;
252*fcd51deeSJorge Botto  %add1 = add nsw i8 %b, %a
253*fcd51deeSJorge Botto  %add2 = add nsw i8 %c, %a
254*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
255*fcd51deeSJorge Botto  ret i8 %min
256*fcd51deeSJorge Botto}
257*fcd51deeSJorge Botto
258*fcd51deeSJorge Botto; negative test
259*fcd51deeSJorge Bottodefine i8 @umin_of_add(i8 %a, i8 %b, i8 %c) {
260*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @umin_of_add(
261*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
262*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]
263*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]
264*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[ADD1]], i8 [[ADD2]])
265*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
266*fcd51deeSJorge Botto;
267*fcd51deeSJorge Botto  %add1 = add i8 %b, %a
268*fcd51deeSJorge Botto  %add2 = add i8 %c, %a
269*fcd51deeSJorge Botto  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)
270*fcd51deeSJorge Botto  ret i8 %min
271*fcd51deeSJorge Botto}
272*fcd51deeSJorge Botto
273*fcd51deeSJorge Botto; negative test
274*fcd51deeSJorge Bottodefine i8 @smax_of_add_nuw(i8 %a, i8 %b, i8 %c) {
275*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nuw(
276*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
277*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add nuw i8 [[B]], [[A]]
278*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add nuw i8 [[C]], [[A]]
279*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[ADD1]], i8 [[ADD2]])
280*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
281*fcd51deeSJorge Botto;
282*fcd51deeSJorge Botto  %add1 = add nuw i8 %b, %a
283*fcd51deeSJorge Botto  %add2 = add nuw i8 %c, %a
284*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
285*fcd51deeSJorge Botto  ret i8 %max
286*fcd51deeSJorge Botto}
287*fcd51deeSJorge Botto
288*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw(i8 %a, i8 %b, i8 %c) {
289*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw(
290*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
291*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
292*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]
293*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
294*fcd51deeSJorge Botto;
295*fcd51deeSJorge Botto  %add1 = add nsw i8 %b, %a
296*fcd51deeSJorge Botto  %add2 = add nsw i8 %c, %a
297*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
298*fcd51deeSJorge Botto  ret i8 %max
299*fcd51deeSJorge Botto}
300*fcd51deeSJorge Botto
301*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw_comm(i8 %a, i8 %b, i8 %c) {
302*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw_comm(
303*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
304*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
305*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]
306*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
307*fcd51deeSJorge Botto;
308*fcd51deeSJorge Botto  %add1 = add nsw i8 %a, %b
309*fcd51deeSJorge Botto  %add2 = add nsw i8 %a, %c
310*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
311*fcd51deeSJorge Botto  ret i8 %max
312*fcd51deeSJorge Botto}
313*fcd51deeSJorge Botto
314*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw_nuw_lhs(i8 %a, i8 %b, i8 %c) {
315*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_lhs(
316*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
317*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
318*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]
319*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
320*fcd51deeSJorge Botto;
321*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %b, %a
322*fcd51deeSJorge Botto  %add2 = add nsw i8 %c, %a
323*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
324*fcd51deeSJorge Botto  ret i8 %max
325*fcd51deeSJorge Botto}
326*fcd51deeSJorge Botto
327*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw_nuw_lhs_comm(i8 %a, i8 %b, i8 %c) {
328*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_lhs_comm(
329*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
330*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
331*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]
332*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
333*fcd51deeSJorge Botto;
334*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %a, %b
335*fcd51deeSJorge Botto  %add2 = add nsw i8 %a, %c
336*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
337*fcd51deeSJorge Botto  ret i8 %max
338*fcd51deeSJorge Botto}
339*fcd51deeSJorge Botto
340*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw_nuw_rhs(i8 %a, i8 %b, i8 %c) {
341*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_rhs(
342*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
343*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
344*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]
345*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
346*fcd51deeSJorge Botto;
347*fcd51deeSJorge Botto  %add1 = add nsw i8 %b, %a
348*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %c, %a
349*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
350*fcd51deeSJorge Botto  ret i8 %max
351*fcd51deeSJorge Botto}
352*fcd51deeSJorge Botto
353*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw_nuw_rhs_comm(i8 %a, i8 %b, i8 %c) {
354*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_rhs_comm(
355*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
356*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
357*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]
358*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
359*fcd51deeSJorge Botto;
360*fcd51deeSJorge Botto  %add1 = add nsw i8 %a, %b
361*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %a, %c
362*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
363*fcd51deeSJorge Botto  ret i8 %max
364*fcd51deeSJorge Botto}
365*fcd51deeSJorge Botto
366*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw_nuw(i8 %a, i8 %b, i8 %c) {
367*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw(
368*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
369*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
370*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
371*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
372*fcd51deeSJorge Botto;
373*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %b, %a
374*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %c, %a
375*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
376*fcd51deeSJorge Botto  ret i8 %max
377*fcd51deeSJorge Botto}
378*fcd51deeSJorge Botto
379*fcd51deeSJorge Bottodefine i8 @smax_of_add_nsw_nuw_comm(i8 %a, i8 %b, i8 %c) {
380*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_comm(
381*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
382*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])
383*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
384*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
385*fcd51deeSJorge Botto;
386*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %a, %b
387*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %a, %c
388*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
389*fcd51deeSJorge Botto  ret i8 %max
390*fcd51deeSJorge Botto}
391*fcd51deeSJorge Botto
392*fcd51deeSJorge Botto; negative test
393*fcd51deeSJorge Bottodefine i8 @smax_of_add(i8 %a, i8 %b, i8 %c) {
394*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smax_of_add(
395*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
396*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]
397*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]
398*fcd51deeSJorge Botto; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[ADD1]], i8 [[ADD2]])
399*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MAX]]
400*fcd51deeSJorge Botto;
401*fcd51deeSJorge Botto  %add1 = add i8 %b, %a
402*fcd51deeSJorge Botto  %add2 = add i8 %c, %a
403*fcd51deeSJorge Botto  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)
404*fcd51deeSJorge Botto  ret i8 %max
405*fcd51deeSJorge Botto}
406*fcd51deeSJorge Botto
407*fcd51deeSJorge Botto; negative test
408*fcd51deeSJorge Bottodefine i8 @smin_of_add_nuw(i8 %a, i8 %b, i8 %c) {
409*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nuw(
410*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
411*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add nuw i8 [[B]], [[A]]
412*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add nuw i8 [[C]], [[A]]
413*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[ADD1]], i8 [[ADD2]])
414*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
415*fcd51deeSJorge Botto;
416*fcd51deeSJorge Botto  %add1 = add nuw i8 %b, %a
417*fcd51deeSJorge Botto  %add2 = add nuw i8 %c, %a
418*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
419*fcd51deeSJorge Botto  ret i8 %min
420*fcd51deeSJorge Botto}
421*fcd51deeSJorge Botto
422*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw(i8 %a, i8 %b, i8 %c) {
423*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw(
424*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
425*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
426*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]
427*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
428*fcd51deeSJorge Botto;
429*fcd51deeSJorge Botto  %add1 = add nsw i8 %b, %a
430*fcd51deeSJorge Botto  %add2 = add nsw i8 %c, %a
431*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
432*fcd51deeSJorge Botto  ret i8 %min
433*fcd51deeSJorge Botto}
434*fcd51deeSJorge Botto
435*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw_comm(i8 %a, i8 %b, i8 %c) {
436*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw_comm(
437*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
438*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
439*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]
440*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
441*fcd51deeSJorge Botto;
442*fcd51deeSJorge Botto  %add1 = add nsw i8 %a, %b
443*fcd51deeSJorge Botto  %add2 = add nsw i8 %a, %c
444*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
445*fcd51deeSJorge Botto  ret i8 %min
446*fcd51deeSJorge Botto}
447*fcd51deeSJorge Botto
448*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw_nuw_lhs(i8 %a, i8 %b, i8 %c) {
449*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_lhs(
450*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
451*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
452*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]
453*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
454*fcd51deeSJorge Botto;
455*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %b, %a
456*fcd51deeSJorge Botto  %add2 = add nsw i8 %c, %a
457*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
458*fcd51deeSJorge Botto  ret i8 %min
459*fcd51deeSJorge Botto}
460*fcd51deeSJorge Botto
461*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw_nuw_lhs_comm(i8 %a, i8 %b, i8 %c) {
462*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_lhs_comm(
463*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
464*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
465*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]
466*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
467*fcd51deeSJorge Botto;
468*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %a, %b
469*fcd51deeSJorge Botto  %add2 = add nsw i8 %a, %c
470*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
471*fcd51deeSJorge Botto  ret i8 %min
472*fcd51deeSJorge Botto}
473*fcd51deeSJorge Botto
474*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw_nuw_rhs(i8 %a, i8 %b, i8 %c) {
475*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_rhs(
476*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
477*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
478*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]
479*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
480*fcd51deeSJorge Botto;
481*fcd51deeSJorge Botto  %add1 = add nsw i8 %b, %a
482*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %c, %a
483*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
484*fcd51deeSJorge Botto  ret i8 %min
485*fcd51deeSJorge Botto}
486*fcd51deeSJorge Botto
487*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw_nuw_rhs_comm(i8 %a, i8 %b, i8 %c) {
488*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_rhs_comm(
489*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
490*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
491*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]
492*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
493*fcd51deeSJorge Botto;
494*fcd51deeSJorge Botto  %add1 = add nsw i8 %a, %b
495*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %a, %c
496*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
497*fcd51deeSJorge Botto  ret i8 %min
498*fcd51deeSJorge Botto}
499*fcd51deeSJorge Botto
500*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw_nuw(i8 %a, i8 %b, i8 %c) {
501*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw(
502*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
503*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
504*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
505*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
506*fcd51deeSJorge Botto;
507*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %b, %a
508*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %c, %a
509*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
510*fcd51deeSJorge Botto  ret i8 %min
511*fcd51deeSJorge Botto}
512*fcd51deeSJorge Botto
513*fcd51deeSJorge Bottodefine i8 @smin_of_add_nsw_nuw_comm(i8 %a, i8 %b, i8 %c) {
514*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_comm(
515*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
516*fcd51deeSJorge Botto; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])
517*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]
518*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
519*fcd51deeSJorge Botto;
520*fcd51deeSJorge Botto  %add1 = add nsw nuw i8 %a, %b
521*fcd51deeSJorge Botto  %add2 = add nsw nuw i8 %a, %c
522*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
523*fcd51deeSJorge Botto  ret i8 %min
524*fcd51deeSJorge Botto}
525*fcd51deeSJorge Botto
526*fcd51deeSJorge Botto; negative test
527*fcd51deeSJorge Bottodefine i8 @smin_of_add(i8 %a, i8 %b, i8 %c) {
528*fcd51deeSJorge Botto; CHECK-LABEL: define i8 @smin_of_add(
529*fcd51deeSJorge Botto; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {
530*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]
531*fcd51deeSJorge Botto; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]
532*fcd51deeSJorge Botto; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[ADD1]], i8 [[ADD2]])
533*fcd51deeSJorge Botto; CHECK-NEXT:    ret i8 [[MIN]]
534*fcd51deeSJorge Botto;
535*fcd51deeSJorge Botto  %add1 = add i8 %b, %a
536*fcd51deeSJorge Botto  %add2 = add i8 %c, %a
537*fcd51deeSJorge Botto  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)
538*fcd51deeSJorge Botto  ret i8 %min
539*fcd51deeSJorge Botto}
540