Skip to content

Commit 11f4f53

Browse files
committed
pre-commit tests
1 parent 940108b commit 11f4f53

File tree

1 file changed

+210
-0
lines changed

1 file changed

+210
-0
lines changed
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
; smax(smin(X, MinC), MaxC) -> smin(smax(X, MaxC), MinC)
5+
6+
declare i16 @llvm.smax.i16(i16, i16)
7+
declare i16 @llvm.smin.i16(i16, i16)
8+
declare <2 x i16> @llvm.smax.v2i16(<2 x i16>, <2 x i16>)
9+
declare <2 x i16> @llvm.smin.v2i16(<2 x i16>, <2 x i16>)
10+
11+
define i16 @max_min(i16 %x) {
12+
; CHECK-LABEL: define i16 @max_min(
13+
; CHECK-SAME: i16 [[X:%.*]]) {
14+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 255)
15+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -1)
16+
; CHECK-NEXT: ret i16 [[MAX]]
17+
;
18+
%min = call i16 @llvm.smin.i16(i16 %x, i16 255)
19+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -1)
20+
ret i16 %max
21+
}
22+
23+
define i16 @max_min_commute0(i16 %x) {
24+
; CHECK-LABEL: define i16 @max_min_commute0(
25+
; CHECK-SAME: i16 [[X:%.*]]) {
26+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
27+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
28+
; CHECK-NEXT: ret i16 [[MAX]]
29+
;
30+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
31+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
32+
ret i16 %max
33+
}
34+
35+
define i16 @max_min_commute1(i16 %x) {
36+
; CHECK-LABEL: define i16 @max_min_commute1(
37+
; CHECK-SAME: i16 [[X:%.*]]) {
38+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
39+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
40+
; CHECK-NEXT: ret i16 [[MAX]]
41+
;
42+
%min = call i16 @llvm.smin.i16(i16 127, i16 %x)
43+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
44+
ret i16 %max
45+
}
46+
47+
define i16 @max_min_commute2(i16 %x) {
48+
; CHECK-LABEL: define i16 @max_min_commute2(
49+
; CHECK-SAME: i16 [[X:%.*]]) {
50+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
51+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
52+
; CHECK-NEXT: ret i16 [[MAX]]
53+
;
54+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
55+
%max = call i16 @llvm.smax.i16(i16 -128, i16 %min)
56+
ret i16 %max
57+
}
58+
59+
define i16 @max_min_commute3(i16 %x) {
60+
; CHECK-LABEL: define i16 @max_min_commute3(
61+
; CHECK-SAME: i16 [[X:%.*]]) {
62+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
63+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
64+
; CHECK-NEXT: ret i16 [[MAX]]
65+
;
66+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
67+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
68+
ret i16 %max
69+
}
70+
71+
define <2 x i16> @max_min_v2i16(<2 x i16> %x) {
72+
; CHECK-LABEL: define <2 x i16> @max_min_v2i16(
73+
; CHECK-SAME: <2 x i16> [[X:%.*]]) {
74+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[X]], <2 x i16> splat (i16 127))
75+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.smax.v2i16(<2 x i16> [[MIN]], <2 x i16> splat (i16 -128))
76+
; CHECK-NEXT: ret <2 x i16> [[MAX]]
77+
;
78+
%min = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %x, <2 x i16> splat (i16 127))
79+
%max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %min, <2 x i16> splat (i16 -128))
80+
ret <2 x i16> %max
81+
}
82+
83+
define <2 x i8> @max_min_v2i16_nonsplat_1(<2 x i8> %a) {
84+
; CHECK-LABEL: define <2 x i8> @max_min_v2i16_nonsplat_1(
85+
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
86+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[A]], <2 x i8> <i8 20, i8 10>)
87+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[MIN]], <2 x i8> <i8 10, i8 0>)
88+
; CHECK-NEXT: ret <2 x i8> [[MAX]]
89+
;
90+
%min = call <2 x i8> @llvm.smin(<2 x i8> %a, <2 x i8> <i8 20, i8 10>)
91+
%max = call <2 x i8> @llvm.smax(<2 x i8> %min, <2 x i8> <i8 10, i8 0>)
92+
ret <2 x i8> %max
93+
}
94+
95+
define <2 x i8> @max_min_v2i16_nonsplat_2(<2 x i8> %a) {
96+
; CHECK-LABEL: define <2 x i8> @max_min_v2i16_nonsplat_2(
97+
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
98+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[A]], <2 x i8> <i8 0, i8 10>)
99+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[MIN]], <2 x i8> <i8 10, i8 0>)
100+
; CHECK-NEXT: ret <2 x i8> [[MAX]]
101+
;
102+
%min = call <2 x i8> @llvm.smin(<2 x i8> %a, <2 x i8> <i8 0, i8 10>)
103+
%max = call <2 x i8> @llvm.smax(<2 x i8> %min, <2 x i8> <i8 10, i8 0>)
104+
ret <2 x i8> %max
105+
}
106+
107+
declare void @use(i16)
108+
109+
define i16 @max_min_used(i16 %x) {
110+
; CHECK-LABEL: define i16 @max_min_used(
111+
; CHECK-SAME: i16 [[X:%.*]]) {
112+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
113+
; CHECK-NEXT: [[MAX1:%.*]] = call i16 @llvm.smax.i16(i16 [[MAX]], i16 -128)
114+
; CHECK-NEXT: call void @use(i16 [[MAX]])
115+
; CHECK-NEXT: ret i16 [[MAX1]]
116+
;
117+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
118+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
119+
call void @use(i16 %min)
120+
ret i16 %max
121+
}
122+
123+
; Special cases
124+
125+
define i16 @max_min_i16_limits(i16 %x) {
126+
; CHECK-LABEL: define i16 @max_min_i16_limits(
127+
; CHECK-SAME: i16 [[X:%.*]]) {
128+
; CHECK-NEXT: ret i16 [[X]]
129+
;
130+
%min = call i16 @llvm.smin.i16(i16 %x, i16 32767)
131+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -32768)
132+
ret i16 %max
133+
}
134+
135+
define i16 @min_max_min_nested(i16 %x) {
136+
; CHECK-LABEL: define i16 @min_max_min_nested(
137+
; CHECK-SAME: i16 [[X:%.*]]) {
138+
; CHECK-NEXT: [[MIN1:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 255)
139+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN1]], i16 -128)
140+
; CHECK-NEXT: [[MIN2:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 127)
141+
; CHECK-NEXT: ret i16 [[MIN2]]
142+
;
143+
%min1 = call i16 @llvm.smin.i16(i16 %x, i16 255)
144+
%max = call i16 @llvm.smax.i16(i16 %min1, i16 -128)
145+
%min2 = call i16 @llvm.smin.i16(i16 %max, i16 127)
146+
ret i16 %min2
147+
}
148+
149+
define i16 @max_min_cmax_sgt_cmin(i16 %x) {
150+
; CHECK-LABEL: define i16 @max_min_cmax_sgt_cmin(
151+
; CHECK-SAME: i16 [[X:%.*]]) {
152+
; CHECK-NEXT: ret i16 127
153+
;
154+
%min = call i16 @llvm.smin.i16(i16 %x, i16 126)
155+
%max = call i16 @llvm.smax.i16(i16 %min, i16 127)
156+
ret i16 %max
157+
}
158+
159+
; Negative cases
160+
161+
define i16 @max_min_variables(i16 %x, i16 %y, i16 %z) {
162+
; CHECK-LABEL: define i16 @max_min_variables(
163+
; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]], i16 [[Z:%.*]]) {
164+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 [[Y]])
165+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smax.i16(i16 [[MAX]], i16 [[Z]])
166+
; CHECK-NEXT: ret i16 [[MIN]]
167+
;
168+
%min = call i16 @llvm.smin.i16(i16 %x, i16 %y)
169+
%max = call i16 @llvm.smax.i16(i16 %min, i16 %z)
170+
ret i16 %max
171+
}
172+
173+
define i16 @min_max(i16 %x) {
174+
; CHECK-LABEL: define i16 @min_max(
175+
; CHECK-SAME: i16 [[X:%.*]]) {
176+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -128)
177+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[MAX]], i16 127)
178+
; CHECK-NEXT: ret i16 [[MIN]]
179+
;
180+
%max = call i16 @llvm.smax.i16(i16 %x, i16 -128)
181+
%min = call i16 @llvm.smin.i16(i16 %max, i16 127)
182+
ret i16 %min
183+
}
184+
185+
declare i16 @llvm.umin.i16(i16, i16)
186+
declare i16 @llvm.umax.i16(i16, i16)
187+
188+
define i16 @umax_umin(i16 %x) {
189+
; CHECK-LABEL: define i16 @umax_umin(
190+
; CHECK-SAME: i16 [[X:%.*]]) {
191+
; CHECK-NEXT: [[MIN1:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
192+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN1]], i16 127)
193+
; CHECK-NEXT: ret i16 [[MIN]]
194+
;
195+
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
196+
%max = call i16 @llvm.umax.i16(i16 %min, i16 127)
197+
ret i16 %max
198+
}
199+
200+
define i16 @umin_umax(i16 %x) {
201+
; CHECK-LABEL: define i16 @umin_umax(
202+
; CHECK-SAME: i16 [[X:%.*]]) {
203+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 127)
204+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[MAX]], i16 255)
205+
; CHECK-NEXT: ret i16 [[MIN]]
206+
;
207+
%max = call i16 @llvm.umax.i16(i16 %x, i16 127)
208+
%min = call i16 @llvm.umin.i16(i16 %max, i16 255)
209+
ret i16 %min
210+
}

0 commit comments

Comments
 (0)