xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/AArch64/vectorizable-selects-uniform-cmps.ll (revision af524de1fa94e4b4cee8b745d1b68f4ea0090759)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=slp-vectorizer -S %s | FileCheck %s
3; RUN: opt -aa-pipeline=basic-aa -passes='slp-vectorizer' -S %s | FileCheck %s
4
5target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6target triple = "arm64-apple-ios5.0.0"
7
8; Some negative tests first.
9
10; We need selects with a uniform predicate to lower effectively to vector
11; instructions.
12define void @select_mixed_predicates_8xi16(ptr %ptr, i16 %x) {
13; CHECK-LABEL: @select_mixed_predicates_8xi16(
14; CHECK-NEXT:  entry:
15; CHECK-NEXT:    [[L_0:%.*]] = load i16, ptr [[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]], ptr [[PTR]], align 2
19; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 1
20; CHECK-NEXT:    [[L_1:%.*]] = load i16, ptr [[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]], ptr [[GEP_1]], align 2
24; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 2
25; CHECK-NEXT:    [[L_2:%.*]] = load i16, ptr [[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]], ptr [[GEP_2]], align 2
29; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 3
30; CHECK-NEXT:    [[L_3:%.*]] = load i16, ptr [[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]], ptr [[GEP_3]], align 2
34; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 4
35; CHECK-NEXT:    [[L_4:%.*]] = load i16, ptr [[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]], ptr [[GEP_4]], align 2
39; CHECK-NEXT:    [[GEP_5:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 5
40; CHECK-NEXT:    [[L_5:%.*]] = load i16, ptr [[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]], ptr [[GEP_5]], align 2
44; CHECK-NEXT:    [[GEP_6:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 6
45; CHECK-NEXT:    [[L_6:%.*]] = load i16, ptr [[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]], ptr [[GEP_6]], align 2
49; CHECK-NEXT:    [[GEP_7:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 7
50; CHECK-NEXT:    [[L_7:%.*]] = load i16, ptr [[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]], ptr [[GEP_7]], align 2
54; CHECK-NEXT:    ret void
55;
56entry:
57  %l.0 = load i16, ptr %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, ptr %ptr, align 2
61
62  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1
63  %l.1 = load i16, ptr %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, ptr %gep.1, align 2
67
68  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2
69  %l.2 = load i16, ptr %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, ptr %gep.2, align 2
73
74  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3
75  %l.3 = load i16, ptr %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, ptr %gep.3, align 2
79
80  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4
81  %l.4 = load i16, ptr %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, ptr %gep.4, align 2
85
86  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5
87  %l.5 = load i16, ptr %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, ptr %gep.5, align 2
91
92  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6
93  %l.6 = load i16, ptr %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, ptr %gep.6, align 2
97
98  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7
99  %l.7 = load i16, ptr %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, ptr %gep.7, align 2
103  ret void
104}
105
106define void @select_uniform_ugt_7xi8(ptr %ptr, i8 %x) {
107; CHECK-LABEL: @select_uniform_ugt_7xi8(
108; CHECK-NEXT:  entry:
109; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr [[PTR:%.*]], align 1
110; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt <4 x i8> [[TMP0]], splat (i8 -1)
111; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i8> poison, i8 [[X:%.*]], i32 0
112; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <4 x i32> zeroinitializer
113; CHECK-NEXT:    [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i8> [[TMP0]], <4 x i8> [[TMP3]]
114; CHECK-NEXT:    store <4 x i8> [[TMP4]], ptr [[PTR]], align 2
115; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 4
116; CHECK-NEXT:    [[L_4:%.*]] = load i8, ptr [[GEP_4]], align 1
117; CHECK-NEXT:    [[CMP_4:%.*]] = icmp ugt i8 [[L_4]], -1
118; CHECK-NEXT:    [[S_4:%.*]] = select i1 [[CMP_4]], i8 [[L_4]], i8 [[X]]
119; CHECK-NEXT:    store i8 [[S_4]], ptr [[GEP_4]], align 2
120; CHECK-NEXT:    [[GEP_5:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 5
121; CHECK-NEXT:    [[L_5:%.*]] = load i8, ptr [[GEP_5]], align 1
122; CHECK-NEXT:    [[CMP_5:%.*]] = icmp ugt i8 [[L_5]], -1
123; CHECK-NEXT:    [[S_5:%.*]] = select i1 [[CMP_5]], i8 [[L_5]], i8 [[X]]
124; CHECK-NEXT:    store i8 [[S_5]], ptr [[GEP_5]], align 2
125; CHECK-NEXT:    [[GEP_6:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 6
126; CHECK-NEXT:    [[L_6:%.*]] = load i8, ptr [[GEP_6]], align 1
127; CHECK-NEXT:    [[CMP_6:%.*]] = icmp ugt i8 [[L_6]], -1
128; CHECK-NEXT:    [[S_6:%.*]] = select i1 [[CMP_6]], i8 [[L_6]], i8 [[X]]
129; CHECK-NEXT:    store i8 [[S_6]], ptr [[GEP_6]], align 2
130; CHECK-NEXT:    ret void
131;
132entry:
133  %l.0 = load i8, ptr %ptr
134  %cmp.0 = icmp ugt i8 %l.0, 16383
135  %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x
136  store i8 %s.0, ptr %ptr, align 2
137
138  %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1
139  %l.1 = load i8, ptr %gep.1
140  %cmp.1 = icmp ugt i8 %l.1, 16383
141  %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x
142  store i8 %s.1, ptr %gep.1, align 2
143
144  %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2
145  %l.2 = load i8, ptr %gep.2
146  %cmp.2 = icmp ugt i8 %l.2, 16383
147  %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x
148  store i8 %s.2, ptr %gep.2, align 2
149
150  %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3
151  %l.3 = load i8, ptr %gep.3
152  %cmp.3 = icmp ugt i8 %l.3, 16383
153  %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x
154  store i8 %s.3, ptr %gep.3, align 2
155
156  %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4
157  %l.4 = load i8, ptr %gep.4
158  %cmp.4 = icmp ugt i8 %l.4, 16383
159  %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x
160  store i8 %s.4, ptr %gep.4, align 2
161
162  %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5
163  %l.5 = load i8, ptr %gep.5
164  %cmp.5 = icmp ugt i8 %l.5, 16383
165  %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x
166  store i8 %s.5, ptr %gep.5, align 2
167
168  %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6
169  %l.6 = load i8, ptr %gep.6
170  %cmp.6 = icmp ugt i8 %l.6, 16383
171  %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x
172  store i8 %s.6, ptr %gep.6, align 2
173
174  ret void
175}
176
177
178; Positive tests.
179
180define void @select_uniform_ugt_8xi8(ptr %ptr, i8 %x) {
181; CHECK-LABEL: @select_uniform_ugt_8xi8(
182; CHECK-NEXT:  entry:
183; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[PTR:%.*]], align 1
184; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt <8 x i8> [[TMP0]], splat (i8 -1)
185; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <8 x i8> poison, i8 [[X:%.*]], i32 0
186; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <8 x i32> zeroinitializer
187; CHECK-NEXT:    [[TMP4:%.*]] = select <8 x i1> [[TMP1]], <8 x i8> [[TMP0]], <8 x i8> [[TMP3]]
188; CHECK-NEXT:    store <8 x i8> [[TMP4]], ptr [[PTR]], align 2
189; CHECK-NEXT:    ret void
190;
191entry:
192  %l.0 = load i8, ptr %ptr
193  %cmp.0 = icmp ugt i8 %l.0, 16383
194  %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x
195  store i8 %s.0, ptr %ptr, align 2
196
197  %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1
198  %l.1 = load i8, ptr %gep.1
199  %cmp.1 = icmp ugt i8 %l.1, 16383
200  %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x
201  store i8 %s.1, ptr %gep.1, align 2
202
203  %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2
204  %l.2 = load i8, ptr %gep.2
205  %cmp.2 = icmp ugt i8 %l.2, 16383
206  %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x
207  store i8 %s.2, ptr %gep.2, align 2
208
209  %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3
210  %l.3 = load i8, ptr %gep.3
211  %cmp.3 = icmp ugt i8 %l.3, 16383
212  %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x
213  store i8 %s.3, ptr %gep.3, align 2
214
215  %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4
216  %l.4 = load i8, ptr %gep.4
217  %cmp.4 = icmp ugt i8 %l.4, 16383
218  %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x
219  store i8 %s.4, ptr %gep.4, align 2
220
221  %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5
222  %l.5 = load i8, ptr %gep.5
223  %cmp.5 = icmp ugt i8 %l.5, 16383
224  %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x
225  store i8 %s.5, ptr %gep.5, align 2
226
227  %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6
228  %l.6 = load i8, ptr %gep.6
229  %cmp.6 = icmp ugt i8 %l.6, 16383
230  %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x
231  store i8 %s.6, ptr %gep.6, align 2
232
233  %gep.7 = getelementptr inbounds i8, ptr %ptr, i8 7
234  %l.7 = load i8, ptr %gep.7
235  %cmp.7 = icmp ugt i8 %l.7, 16383
236  %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x
237  store i8 %s.7, ptr %gep.7, align 2
238  ret void
239}
240
241define void @select_uniform_ugt_16xi8(ptr %ptr, i8 %x) {
242; CHECK-LABEL: @select_uniform_ugt_16xi8(
243; CHECK-NEXT:  entry:
244; CHECK-NEXT:    [[GEP_8:%.*]] = getelementptr inbounds i8, ptr [[PTR:%.*]], i8 8
245; CHECK-NEXT:    [[L_8:%.*]] = load i8, ptr [[GEP_8]], align 1
246; CHECK-NEXT:    [[CMP_8:%.*]] = icmp ugt i8 [[L_8]], -1
247; CHECK-NEXT:    [[GEP_9:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 9
248; CHECK-NEXT:    [[GEP_11:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 11
249; CHECK-NEXT:    [[L_11:%.*]] = load i8, ptr [[GEP_11]], align 1
250; CHECK-NEXT:    [[GEP_12:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 12
251; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[PTR]], align 1
252; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <8 x i8> [[TMP0]], i32 0
253; CHECK-NEXT:    [[S_8:%.*]] = select i1 [[CMP_8]], i8 [[TMP1]], i8 [[X:%.*]]
254; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x i8>, ptr [[GEP_9]], align 1
255; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i8>, ptr [[GEP_12]], align 1
256; CHECK-NEXT:    [[TMP4:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
257; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <8 x i8> [[TMP0]], <8 x i8> [[TMP4]], <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 8, i32 9, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
258; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <16 x i8> [[TMP5]], i8 [[L_11]], i32 11
259; CHECK-NEXT:    [[TMP7:%.*]] = call <16 x i8> @llvm.vector.insert.v16i8.v8i8(<16 x i8> [[TMP6]], <8 x i8> [[TMP0]], i64 0)
260; CHECK-NEXT:    [[TMP8:%.*]] = call <16 x i8> @llvm.vector.insert.v16i8.v4i8(<16 x i8> [[TMP7]], <4 x i8> [[TMP3]], i64 12)
261; CHECK-NEXT:    [[TMP9:%.*]] = icmp ugt <16 x i8> [[TMP8]], splat (i8 -1)
262; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <16 x i8> poison, i8 [[X]], i32 0
263; CHECK-NEXT:    [[TMP13:%.*]] = shufflevector <16 x i8> [[TMP12]], <16 x i8> poison, <16 x i32> zeroinitializer
264; CHECK-NEXT:    [[TMP14:%.*]] = select <16 x i1> [[TMP9]], <16 x i8> [[TMP8]], <16 x i8> [[TMP13]]
265; CHECK-NEXT:    store <16 x i8> [[TMP14]], ptr [[PTR]], align 2
266; CHECK-NEXT:    ret void
267;
268entry:
269  %l.0 = load i8, ptr %ptr
270  %cmp.0 = icmp ugt i8 %l.0, 16383
271  %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x
272  store i8 %s.0, ptr %ptr, align 2
273
274  %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1
275  %l.1 = load i8, ptr %gep.1
276  %cmp.1 = icmp ugt i8 %l.1, 16383
277  %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x
278  store i8 %s.1, ptr %gep.1, align 2
279
280  %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2
281  %l.2 = load i8, ptr %gep.2
282  %cmp.2 = icmp ugt i8 %l.2, 16383
283  %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x
284  store i8 %s.2, ptr %gep.2, align 2
285
286  %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3
287  %l.3 = load i8, ptr %gep.3
288  %cmp.3 = icmp ugt i8 %l.3, 16383
289  %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x
290  store i8 %s.3, ptr %gep.3, align 2
291
292  %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4
293  %l.4 = load i8, ptr %gep.4
294  %cmp.4 = icmp ugt i8 %l.4, 16383
295  %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x
296  store i8 %s.4, ptr %gep.4, align 2
297
298  %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5
299  %l.5 = load i8, ptr %gep.5
300  %cmp.5 = icmp ugt i8 %l.5, 16383
301  %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x
302  store i8 %s.5, ptr %gep.5, align 2
303
304  %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6
305  %l.6 = load i8, ptr %gep.6
306  %cmp.6 = icmp ugt i8 %l.6, 16383
307  %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x
308  store i8 %s.6, ptr %gep.6, align 2
309
310  %gep.7 = getelementptr inbounds i8, ptr %ptr, i8 7
311  %l.7 = load i8, ptr %gep.7
312  %cmp.7 = icmp ugt i8 %l.7, 16383
313  %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x
314  store i8 %s.7, ptr %gep.7, align 2
315
316  %gep.8 = getelementptr inbounds i8, ptr %ptr, i8 8
317  %l.8 = load i8, ptr %gep.8
318  %cmp.8 = icmp ugt i8 %l.8, 16383
319  %s.8 = select i1 %cmp.8, i8 %l.0, i8 %x
320  store i8 %s.0, ptr %gep.8, align 2
321
322  %gep.9 = getelementptr inbounds i8, ptr %ptr, i8 9
323  %l.9 = load i8, ptr %gep.9
324  %cmp.9 = icmp ugt i8 %l.9, 16383
325  %s.9 = select i1 %cmp.9, i8 %l.9, i8 %x
326  store i8 %s.9, ptr %gep.9, align 2
327
328  %gep.10 = getelementptr inbounds i8, ptr %ptr, i8 10
329  %l.10 = load i8, ptr %gep.10
330  %cmp.10 = icmp ugt i8 %l.10, 16383
331  %s.10 = select i1 %cmp.10, i8 %l.10, i8 %x
332  store i8 %s.10, ptr %gep.10, align 2
333
334  %gep.11 = getelementptr inbounds i8, ptr %ptr, i8 11
335  %l.11 = load i8, ptr %gep.11
336  %cmp.11 = icmp ugt i8 %l.11, 16383
337  %s.11 = select i1 %cmp.11, i8 %l.11, i8 %x
338  store i8 %s.11, ptr %gep.11, align 2
339
340  %gep.12 = getelementptr inbounds i8, ptr %ptr, i8 12
341  %l.12 = load i8, ptr %gep.12
342  %cmp.12 = icmp ugt i8 %l.12, 16383
343  %s.12 = select i1 %cmp.12, i8 %l.12, i8 %x
344  store i8 %s.12, ptr %gep.12, align 2
345
346  %gep.13 = getelementptr inbounds i8, ptr %ptr, i8 13
347  %l.13 = load i8, ptr %gep.13
348  %cmp.13 = icmp ugt i8 %l.13, 16383
349  %s.13 = select i1 %cmp.13, i8 %l.13, i8 %x
350  store i8 %s.13, ptr %gep.13, align 2
351
352  %gep.14 = getelementptr inbounds i8, ptr %ptr, i8 14
353  %l.14 = load i8, ptr %gep.14
354  %cmp.14 = icmp ugt i8 %l.14, 16383
355  %s.14 = select i1 %cmp.14, i8 %l.14, i8 %x
356  store i8 %s.14, ptr %gep.14, align 2
357
358  %gep.15 = getelementptr inbounds i8, ptr %ptr, i8 15
359  %l.15 = load i8, ptr %gep.15
360  %cmp.15 = icmp ugt i8 %l.15, 16383
361  %s.15 = select i1 %cmp.15, i8 %l.15, i8 %x
362  store i8 %s.15, ptr %gep.15, align 2
363
364  ret void
365}
366
367
368define void @select_uniform_ugt_4xi16(ptr %ptr, i16 %x) {
369; CHECK-LABEL: @select_uniform_ugt_4xi16(
370; CHECK-NEXT:  entry:
371; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i16>, ptr [[PTR:%.*]], align 2
372; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt <4 x i16> [[TMP0]], splat (i16 16383)
373; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i16> poison, i16 [[X:%.*]], i32 0
374; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i16> [[TMP2]], <4 x i16> poison, <4 x i32> zeroinitializer
375; CHECK-NEXT:    [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i16> [[TMP0]], <4 x i16> [[TMP3]]
376; CHECK-NEXT:    store <4 x i16> [[TMP4]], ptr [[PTR]], align 2
377; CHECK-NEXT:    ret void
378;
379entry:
380  %l.0 = load i16, ptr %ptr
381  %cmp.0 = icmp ugt i16 %l.0, 16383
382  %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x
383  store i16 %s.0, ptr %ptr, align 2
384
385  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1
386  %l.1 = load i16, ptr %gep.1
387  %cmp.1 = icmp ugt i16 %l.1, 16383
388  %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x
389  store i16 %s.1, ptr %gep.1, align 2
390
391  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2
392  %l.2 = load i16, ptr %gep.2
393  %cmp.2 = icmp ugt i16 %l.2, 16383
394  %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x
395  store i16 %s.2, ptr %gep.2, align 2
396
397  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3
398  %l.3 = load i16, ptr %gep.3
399  %cmp.3 = icmp ugt i16 %l.3, 16383
400  %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x
401  store i16 %s.3, ptr %gep.3, align 2
402
403  ret void
404}
405
406define void @select_uniform_ult_8xi16(ptr %ptr, i16 %x) {
407; CHECK-LABEL: @select_uniform_ult_8xi16(
408; CHECK-NEXT:  entry:
409; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2
410; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult <8 x i16> [[TMP0]], splat (i16 16383)
411; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <8 x i16> poison, i16 [[X:%.*]], i32 0
412; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <8 x i16> [[TMP2]], <8 x i16> poison, <8 x i32> zeroinitializer
413; CHECK-NEXT:    [[TMP4:%.*]] = select <8 x i1> [[TMP1]], <8 x i16> [[TMP0]], <8 x i16> [[TMP3]]
414; CHECK-NEXT:    store <8 x i16> [[TMP4]], ptr [[PTR]], align 2
415; CHECK-NEXT:    ret void
416;
417entry:
418  %l.0 = load i16, ptr %ptr
419  %cmp.0 = icmp ult i16 %l.0, 16383
420  %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x
421  store i16 %s.0, ptr %ptr, align 2
422
423  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1
424  %l.1 = load i16, ptr %gep.1
425  %cmp.1 = icmp ult i16 %l.1, 16383
426  %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x
427  store i16 %s.1, ptr %gep.1, align 2
428
429  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2
430  %l.2 = load i16, ptr %gep.2
431  %cmp.2 = icmp ult i16 %l.2, 16383
432  %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x
433  store i16 %s.2, ptr %gep.2, align 2
434
435  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3
436  %l.3 = load i16, ptr %gep.3
437  %cmp.3 = icmp ult i16 %l.3, 16383
438  %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x
439  store i16 %s.3, ptr %gep.3, align 2
440
441  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4
442  %l.4 = load i16, ptr %gep.4
443  %cmp.4 = icmp ult i16 %l.4, 16383
444  %s.4 = select i1 %cmp.4, i16 %l.4, i16 %x
445  store i16 %s.4, ptr %gep.4, align 2
446
447  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5
448  %l.5 = load i16, ptr %gep.5
449  %cmp.5 = icmp ult i16 %l.5, 16383
450  %s.5 = select i1 %cmp.5, i16 %l.5, i16 %x
451  store i16 %s.5, ptr %gep.5, align 2
452
453  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6
454  %l.6 = load i16, ptr %gep.6
455  %cmp.6 = icmp ult i16 %l.6, 16383
456  %s.6 = select i1 %cmp.6, i16 %l.6, i16 %x
457  store i16 %s.6, ptr %gep.6, align 2
458
459  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7
460  %l.7 = load i16, ptr %gep.7
461  %cmp.7 = icmp ult i16 %l.7, 16383
462  %s.7 = select i1 %cmp.7, i16 %l.7, i16 %x
463  store i16 %s.7, ptr %gep.7, align 2
464  ret void
465}
466
467define void @select_uniform_eq_2xi32(ptr %ptr, i32 %x) {
468; CHECK-LABEL: @select_uniform_eq_2xi32(
469; CHECK-NEXT:  entry:
470; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i32>, ptr [[PTR:%.*]], align 4
471; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq <2 x i32> [[TMP0]], splat (i32 16383)
472; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i32 0
473; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i32> [[TMP2]], <2 x i32> poison, <2 x i32> zeroinitializer
474; CHECK-NEXT:    [[TMP4:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[TMP0]], <2 x i32> [[TMP3]]
475; CHECK-NEXT:    store <2 x i32> [[TMP4]], ptr [[PTR]], align 2
476; CHECK-NEXT:    ret void
477;
478entry:
479  %l.0 = load i32, ptr %ptr
480  %cmp.0 = icmp eq i32 %l.0, 16383
481  %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x
482  store i32 %s.0, ptr %ptr, align 2
483
484  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1
485  %l.1 = load i32, ptr %gep.1
486  %cmp.1 = icmp eq i32 %l.1, 16383
487  %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x
488  store i32 %s.1, ptr %gep.1, align 2
489
490  ret void
491}
492
493define void @select_uniform_eq_4xi32(ptr %ptr, i32 %x) {
494; CHECK-LABEL: @select_uniform_eq_4xi32(
495; CHECK-NEXT:  entry:
496; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4
497; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq <4 x i32> [[TMP0]], splat (i32 16383)
498; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[X:%.*]], i32 0
499; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <4 x i32> zeroinitializer
500; CHECK-NEXT:    [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> [[TMP0]], <4 x i32> [[TMP3]]
501; CHECK-NEXT:    store <4 x i32> [[TMP4]], ptr [[PTR]], align 2
502; CHECK-NEXT:    ret void
503;
504entry:
505  %l.0 = load i32, ptr %ptr
506  %cmp.0 = icmp eq i32 %l.0, 16383
507  %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x
508  store i32 %s.0, ptr %ptr, align 2
509
510  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1
511  %l.1 = load i32, ptr %gep.1
512  %cmp.1 = icmp eq i32 %l.1, 16383
513  %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x
514  store i32 %s.1, ptr %gep.1, align 2
515
516  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2
517  %l.2 = load i32, ptr %gep.2
518  %cmp.2 = icmp eq i32 %l.2, 16383
519  %s.2 = select i1 %cmp.2, i32 %l.2, i32 %x
520  store i32 %s.2, ptr %gep.2, align 2
521
522  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3
523  %l.3 = load i32, ptr %gep.3
524  %cmp.3 = icmp eq i32 %l.3, 16383
525  %s.3 = select i1 %cmp.3, i32 %l.3, i32 %x
526  store i32 %s.3, ptr %gep.3, align 2
527  ret void
528}
529
530define void @select_uniform_ne_2xi64(ptr %ptr, i64 %x) {
531; CHECK-LABEL: @select_uniform_ne_2xi64(
532; CHECK-NEXT:  entry:
533; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8
534; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne <2 x i64> [[TMP0]], splat (i64 16383)
535; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[X:%.*]], i32 0
536; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i64> [[TMP2]], <2 x i64> poison, <2 x i32> zeroinitializer
537; CHECK-NEXT:    [[TMP4:%.*]] = select <2 x i1> [[TMP1]], <2 x i64> [[TMP0]], <2 x i64> [[TMP3]]
538; CHECK-NEXT:    store <2 x i64> [[TMP4]], ptr [[PTR]], align 2
539; CHECK-NEXT:    ret void
540;
541entry:
542  %l.0 = load i64, ptr %ptr
543  %cmp.0 = icmp ne i64 %l.0, 16383
544  %s.0 = select i1 %cmp.0, i64 %l.0, i64 %x
545  store i64 %s.0, ptr %ptr, align 2
546
547  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1
548  %l.1 = load i64, ptr %gep.1
549  %cmp.1 = icmp ne i64 %l.1, 16383
550  %s.1 = select i1 %cmp.1, i64 %l.1, i64 %x
551  store i64 %s.1, ptr %gep.1, align 2
552
553  ret void
554}
555