xref: /llvm-project/llvm/test/Transforms/InstCombine/insert-trunc.ll (revision b1094776152b68efa05f69b7b833f9cbc0727efc)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S -data-layout="E" | FileCheck %s --check-prefixes=ALL
3; RUN: opt < %s -passes=instcombine -S -data-layout="e" | FileCheck %s --check-prefixes=ALL
4
5declare void @use(i8)
6declare void @use64(i64)
7
8define <4 x i16> @low_index_same_length_poison_basevec(i64 %x) {
9; ALL-LABEL: @low_index_same_length_poison_basevec(
10; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
11; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 0
12; ALL-NEXT:    ret <4 x i16> [[R]]
13;
14  %t = trunc i64 %x to i16
15  %r = insertelement <4 x i16> poison, i16 %t, i64 0
16  ret <4 x i16> %r
17}
18
19define <4 x i16> @high_index_same_length_poison_basevec(i64 %x) {
20; ALL-LABEL: @high_index_same_length_poison_basevec(
21; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
22; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 3
23; ALL-NEXT:    ret <4 x i16> [[R]]
24;
25  %t = trunc i64 %x to i16
26  %r = insertelement <4 x i16> poison, i16 %t, i64 3
27  ret <4 x i16> %r
28}
29
30define <4 x i16> @wrong_index_same_length_poison_basevec(i64 %x) {
31; ALL-LABEL: @wrong_index_same_length_poison_basevec(
32; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
33; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
34; ALL-NEXT:    ret <4 x i16> [[R]]
35;
36  %t = trunc i64 %x to i16
37  %r = insertelement <4 x i16> poison, i16 %t, i64 1
38  ret <4 x i16> %r
39}
40
41define <8 x i16> @low_index_longer_length_poison_basevec(i64 %x) {
42; ALL-LABEL: @low_index_longer_length_poison_basevec(
43; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
44; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 0
45; ALL-NEXT:    ret <8 x i16> [[R]]
46;
47  %t = trunc i64 %x to i16
48  %r = insertelement <8 x i16> poison, i16 %t, i64 0
49  ret <8 x i16> %r
50}
51
52define <8 x i16> @high_index_longer_length_poison_basevec(i64 %x) {
53; ALL-LABEL: @high_index_longer_length_poison_basevec(
54; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
55; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 3
56; ALL-NEXT:    ret <8 x i16> [[R]]
57;
58  %t = trunc i64 %x to i16
59  %r = insertelement <8 x i16> poison, i16 %t, i64 3
60  ret <8 x i16> %r
61}
62
63define <8 x i16> @wrong_index_longer_length_poison_basevec(i64 %x) {
64; ALL-LABEL: @wrong_index_longer_length_poison_basevec(
65; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
66; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 7
67; ALL-NEXT:    ret <8 x i16> [[R]]
68;
69  %t = trunc i64 %x to i16
70  %r = insertelement <8 x i16> poison, i16 %t, i64 7
71  ret <8 x i16> %r
72}
73
74define <2 x i16> @low_index_shorter_length_poison_basevec(i64 %x) {
75; ALL-LABEL: @low_index_shorter_length_poison_basevec(
76; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
77; ALL-NEXT:    [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 0
78; ALL-NEXT:    ret <2 x i16> [[R]]
79;
80  %t = trunc i64 %x to i16
81  %r = insertelement <2 x i16> poison, i16 %t, i64 0
82  ret <2 x i16> %r
83}
84
85define <4 x i8> @wrong_index_shorter_length_poison_basevec(i64 %x) {
86; ALL-LABEL: @wrong_index_shorter_length_poison_basevec(
87; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i8
88; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 3
89; ALL-NEXT:    ret <4 x i8> [[R]]
90;
91  %t = trunc i64 %x to i8
92  %r = insertelement <4 x i8> poison, i8 %t, i64 3
93  ret <4 x i8> %r
94}
95
96define <4 x i8> @wrong_width_low_index_shorter_length_poison_basevec(i65 %x) {
97; ALL-LABEL: @wrong_width_low_index_shorter_length_poison_basevec(
98; ALL-NEXT:    [[T:%.*]] = trunc i65 [[X:%.*]] to i8
99; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0
100; ALL-NEXT:    ret <4 x i8> [[R]]
101;
102  %t = trunc i65 %x to i8
103  %r = insertelement <4 x i8> poison, i8 %t, i64 0
104  ret <4 x i8> %r
105}
106
107define <4 x i8> @low_index_shorter_length_poison_basevec_extra_use(i64 %x) {
108; ALL-LABEL: @low_index_shorter_length_poison_basevec_extra_use(
109; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i8
110; ALL-NEXT:    call void @use(i8 [[T]])
111; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0
112; ALL-NEXT:    ret <4 x i8> [[R]]
113;
114  %t = trunc i64 %x to i8
115  call void @use(i8 %t)
116  %r = insertelement <4 x i8> poison, i8 %t, i64 0
117  ret <4 x i8> %r
118}
119
120define <4 x i16> @lshr_same_length_poison_basevec_le(i64 %x) {
121; ALL-LABEL: @lshr_same_length_poison_basevec_le(
122; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
123; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
124; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 2
125; ALL-NEXT:    ret <4 x i16> [[R]]
126;
127  %s = lshr i64 %x, 32
128  %t = trunc i64 %s to i16
129  %r = insertelement <4 x i16> poison, i16 %t, i64 2
130  ret <4 x i16> %r
131}
132
133define <4 x i16> @lshr_same_length_poison_basevec_be(i64 %x) {
134; ALL-LABEL: @lshr_same_length_poison_basevec_be(
135; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
136; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
137; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
138; ALL-NEXT:    ret <4 x i16> [[R]]
139;
140  %s = lshr i64 %x, 32
141  %t = trunc i64 %s to i16
142  %r = insertelement <4 x i16> poison, i16 %t, i64 1
143  ret <4 x i16> %r
144}
145
146define <4 x i16> @lshr_same_length_poison_basevec_both_endian(i64 %x) {
147; ALL-LABEL: @lshr_same_length_poison_basevec_both_endian(
148; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
149; ALL-NEXT:    [[T:%.*]] = trunc nuw i64 [[S]] to i16
150; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 0
151; ALL-NEXT:    ret <4 x i16> [[R]]
152;
153  %s = lshr i64 %x, 48
154  %t = trunc i64 %s to i16
155  %r = insertelement <4 x i16> poison, i16 %t, i64 0
156  ret <4 x i16> %r
157}
158
159define <4 x i16> @lshr_wrong_index_same_length_poison_basevec(i64 %x) {
160; ALL-LABEL: @lshr_wrong_index_same_length_poison_basevec(
161; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
162; ALL-NEXT:    [[T:%.*]] = trunc nuw i64 [[S]] to i16
163; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
164; ALL-NEXT:    ret <4 x i16> [[R]]
165;
166  %s = lshr i64 %x, 48
167  %t = trunc i64 %s to i16
168  %r = insertelement <4 x i16> poison, i16 %t, i64 1
169  ret <4 x i16> %r
170}
171
172define <8 x i16> @lshr_longer_length_poison_basevec_le(i64 %x) {
173; ALL-LABEL: @lshr_longer_length_poison_basevec_le(
174; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
175; ALL-NEXT:    [[T:%.*]] = trunc nuw i64 [[S]] to i16
176; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 3
177; ALL-NEXT:    ret <8 x i16> [[R]]
178;
179  %s = lshr i64 %x, 48
180  %t = trunc i64 %s to i16
181  %r = insertelement <8 x i16> poison, i16 %t, i64 3
182  ret <8 x i16> %r
183}
184
185define <8 x i16> @lshr_longer_length_poison_basevec_be(i64 %x) {
186; ALL-LABEL: @lshr_longer_length_poison_basevec_be(
187; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
188; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
189; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 1
190; ALL-NEXT:    ret <8 x i16> [[R]]
191;
192  %s = lshr i64 %x, 32
193  %t = trunc i64 %s to i16
194  %r = insertelement <8 x i16> poison, i16 %t, i64 1
195  ret <8 x i16> %r
196}
197
198define <8 x i16> @lshr_wrong_index_longer_length_poison_basevec(i64 %x) {
199; ALL-LABEL: @lshr_wrong_index_longer_length_poison_basevec(
200; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 16
201; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
202; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 6
203; ALL-NEXT:    ret <8 x i16> [[R]]
204;
205  %s = lshr i64 %x, 16
206  %t = trunc i64 %s to i16
207  %r = insertelement <8 x i16> poison, i16 %t, i64 6
208  ret <8 x i16> %r
209}
210
211define <2 x i16> @lshr_shorter_length_poison_basevec_le(i64 %x) {
212; ALL-LABEL: @lshr_shorter_length_poison_basevec_le(
213; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 16
214; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
215; ALL-NEXT:    [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 1
216; ALL-NEXT:    ret <2 x i16> [[R]]
217;
218  %s = lshr i64 %x, 16
219  %t = trunc i64 %s to i16
220  %r = insertelement <2 x i16> poison, i16 %t, i64 1
221  ret <2 x i16> %r
222}
223
224define <4 x i8> @lshr_shorter_length_poison_basevec_be(i64 %x) {
225; ALL-LABEL: @lshr_shorter_length_poison_basevec_be(
226; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 40
227; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i8
228; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2
229; ALL-NEXT:    ret <4 x i8> [[R]]
230;
231  %s = lshr i64 %x, 40
232  %t = trunc i64 %s to i8
233  %r = insertelement <4 x i8> poison, i8 %t, i64 2
234  ret <4 x i8> %r
235}
236
237define <4 x i8> @lshr_wrong_index_shorter_length_poison_basevec(i64 %x) {
238; ALL-LABEL: @lshr_wrong_index_shorter_length_poison_basevec(
239; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 40
240; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i8
241; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 3
242; ALL-NEXT:    ret <4 x i8> [[R]]
243;
244  %s = lshr i64 %x, 40
245  %t = trunc i64 %s to i8
246  %r = insertelement <4 x i8> poison, i8 %t, i64 3
247  ret <4 x i8> %r
248}
249
250define <4 x i8> @lshr_wrong_shift_shorter_length_poison_basevec(i64 %x) {
251; ALL-LABEL: @lshr_wrong_shift_shorter_length_poison_basevec(
252; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 57
253; ALL-NEXT:    [[T:%.*]] = trunc nuw nsw i64 [[S]] to i8
254; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0
255; ALL-NEXT:    ret <4 x i8> [[R]]
256;
257  %s = lshr i64 %x, 57
258  %t = trunc i64 %s to i8
259  %r = insertelement <4 x i8> poison, i8 %t, i64 0
260  ret <4 x i8> %r
261}
262
263define <4 x i8> @lshr_shorter_length_poison_basevec_be_extra_use(i64 %x) {
264; ALL-LABEL: @lshr_shorter_length_poison_basevec_be_extra_use(
265; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 40
266; ALL-NEXT:    call void @use64(i64 [[S]])
267; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i8
268; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2
269; ALL-NEXT:    ret <4 x i8> [[R]]
270;
271  %s = lshr i64 %x, 40
272  call void @use64(i64 %s)
273  %t = trunc i64 %s to i8
274  %r = insertelement <4 x i8> poison, i8 %t, i64 2
275  ret <4 x i8> %r
276}
277
278define <4 x i16> @low_index_same_length_basevec(i64 %x, <4 x i16> %v) {
279; ALL-LABEL: @low_index_same_length_basevec(
280; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
281; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 0
282; ALL-NEXT:    ret <4 x i16> [[R]]
283;
284  %t = trunc i64 %x to i16
285  %r = insertelement <4 x i16> %v, i16 %t, i64 0
286  ret <4 x i16> %r
287}
288
289define <4 x i16> @high_index_same_length_basevec(i64 %x, <4 x i16> %v) {
290; ALL-LABEL: @high_index_same_length_basevec(
291; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
292; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 3
293; ALL-NEXT:    ret <4 x i16> [[R]]
294;
295  %t = trunc i64 %x to i16
296  %r = insertelement <4 x i16> %v, i16 %t, i64 3
297  ret <4 x i16> %r
298}
299
300define <4 x i16> @wrong_index_same_length_basevec(i64 %x, <4 x i16> %v) {
301; ALL-LABEL: @wrong_index_same_length_basevec(
302; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
303; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1
304; ALL-NEXT:    ret <4 x i16> [[R]]
305;
306  %t = trunc i64 %x to i16
307  %r = insertelement <4 x i16> %v, i16 %t, i64 1
308  ret <4 x i16> %r
309}
310
311define <8 x i16> @low_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
312; ALL-LABEL: @low_index_longer_length_basevec(
313; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
314; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 0
315; ALL-NEXT:    ret <8 x i16> [[R]]
316;
317  %t = trunc i64 %x to i16
318  %r = insertelement <8 x i16> %v, i16 %t, i64 0
319  ret <8 x i16> %r
320}
321
322define <8 x i16> @high_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
323; ALL-LABEL: @high_index_longer_length_basevec(
324; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
325; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 3
326; ALL-NEXT:    ret <8 x i16> [[R]]
327;
328  %t = trunc i64 %x to i16
329  %r = insertelement <8 x i16> %v, i16 %t, i64 3
330  ret <8 x i16> %r
331}
332
333define <8 x i16> @wrong_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
334; ALL-LABEL: @wrong_index_longer_length_basevec(
335; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
336; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 7
337; ALL-NEXT:    ret <8 x i16> [[R]]
338;
339  %t = trunc i64 %x to i16
340  %r = insertelement <8 x i16> %v, i16 %t, i64 7
341  ret <8 x i16> %r
342}
343
344define <2 x i16> @low_index_shorter_length_basevec(i64 %x, <2 x i16> %v) {
345; ALL-LABEL: @low_index_shorter_length_basevec(
346; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i16
347; ALL-NEXT:    [[R:%.*]] = insertelement <2 x i16> [[V:%.*]], i16 [[T]], i64 0
348; ALL-NEXT:    ret <2 x i16> [[R]]
349;
350  %t = trunc i64 %x to i16
351  %r = insertelement <2 x i16> %v, i16 %t, i64 0
352  ret <2 x i16> %r
353}
354
355define <4 x i8> @wrong_index_shorter_length_basevec(i64 %x, <4 x i8> %v) {
356; ALL-LABEL: @wrong_index_shorter_length_basevec(
357; ALL-NEXT:    [[T:%.*]] = trunc i64 [[X:%.*]] to i8
358; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 3
359; ALL-NEXT:    ret <4 x i8> [[R]]
360;
361  %t = trunc i64 %x to i8
362  %r = insertelement <4 x i8> %v, i8 %t, i64 3
363  ret <4 x i8> %r
364}
365
366define <4 x i16> @lshr_same_length_basevec_le(i64 %x, <4 x i16> %v) {
367; ALL-LABEL: @lshr_same_length_basevec_le(
368; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
369; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
370; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 2
371; ALL-NEXT:    ret <4 x i16> [[R]]
372;
373  %s = lshr i64 %x, 32
374  %t = trunc i64 %s to i16
375  %r = insertelement <4 x i16> %v, i16 %t, i64 2
376  ret <4 x i16> %r
377}
378
379define <4 x i16> @lshr_same_length_basevec_be(i64 %x, <4 x i16> %v) {
380; ALL-LABEL: @lshr_same_length_basevec_be(
381; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
382; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
383; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1
384; ALL-NEXT:    ret <4 x i16> [[R]]
385;
386  %s = lshr i64 %x, 32
387  %t = trunc i64 %s to i16
388  %r = insertelement <4 x i16> %v, i16 %t, i64 1
389  ret <4 x i16> %r
390}
391
392define <4 x i16> @lshr_same_length_basevec_both_endian(i64 %x, <4 x i16> %v) {
393; ALL-LABEL: @lshr_same_length_basevec_both_endian(
394; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
395; ALL-NEXT:    [[T:%.*]] = trunc nuw i64 [[S]] to i16
396; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 3
397; ALL-NEXT:    ret <4 x i16> [[R]]
398;
399  %s = lshr i64 %x, 48
400  %t = trunc i64 %s to i16
401  %r = insertelement <4 x i16> %v, i16 %t, i64 3
402  ret <4 x i16> %r
403}
404
405define <4 x i16> @lshr_wrong_index_same_length_basevec(i64 %x, <4 x i16> %v) {
406; ALL-LABEL: @lshr_wrong_index_same_length_basevec(
407; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
408; ALL-NEXT:    [[T:%.*]] = trunc nuw i64 [[S]] to i16
409; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1
410; ALL-NEXT:    ret <4 x i16> [[R]]
411;
412  %s = lshr i64 %x, 48
413  %t = trunc i64 %s to i16
414  %r = insertelement <4 x i16> %v, i16 %t, i64 1
415  ret <4 x i16> %r
416}
417
418define <8 x i16> @lshr_longer_length_basevec_le(i64 %x, <8 x i16> %v) {
419; ALL-LABEL: @lshr_longer_length_basevec_le(
420; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
421; ALL-NEXT:    [[T:%.*]] = trunc nuw i64 [[S]] to i16
422; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 3
423; ALL-NEXT:    ret <8 x i16> [[R]]
424;
425  %s = lshr i64 %x, 48
426  %t = trunc i64 %s to i16
427  %r = insertelement <8 x i16> %v, i16 %t, i64 3
428  ret <8 x i16> %r
429}
430
431define <8 x i16> @lshr_longer_length_basevec_be(i64 %x, <8 x i16> %v) {
432; ALL-LABEL: @lshr_longer_length_basevec_be(
433; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
434; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
435; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 1
436; ALL-NEXT:    ret <8 x i16> [[R]]
437;
438  %s = lshr i64 %x, 32
439  %t = trunc i64 %s to i16
440  %r = insertelement <8 x i16> %v, i16 %t, i64 1
441  ret <8 x i16> %r
442}
443
444define <8 x i16> @lshr_wrong_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
445; ALL-LABEL: @lshr_wrong_index_longer_length_basevec(
446; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 16
447; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
448; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 6
449; ALL-NEXT:    ret <8 x i16> [[R]]
450;
451  %s = lshr i64 %x, 16
452  %t = trunc i64 %s to i16
453  %r = insertelement <8 x i16> %v, i16 %t, i64 6
454  ret <8 x i16> %r
455}
456
457define <2 x i16> @lshr_shorter_length_basevec_le(i64 %x, <2 x i16> %v) {
458; ALL-LABEL: @lshr_shorter_length_basevec_le(
459; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 16
460; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
461; ALL-NEXT:    [[R:%.*]] = insertelement <2 x i16> [[V:%.*]], i16 [[T]], i64 1
462; ALL-NEXT:    ret <2 x i16> [[R]]
463;
464  %s = lshr i64 %x, 16
465  %t = trunc i64 %s to i16
466  %r = insertelement <2 x i16> %v, i16 %t, i64 1
467  ret <2 x i16> %r
468}
469
470define <4 x i8> @lshr_shorter_length_basevec_be(i64 %x, <4 x i8> %v) {
471; ALL-LABEL: @lshr_shorter_length_basevec_be(
472; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
473; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i8
474; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 1
475; ALL-NEXT:    ret <4 x i8> [[R]]
476;
477  %s = lshr i64 %x, 48
478  %t = trunc i64 %s to i8
479  %r = insertelement <4 x i8> %v, i8 %t, i64 1
480  ret <4 x i8> %r
481}
482
483define <4 x i8> @lshr_wrong_index_shorter_length_basevec(i64 %x, <4 x i8> %v) {
484; ALL-LABEL: @lshr_wrong_index_shorter_length_basevec(
485; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 40
486; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i8
487; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 3
488; ALL-NEXT:    ret <4 x i8> [[R]]
489;
490  %s = lshr i64 %x, 40
491  %t = trunc i64 %s to i8
492  %r = insertelement <4 x i8> %v, i8 %t, i64 3
493  ret <4 x i8> %r
494}
495