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