[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / AArch64 / vectorizable-selects-uniform-cmps.ll
blobde9417759dd62798e4a886cb8061788622f9e5d2
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -slp-vectorizer -S %s | FileCheck %s
3 ; RUN: opt -aa-pipeline=basic-aa -passes='slp-vectorizer' -S %s | FileCheck %s
5 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6 target triple = "arm64-apple-ios5.0.0"
8 ; Some negative tests first.
10 ; We need selects with a uniform predicate to lower effectively to vector
11 ; instructions.
12 define void @select_mixed_predicates_8xi16(i16* %ptr, i16 %x) {
13 ; CHECK-LABEL: @select_mixed_predicates_8xi16(
14 ; CHECK-NEXT:  entry:
15 ; CHECK-NEXT:    [[L_0:%.*]] = load i16, i16* [[PTR:%.*]], align 2
16 ; CHECK-NEXT:    [[CMP_0:%.*]] = icmp ult i16 [[L_0]], 16383
17 ; CHECK-NEXT:    [[S_0:%.*]] = select i1 [[CMP_0]], i16 [[L_0]], i16 [[X:%.*]]
18 ; CHECK-NEXT:    store i16 [[S_0]], i16* [[PTR]], align 2
19 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 1
20 ; CHECK-NEXT:    [[L_1:%.*]] = load i16, i16* [[GEP_1]], align 2
21 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sgt i16 [[L_1]], 16383
22 ; CHECK-NEXT:    [[S_1:%.*]] = select i1 [[CMP_1]], i16 [[L_1]], i16 [[X]]
23 ; CHECK-NEXT:    store i16 [[S_1]], i16* [[GEP_1]], align 2
24 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 2
25 ; CHECK-NEXT:    [[L_2:%.*]] = load i16, i16* [[GEP_2]], align 2
26 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp eq i16 [[L_2]], 16383
27 ; CHECK-NEXT:    [[S_2:%.*]] = select i1 [[CMP_2]], i16 [[L_2]], i16 [[X]]
28 ; CHECK-NEXT:    store i16 [[S_2]], i16* [[GEP_2]], align 2
29 ; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 3
30 ; CHECK-NEXT:    [[L_3:%.*]] = load i16, i16* [[GEP_3]], align 2
31 ; CHECK-NEXT:    [[CMP_3:%.*]] = icmp ne i16 [[L_3]], 16383
32 ; CHECK-NEXT:    [[S_3:%.*]] = select i1 [[CMP_3]], i16 [[L_3]], i16 [[X]]
33 ; CHECK-NEXT:    store i16 [[S_3]], i16* [[GEP_3]], align 2
34 ; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 4
35 ; CHECK-NEXT:    [[L_4:%.*]] = load i16, i16* [[GEP_4]], align 2
36 ; CHECK-NEXT:    [[CMP_4:%.*]] = icmp eq i16 [[L_4]], 16383
37 ; CHECK-NEXT:    [[S_4:%.*]] = select i1 [[CMP_4]], i16 [[L_4]], i16 [[X]]
38 ; CHECK-NEXT:    store i16 [[S_4]], i16* [[GEP_4]], align 2
39 ; CHECK-NEXT:    [[GEP_5:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 5
40 ; CHECK-NEXT:    [[L_5:%.*]] = load i16, i16* [[GEP_5]], align 2
41 ; CHECK-NEXT:    [[CMP_5:%.*]] = icmp ule i16 [[L_5]], 16383
42 ; CHECK-NEXT:    [[S_5:%.*]] = select i1 [[CMP_5]], i16 [[L_5]], i16 [[X]]
43 ; CHECK-NEXT:    store i16 [[S_5]], i16* [[GEP_5]], align 2
44 ; CHECK-NEXT:    [[GEP_6:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 6
45 ; CHECK-NEXT:    [[L_6:%.*]] = load i16, i16* [[GEP_6]], align 2
46 ; CHECK-NEXT:    [[CMP_6:%.*]] = icmp ult i16 [[L_6]], 16383
47 ; CHECK-NEXT:    [[S_6:%.*]] = select i1 [[CMP_6]], i16 [[L_6]], i16 [[X]]
48 ; CHECK-NEXT:    store i16 [[S_6]], i16* [[GEP_6]], align 2
49 ; CHECK-NEXT:    [[GEP_7:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 7
50 ; CHECK-NEXT:    [[L_7:%.*]] = load i16, i16* [[GEP_7]], align 2
51 ; CHECK-NEXT:    [[CMP_7:%.*]] = icmp ult i16 [[L_7]], 16383
52 ; CHECK-NEXT:    [[S_7:%.*]] = select i1 [[CMP_7]], i16 [[L_7]], i16 [[X]]
53 ; CHECK-NEXT:    store i16 [[S_7]], i16* [[GEP_7]], align 2
54 ; CHECK-NEXT:    ret void
56 entry:
57   %l.0 = load i16, i16* %ptr
58   %cmp.0 = icmp ult i16 %l.0, 16383
59   %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x
60   store i16 %s.0, i16* %ptr, align 2
62   %gep.1 = getelementptr inbounds i16, i16* %ptr, i16 1
63   %l.1 = load i16, i16* %gep.1
64   %cmp.1 = icmp sgt i16 %l.1, 16383
65   %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x
66   store i16 %s.1, i16* %gep.1, align 2
68   %gep.2 = getelementptr inbounds i16, i16* %ptr, i16 2
69   %l.2 = load i16, i16* %gep.2
70   %cmp.2 = icmp eq i16 %l.2, 16383
71   %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x
72   store i16 %s.2, i16* %gep.2, align 2
74   %gep.3 = getelementptr inbounds i16, i16* %ptr, i16 3
75   %l.3 = load i16, i16* %gep.3
76   %cmp.3 = icmp ne i16 %l.3, 16383
77   %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x
78   store i16 %s.3, i16* %gep.3, align 2
80   %gep.4 = getelementptr inbounds i16, i16* %ptr, i16 4
81   %l.4 = load i16, i16* %gep.4
82   %cmp.4 = icmp eq i16 %l.4, 16383
83   %s.4 = select i1 %cmp.4, i16 %l.4, i16 %x
84   store i16 %s.4, i16* %gep.4, align 2
86   %gep.5 = getelementptr inbounds i16, i16* %ptr, i16 5
87   %l.5 = load i16, i16* %gep.5
88   %cmp.5 = icmp ule i16 %l.5, 16383
89   %s.5 = select i1 %cmp.5, i16 %l.5, i16 %x
90   store i16 %s.5, i16* %gep.5, align 2
92   %gep.6 = getelementptr inbounds i16, i16* %ptr, i16 6
93   %l.6 = load i16, i16* %gep.6
94   %cmp.6 = icmp ult i16 %l.6, 16383
95   %s.6 = select i1 %cmp.6, i16 %l.6, i16 %x
96   store i16 %s.6, i16* %gep.6, align 2
98   %gep.7 = getelementptr inbounds i16, i16* %ptr, i16 7
99   %l.7 = load i16, i16* %gep.7
100   %cmp.7 = icmp ult i16 %l.7, 16383
101   %s.7 = select i1 %cmp.7, i16 %l.7, i16 %x
102   store i16 %s.7, i16* %gep.7, align 2
103   ret void
106 define void @select_uniform_ugt_7xi8(i8* %ptr, i8 %x) {
107 ; CHECK-LABEL: @select_uniform_ugt_7xi8(
108 ; CHECK-NEXT:  entry:
109 ; CHECK-NEXT:    [[L_0:%.*]] = load i8, i8* [[PTR:%.*]], align 1
110 ; CHECK-NEXT:    [[CMP_0:%.*]] = icmp ugt i8 [[L_0]], -1
111 ; CHECK-NEXT:    [[S_0:%.*]] = select i1 [[CMP_0]], i8 [[L_0]], i8 [[X:%.*]]
112 ; CHECK-NEXT:    store i8 [[S_0]], i8* [[PTR]], align 2
113 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 1
114 ; CHECK-NEXT:    [[L_1:%.*]] = load i8, i8* [[GEP_1]], align 1
115 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp ugt i8 [[L_1]], -1
116 ; CHECK-NEXT:    [[S_1:%.*]] = select i1 [[CMP_1]], i8 [[L_1]], i8 [[X]]
117 ; CHECK-NEXT:    store i8 [[S_1]], i8* [[GEP_1]], align 2
118 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 2
119 ; CHECK-NEXT:    [[L_2:%.*]] = load i8, i8* [[GEP_2]], align 1
120 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp ugt i8 [[L_2]], -1
121 ; CHECK-NEXT:    [[S_2:%.*]] = select i1 [[CMP_2]], i8 [[L_2]], i8 [[X]]
122 ; CHECK-NEXT:    store i8 [[S_2]], i8* [[GEP_2]], align 2
123 ; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 3
124 ; CHECK-NEXT:    [[L_3:%.*]] = load i8, i8* [[GEP_3]], align 1
125 ; CHECK-NEXT:    [[CMP_3:%.*]] = icmp ugt i8 [[L_3]], -1
126 ; CHECK-NEXT:    [[S_3:%.*]] = select i1 [[CMP_3]], i8 [[L_3]], i8 [[X]]
127 ; CHECK-NEXT:    store i8 [[S_3]], i8* [[GEP_3]], align 2
128 ; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 4
129 ; CHECK-NEXT:    [[L_4:%.*]] = load i8, i8* [[GEP_4]], align 1
130 ; CHECK-NEXT:    [[CMP_4:%.*]] = icmp ugt i8 [[L_4]], -1
131 ; CHECK-NEXT:    [[S_4:%.*]] = select i1 [[CMP_4]], i8 [[L_4]], i8 [[X]]
132 ; CHECK-NEXT:    store i8 [[S_4]], i8* [[GEP_4]], align 2
133 ; CHECK-NEXT:    [[GEP_5:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 5
134 ; CHECK-NEXT:    [[L_5:%.*]] = load i8, i8* [[GEP_5]], align 1
135 ; CHECK-NEXT:    [[CMP_5:%.*]] = icmp ugt i8 [[L_5]], -1
136 ; CHECK-NEXT:    [[S_5:%.*]] = select i1 [[CMP_5]], i8 [[L_5]], i8 [[X]]
137 ; CHECK-NEXT:    store i8 [[S_5]], i8* [[GEP_5]], align 2
138 ; CHECK-NEXT:    [[GEP_6:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 6
139 ; CHECK-NEXT:    [[L_6:%.*]] = load i8, i8* [[GEP_6]], align 1
140 ; CHECK-NEXT:    [[CMP_6:%.*]] = icmp ugt i8 [[L_6]], -1
141 ; CHECK-NEXT:    [[S_6:%.*]] = select i1 [[CMP_6]], i8 [[L_6]], i8 [[X]]
142 ; CHECK-NEXT:    store i8 [[S_6]], i8* [[GEP_6]], align 2
143 ; CHECK-NEXT:    ret void
145 entry:
146   %l.0 = load i8, i8* %ptr
147   %cmp.0 = icmp ugt i8 %l.0, 16383
148   %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x
149   store i8 %s.0, i8* %ptr, align 2
151   %gep.1 = getelementptr inbounds i8, i8* %ptr, i8 1
152   %l.1 = load i8, i8* %gep.1
153   %cmp.1 = icmp ugt i8 %l.1, 16383
154   %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x
155   store i8 %s.1, i8* %gep.1, align 2
157   %gep.2 = getelementptr inbounds i8, i8* %ptr, i8 2
158   %l.2 = load i8, i8* %gep.2
159   %cmp.2 = icmp ugt i8 %l.2, 16383
160   %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x
161   store i8 %s.2, i8* %gep.2, align 2
163   %gep.3 = getelementptr inbounds i8, i8* %ptr, i8 3
164   %l.3 = load i8, i8* %gep.3
165   %cmp.3 = icmp ugt i8 %l.3, 16383
166   %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x
167   store i8 %s.3, i8* %gep.3, align 2
169   %gep.4 = getelementptr inbounds i8, i8* %ptr, i8 4
170   %l.4 = load i8, i8* %gep.4
171   %cmp.4 = icmp ugt i8 %l.4, 16383
172   %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x
173   store i8 %s.4, i8* %gep.4, align 2
175   %gep.5 = getelementptr inbounds i8, i8* %ptr, i8 5
176   %l.5 = load i8, i8* %gep.5
177   %cmp.5 = icmp ugt i8 %l.5, 16383
178   %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x
179   store i8 %s.5, i8* %gep.5, align 2
181   %gep.6 = getelementptr inbounds i8, i8* %ptr, i8 6
182   %l.6 = load i8, i8* %gep.6
183   %cmp.6 = icmp ugt i8 %l.6, 16383
184   %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x
185   store i8 %s.6, i8* %gep.6, align 2
187   ret void
191 ; Positive tests.
193 define void @select_uniform_ugt_8xi8(i8* %ptr, i8 %x) {
194 ; CHECK-LABEL: @select_uniform_ugt_8xi8(
195 ; CHECK-NEXT:  entry:
196 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i8 1
197 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 2
198 ; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 3
199 ; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 4
200 ; CHECK-NEXT:    [[GEP_5:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 5
201 ; CHECK-NEXT:    [[GEP_6:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 6
202 ; CHECK-NEXT:    [[GEP_7:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 7
203 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i8* [[PTR]] to <8 x i8>*
204 ; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, <8 x i8>* [[TMP0]], align 1
205 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt <8 x i8> [[TMP1]], <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
206 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <8 x i8> poison, i8 [[X:%.*]], i32 0
207 ; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <8 x i8> [[TMP3]], <8 x i8> poison, <8 x i32> zeroinitializer
208 ; CHECK-NEXT:    [[TMP4:%.*]] = select <8 x i1> [[TMP2]], <8 x i8> [[TMP1]], <8 x i8> [[SHUFFLE]]
209 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i8* [[PTR]] to <8 x i8>*
210 ; CHECK-NEXT:    store <8 x i8> [[TMP4]], <8 x i8>* [[TMP5]], align 2
211 ; CHECK-NEXT:    ret void
213 entry:
214   %l.0 = load i8, i8* %ptr
215   %cmp.0 = icmp ugt i8 %l.0, 16383
216   %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x
217   store i8 %s.0, i8* %ptr, align 2
219   %gep.1 = getelementptr inbounds i8, i8* %ptr, i8 1
220   %l.1 = load i8, i8* %gep.1
221   %cmp.1 = icmp ugt i8 %l.1, 16383
222   %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x
223   store i8 %s.1, i8* %gep.1, align 2
225   %gep.2 = getelementptr inbounds i8, i8* %ptr, i8 2
226   %l.2 = load i8, i8* %gep.2
227   %cmp.2 = icmp ugt i8 %l.2, 16383
228   %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x
229   store i8 %s.2, i8* %gep.2, align 2
231   %gep.3 = getelementptr inbounds i8, i8* %ptr, i8 3
232   %l.3 = load i8, i8* %gep.3
233   %cmp.3 = icmp ugt i8 %l.3, 16383
234   %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x
235   store i8 %s.3, i8* %gep.3, align 2
237   %gep.4 = getelementptr inbounds i8, i8* %ptr, i8 4
238   %l.4 = load i8, i8* %gep.4
239   %cmp.4 = icmp ugt i8 %l.4, 16383
240   %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x
241   store i8 %s.4, i8* %gep.4, align 2
243   %gep.5 = getelementptr inbounds i8, i8* %ptr, i8 5
244   %l.5 = load i8, i8* %gep.5
245   %cmp.5 = icmp ugt i8 %l.5, 16383
246   %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x
247   store i8 %s.5, i8* %gep.5, align 2
249   %gep.6 = getelementptr inbounds i8, i8* %ptr, i8 6
250   %l.6 = load i8, i8* %gep.6
251   %cmp.6 = icmp ugt i8 %l.6, 16383
252   %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x
253   store i8 %s.6, i8* %gep.6, align 2
255   %gep.7 = getelementptr inbounds i8, i8* %ptr, i8 7
256   %l.7 = load i8, i8* %gep.7
257   %cmp.7 = icmp ugt i8 %l.7, 16383
258   %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x
259   store i8 %s.7, i8* %gep.7, align 2
260   ret void
263 define void @select_uniform_ugt_16xi8(i8* %ptr, i8 %x) {
264 ; CHECK-LABEL: @select_uniform_ugt_16xi8(
265 ; CHECK-NEXT:  entry:
266 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i8 1
267 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 2
268 ; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 3
269 ; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 4
270 ; CHECK-NEXT:    [[GEP_5:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 5
271 ; CHECK-NEXT:    [[GEP_6:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 6
272 ; CHECK-NEXT:    [[GEP_7:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 7
273 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i8* [[PTR]] to <8 x i8>*
274 ; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, <8 x i8>* [[TMP0]], align 1
275 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt <8 x i8> [[TMP1]], <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
276 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <8 x i8> poison, i8 [[X:%.*]], i32 0
277 ; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <8 x i8> [[TMP3]], <8 x i8> poison, <8 x i32> zeroinitializer
278 ; CHECK-NEXT:    [[TMP4:%.*]] = select <8 x i1> [[TMP2]], <8 x i8> [[TMP1]], <8 x i8> [[SHUFFLE]]
279 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i8* [[PTR]] to <8 x i8>*
280 ; CHECK-NEXT:    store <8 x i8> [[TMP4]], <8 x i8>* [[TMP5]], align 2
281 ; CHECK-NEXT:    [[GEP_8:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 8
282 ; CHECK-NEXT:    [[L_8:%.*]] = load i8, i8* [[GEP_8]], align 1
283 ; CHECK-NEXT:    [[CMP_8:%.*]] = icmp ugt i8 [[L_8]], -1
284 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x i8> [[TMP1]], i32 0
285 ; CHECK-NEXT:    [[S_8:%.*]] = select i1 [[CMP_8]], i8 [[TMP6]], i8 [[X]]
286 ; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x i8> [[TMP4]], i32 0
287 ; CHECK-NEXT:    store i8 [[TMP7]], i8* [[GEP_8]], align 2
288 ; CHECK-NEXT:    [[GEP_9:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 9
289 ; CHECK-NEXT:    [[L_9:%.*]] = load i8, i8* [[GEP_9]], align 1
290 ; CHECK-NEXT:    [[CMP_9:%.*]] = icmp ugt i8 [[L_9]], -1
291 ; CHECK-NEXT:    [[S_9:%.*]] = select i1 [[CMP_9]], i8 [[L_9]], i8 [[X]]
292 ; CHECK-NEXT:    store i8 [[S_9]], i8* [[GEP_9]], align 2
293 ; CHECK-NEXT:    [[GEP_10:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 10
294 ; CHECK-NEXT:    [[L_10:%.*]] = load i8, i8* [[GEP_10]], align 1
295 ; CHECK-NEXT:    [[CMP_10:%.*]] = icmp ugt i8 [[L_10]], -1
296 ; CHECK-NEXT:    [[S_10:%.*]] = select i1 [[CMP_10]], i8 [[L_10]], i8 [[X]]
297 ; CHECK-NEXT:    store i8 [[S_10]], i8* [[GEP_10]], align 2
298 ; CHECK-NEXT:    [[GEP_11:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 11
299 ; CHECK-NEXT:    [[L_11:%.*]] = load i8, i8* [[GEP_11]], align 1
300 ; CHECK-NEXT:    [[CMP_11:%.*]] = icmp ugt i8 [[L_11]], -1
301 ; CHECK-NEXT:    [[S_11:%.*]] = select i1 [[CMP_11]], i8 [[L_11]], i8 [[X]]
302 ; CHECK-NEXT:    store i8 [[S_11]], i8* [[GEP_11]], align 2
303 ; CHECK-NEXT:    [[GEP_12:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 12
304 ; CHECK-NEXT:    [[L_12:%.*]] = load i8, i8* [[GEP_12]], align 1
305 ; CHECK-NEXT:    [[CMP_12:%.*]] = icmp ugt i8 [[L_12]], -1
306 ; CHECK-NEXT:    [[S_12:%.*]] = select i1 [[CMP_12]], i8 [[L_12]], i8 [[X]]
307 ; CHECK-NEXT:    store i8 [[S_12]], i8* [[GEP_12]], align 2
308 ; CHECK-NEXT:    [[GEP_13:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 13
309 ; CHECK-NEXT:    [[L_13:%.*]] = load i8, i8* [[GEP_13]], align 1
310 ; CHECK-NEXT:    [[CMP_13:%.*]] = icmp ugt i8 [[L_13]], -1
311 ; CHECK-NEXT:    [[S_13:%.*]] = select i1 [[CMP_13]], i8 [[L_13]], i8 [[X]]
312 ; CHECK-NEXT:    store i8 [[S_13]], i8* [[GEP_13]], align 2
313 ; CHECK-NEXT:    [[GEP_14:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 14
314 ; CHECK-NEXT:    [[L_14:%.*]] = load i8, i8* [[GEP_14]], align 1
315 ; CHECK-NEXT:    [[CMP_14:%.*]] = icmp ugt i8 [[L_14]], -1
316 ; CHECK-NEXT:    [[S_14:%.*]] = select i1 [[CMP_14]], i8 [[L_14]], i8 [[X]]
317 ; CHECK-NEXT:    store i8 [[S_14]], i8* [[GEP_14]], align 2
318 ; CHECK-NEXT:    [[GEP_15:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i8 15
319 ; CHECK-NEXT:    [[L_15:%.*]] = load i8, i8* [[GEP_15]], align 1
320 ; CHECK-NEXT:    [[CMP_15:%.*]] = icmp ugt i8 [[L_15]], -1
321 ; CHECK-NEXT:    [[S_15:%.*]] = select i1 [[CMP_15]], i8 [[L_15]], i8 [[X]]
322 ; CHECK-NEXT:    store i8 [[S_15]], i8* [[GEP_15]], align 2
323 ; CHECK-NEXT:    ret void
325 entry:
326   %l.0 = load i8, i8* %ptr
327   %cmp.0 = icmp ugt i8 %l.0, 16383
328   %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x
329   store i8 %s.0, i8* %ptr, align 2
331   %gep.1 = getelementptr inbounds i8, i8* %ptr, i8 1
332   %l.1 = load i8, i8* %gep.1
333   %cmp.1 = icmp ugt i8 %l.1, 16383
334   %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x
335   store i8 %s.1, i8* %gep.1, align 2
337   %gep.2 = getelementptr inbounds i8, i8* %ptr, i8 2
338   %l.2 = load i8, i8* %gep.2
339   %cmp.2 = icmp ugt i8 %l.2, 16383
340   %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x
341   store i8 %s.2, i8* %gep.2, align 2
343   %gep.3 = getelementptr inbounds i8, i8* %ptr, i8 3
344   %l.3 = load i8, i8* %gep.3
345   %cmp.3 = icmp ugt i8 %l.3, 16383
346   %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x
347   store i8 %s.3, i8* %gep.3, align 2
349   %gep.4 = getelementptr inbounds i8, i8* %ptr, i8 4
350   %l.4 = load i8, i8* %gep.4
351   %cmp.4 = icmp ugt i8 %l.4, 16383
352   %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x
353   store i8 %s.4, i8* %gep.4, align 2
355   %gep.5 = getelementptr inbounds i8, i8* %ptr, i8 5
356   %l.5 = load i8, i8* %gep.5
357   %cmp.5 = icmp ugt i8 %l.5, 16383
358   %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x
359   store i8 %s.5, i8* %gep.5, align 2
361   %gep.6 = getelementptr inbounds i8, i8* %ptr, i8 6
362   %l.6 = load i8, i8* %gep.6
363   %cmp.6 = icmp ugt i8 %l.6, 16383
364   %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x
365   store i8 %s.6, i8* %gep.6, align 2
367   %gep.7 = getelementptr inbounds i8, i8* %ptr, i8 7
368   %l.7 = load i8, i8* %gep.7
369   %cmp.7 = icmp ugt i8 %l.7, 16383
370   %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x
371   store i8 %s.7, i8* %gep.7, align 2
373   %gep.8 = getelementptr inbounds i8, i8* %ptr, i8 8
374   %l.8 = load i8, i8* %gep.8
375   %cmp.8 = icmp ugt i8 %l.8, 16383
376   %s.8 = select i1 %cmp.8, i8 %l.0, i8 %x
377   store i8 %s.0, i8* %gep.8, align 2
379   %gep.9 = getelementptr inbounds i8, i8* %ptr, i8 9
380   %l.9 = load i8, i8* %gep.9
381   %cmp.9 = icmp ugt i8 %l.9, 16383
382   %s.9 = select i1 %cmp.9, i8 %l.9, i8 %x
383   store i8 %s.9, i8* %gep.9, align 2
385   %gep.10 = getelementptr inbounds i8, i8* %ptr, i8 10
386   %l.10 = load i8, i8* %gep.10
387   %cmp.10 = icmp ugt i8 %l.10, 16383
388   %s.10 = select i1 %cmp.10, i8 %l.10, i8 %x
389   store i8 %s.10, i8* %gep.10, align 2
391   %gep.11 = getelementptr inbounds i8, i8* %ptr, i8 11
392   %l.11 = load i8, i8* %gep.11
393   %cmp.11 = icmp ugt i8 %l.11, 16383
394   %s.11 = select i1 %cmp.11, i8 %l.11, i8 %x
395   store i8 %s.11, i8* %gep.11, align 2
397   %gep.12 = getelementptr inbounds i8, i8* %ptr, i8 12
398   %l.12 = load i8, i8* %gep.12
399   %cmp.12 = icmp ugt i8 %l.12, 16383
400   %s.12 = select i1 %cmp.12, i8 %l.12, i8 %x
401   store i8 %s.12, i8* %gep.12, align 2
403   %gep.13 = getelementptr inbounds i8, i8* %ptr, i8 13
404   %l.13 = load i8, i8* %gep.13
405   %cmp.13 = icmp ugt i8 %l.13, 16383
406   %s.13 = select i1 %cmp.13, i8 %l.13, i8 %x
407   store i8 %s.13, i8* %gep.13, align 2
409   %gep.14 = getelementptr inbounds i8, i8* %ptr, i8 14
410   %l.14 = load i8, i8* %gep.14
411   %cmp.14 = icmp ugt i8 %l.14, 16383
412   %s.14 = select i1 %cmp.14, i8 %l.14, i8 %x
413   store i8 %s.14, i8* %gep.14, align 2
415   %gep.15 = getelementptr inbounds i8, i8* %ptr, i8 15
416   %l.15 = load i8, i8* %gep.15
417   %cmp.15 = icmp ugt i8 %l.15, 16383
418   %s.15 = select i1 %cmp.15, i8 %l.15, i8 %x
419   store i8 %s.15, i8* %gep.15, align 2
421   ret void
425 define void @select_uniform_ugt_4xi16(i16* %ptr, i16 %x) {
426 ; CHECK-LABEL: @select_uniform_ugt_4xi16(
427 ; CHECK-NEXT:  entry:
428 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i16, i16* [[PTR:%.*]], i16 1
429 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 2
430 ; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 3
431 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i16* [[PTR]] to <4 x i16>*
432 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i16>, <4 x i16>* [[TMP0]], align 2
433 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt <4 x i16> [[TMP1]], <i16 16383, i16 16383, i16 16383, i16 16383>
434 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i16> poison, i16 [[X:%.*]], i32 0
435 ; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x i16> [[TMP3]], <4 x i16> poison, <4 x i32> zeroinitializer
436 ; CHECK-NEXT:    [[TMP4:%.*]] = select <4 x i1> [[TMP2]], <4 x i16> [[TMP1]], <4 x i16> [[SHUFFLE]]
437 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i16* [[PTR]] to <4 x i16>*
438 ; CHECK-NEXT:    store <4 x i16> [[TMP4]], <4 x i16>* [[TMP5]], align 2
439 ; CHECK-NEXT:    ret void
441 entry:
442   %l.0 = load i16, i16* %ptr
443   %cmp.0 = icmp ugt i16 %l.0, 16383
444   %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x
445   store i16 %s.0, i16* %ptr, align 2
447   %gep.1 = getelementptr inbounds i16, i16* %ptr, i16 1
448   %l.1 = load i16, i16* %gep.1
449   %cmp.1 = icmp ugt i16 %l.1, 16383
450   %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x
451   store i16 %s.1, i16* %gep.1, align 2
453   %gep.2 = getelementptr inbounds i16, i16* %ptr, i16 2
454   %l.2 = load i16, i16* %gep.2
455   %cmp.2 = icmp ugt i16 %l.2, 16383
456   %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x
457   store i16 %s.2, i16* %gep.2, align 2
459   %gep.3 = getelementptr inbounds i16, i16* %ptr, i16 3
460   %l.3 = load i16, i16* %gep.3
461   %cmp.3 = icmp ugt i16 %l.3, 16383
462   %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x
463   store i16 %s.3, i16* %gep.3, align 2
465   ret void
468 define void @select_uniform_ult_8xi16(i16* %ptr, i16 %x) {
469 ; CHECK-LABEL: @select_uniform_ult_8xi16(
470 ; CHECK-NEXT:  entry:
471 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i16, i16* [[PTR:%.*]], i16 1
472 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 2
473 ; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 3
474 ; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 4
475 ; CHECK-NEXT:    [[GEP_5:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 5
476 ; CHECK-NEXT:    [[GEP_6:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 6
477 ; CHECK-NEXT:    [[GEP_7:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i16 7
478 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i16* [[PTR]] to <8 x i16>*
479 ; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, <8 x i16>* [[TMP0]], align 2
480 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult <8 x i16> [[TMP1]], <i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383>
481 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <8 x i16> poison, i16 [[X:%.*]], i32 0
482 ; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <8 x i16> [[TMP3]], <8 x i16> poison, <8 x i32> zeroinitializer
483 ; CHECK-NEXT:    [[TMP4:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> [[SHUFFLE]]
484 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i16* [[PTR]] to <8 x i16>*
485 ; CHECK-NEXT:    store <8 x i16> [[TMP4]], <8 x i16>* [[TMP5]], align 2
486 ; CHECK-NEXT:    ret void
488 entry:
489   %l.0 = load i16, i16* %ptr
490   %cmp.0 = icmp ult i16 %l.0, 16383
491   %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x
492   store i16 %s.0, i16* %ptr, align 2
494   %gep.1 = getelementptr inbounds i16, i16* %ptr, i16 1
495   %l.1 = load i16, i16* %gep.1
496   %cmp.1 = icmp ult i16 %l.1, 16383
497   %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x
498   store i16 %s.1, i16* %gep.1, align 2
500   %gep.2 = getelementptr inbounds i16, i16* %ptr, i16 2
501   %l.2 = load i16, i16* %gep.2
502   %cmp.2 = icmp ult i16 %l.2, 16383
503   %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x
504   store i16 %s.2, i16* %gep.2, align 2
506   %gep.3 = getelementptr inbounds i16, i16* %ptr, i16 3
507   %l.3 = load i16, i16* %gep.3
508   %cmp.3 = icmp ult i16 %l.3, 16383
509   %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x
510   store i16 %s.3, i16* %gep.3, align 2
512   %gep.4 = getelementptr inbounds i16, i16* %ptr, i16 4
513   %l.4 = load i16, i16* %gep.4
514   %cmp.4 = icmp ult i16 %l.4, 16383
515   %s.4 = select i1 %cmp.4, i16 %l.4, i16 %x
516   store i16 %s.4, i16* %gep.4, align 2
518   %gep.5 = getelementptr inbounds i16, i16* %ptr, i16 5
519   %l.5 = load i16, i16* %gep.5
520   %cmp.5 = icmp ult i16 %l.5, 16383
521   %s.5 = select i1 %cmp.5, i16 %l.5, i16 %x
522   store i16 %s.5, i16* %gep.5, align 2
524   %gep.6 = getelementptr inbounds i16, i16* %ptr, i16 6
525   %l.6 = load i16, i16* %gep.6
526   %cmp.6 = icmp ult i16 %l.6, 16383
527   %s.6 = select i1 %cmp.6, i16 %l.6, i16 %x
528   store i16 %s.6, i16* %gep.6, align 2
530   %gep.7 = getelementptr inbounds i16, i16* %ptr, i16 7
531   %l.7 = load i16, i16* %gep.7
532   %cmp.7 = icmp ult i16 %l.7, 16383
533   %s.7 = select i1 %cmp.7, i16 %l.7, i16 %x
534   store i16 %s.7, i16* %gep.7, align 2
535   ret void
538 define void @select_uniform_eq_2xi32(i32* %ptr, i32 %x) {
539 ; CHECK-LABEL: @select_uniform_eq_2xi32(
540 ; CHECK-NEXT:  entry:
541 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, i32* [[PTR:%.*]], i32 1
542 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[PTR]] to <2 x i32>*
543 ; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i32>, <2 x i32>* [[TMP0]], align 4
544 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <2 x i32> [[TMP1]], <i32 16383, i32 16383>
545 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i32 0
546 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x i32> [[TMP3]], i32 [[X]], i32 1
547 ; CHECK-NEXT:    [[TMP5:%.*]] = select <2 x i1> [[TMP2]], <2 x i32> [[TMP1]], <2 x i32> [[TMP4]]
548 ; CHECK-NEXT:    [[TMP6:%.*]] = bitcast i32* [[PTR]] to <2 x i32>*
549 ; CHECK-NEXT:    store <2 x i32> [[TMP5]], <2 x i32>* [[TMP6]], align 2
550 ; CHECK-NEXT:    ret void
552 entry:
553   %l.0 = load i32, i32* %ptr
554   %cmp.0 = icmp eq i32 %l.0, 16383
555   %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x
556   store i32 %s.0, i32* %ptr, align 2
558   %gep.1 = getelementptr inbounds i32, i32* %ptr, i32 1
559   %l.1 = load i32, i32* %gep.1
560   %cmp.1 = icmp eq i32 %l.1, 16383
561   %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x
562   store i32 %s.1, i32* %gep.1, align 2
564   ret void
567 define void @select_uniform_eq_4xi32(i32* %ptr, i32 %x) {
568 ; CHECK-LABEL: @select_uniform_eq_4xi32(
569 ; CHECK-NEXT:  entry:
570 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, i32* [[PTR:%.*]], i32 1
571 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i32, i32* [[PTR]], i32 2
572 ; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i32, i32* [[PTR]], i32 3
573 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[PTR]] to <4 x i32>*
574 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP0]], align 4
575 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <4 x i32> [[TMP1]], <i32 16383, i32 16383, i32 16383, i32 16383>
576 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i32> poison, i32 [[X:%.*]], i32 0
577 ; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <4 x i32> zeroinitializer
578 ; CHECK-NEXT:    [[TMP4:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> [[SHUFFLE]]
579 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i32* [[PTR]] to <4 x i32>*
580 ; CHECK-NEXT:    store <4 x i32> [[TMP4]], <4 x i32>* [[TMP5]], align 2
581 ; CHECK-NEXT:    ret void
583 entry:
584   %l.0 = load i32, i32* %ptr
585   %cmp.0 = icmp eq i32 %l.0, 16383
586   %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x
587   store i32 %s.0, i32* %ptr, align 2
589   %gep.1 = getelementptr inbounds i32, i32* %ptr, i32 1
590   %l.1 = load i32, i32* %gep.1
591   %cmp.1 = icmp eq i32 %l.1, 16383
592   %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x
593   store i32 %s.1, i32* %gep.1, align 2
595   %gep.2 = getelementptr inbounds i32, i32* %ptr, i32 2
596   %l.2 = load i32, i32* %gep.2
597   %cmp.2 = icmp eq i32 %l.2, 16383
598   %s.2 = select i1 %cmp.2, i32 %l.2, i32 %x
599   store i32 %s.2, i32* %gep.2, align 2
601   %gep.3 = getelementptr inbounds i32, i32* %ptr, i32 3
602   %l.3 = load i32, i32* %gep.3
603   %cmp.3 = icmp eq i32 %l.3, 16383
604   %s.3 = select i1 %cmp.3, i32 %l.3, i32 %x
605   store i32 %s.3, i32* %gep.3, align 2
606   ret void
609 define void @select_uniform_ne_2xi64(i64* %ptr, i64 %x) {
610 ; CHECK-LABEL: @select_uniform_ne_2xi64(
611 ; CHECK-NEXT:  entry:
612 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i64, i64* [[PTR:%.*]], i64 1
613 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i64* [[PTR]] to <2 x i64>*
614 ; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, <2 x i64>* [[TMP0]], align 8
615 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne <2 x i64> [[TMP1]], <i64 16383, i64 16383>
616 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[X:%.*]], i32 0
617 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[X]], i32 1
618 ; CHECK-NEXT:    [[TMP5:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> [[TMP4]]
619 ; CHECK-NEXT:    [[TMP6:%.*]] = bitcast i64* [[PTR]] to <2 x i64>*
620 ; CHECK-NEXT:    store <2 x i64> [[TMP5]], <2 x i64>* [[TMP6]], align 2
621 ; CHECK-NEXT:    ret void
623 entry:
624   %l.0 = load i64, i64* %ptr
625   %cmp.0 = icmp ne i64 %l.0, 16383
626   %s.0 = select i1 %cmp.0, i64 %l.0, i64 %x
627   store i64 %s.0, i64* %ptr, align 2
629   %gep.1 = getelementptr inbounds i64, i64* %ptr, i64 1
630   %l.1 = load i64, i64* %gep.1
631   %cmp.1 = icmp ne i64 %l.1, 16383
632   %s.1 = select i1 %cmp.1, i64 %l.1, i64 %x
633   store i64 %s.1, i64* %gep.1, align 2
635   ret void