a18a587e4a66477bbab280ea835e0bb325ba6fa7
[oota-llvm.git] / test / CodeGen / X86 / avx2-vbroadcast.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx2 | FileCheck %s
3
4 define <16 x i8> @BB16(i8* %ptr) nounwind uwtable readnone ssp {
5 ; CHECK-LABEL: BB16:
6 ; CHECK:       ## BB#0: ## %entry
7 ; CHECK-NEXT:    vpbroadcastb (%rdi), %xmm0
8 ; CHECK-NEXT:    retq
9 entry:
10   %q = load i8, i8* %ptr, align 4
11   %q0 = insertelement <16 x i8> undef, i8 %q, i32 0
12   %q1 = insertelement <16 x i8> %q0, i8 %q, i32 1
13   %q2 = insertelement <16 x i8> %q1, i8 %q, i32 2
14   %q3 = insertelement <16 x i8> %q2, i8 %q, i32 3
15   %q4 = insertelement <16 x i8> %q3, i8 %q, i32 4
16   %q5 = insertelement <16 x i8> %q4, i8 %q, i32 5
17   %q6 = insertelement <16 x i8> %q5, i8 %q, i32 6
18   %q7 = insertelement <16 x i8> %q6, i8 %q, i32 7
19   %q8 = insertelement <16 x i8> %q7, i8 %q, i32 8
20   %q9 = insertelement <16 x i8> %q8, i8 %q, i32 9
21   %qa = insertelement <16 x i8> %q9, i8 %q, i32 10
22   %qb = insertelement <16 x i8> %qa, i8 %q, i32 11
23   %qc = insertelement <16 x i8> %qb, i8 %q, i32 12
24   %qd = insertelement <16 x i8> %qc, i8 %q, i32 13
25   %qe = insertelement <16 x i8> %qd, i8 %q, i32 14
26   %qf = insertelement <16 x i8> %qe, i8 %q, i32 15
27   ret <16 x i8> %qf
28 }
29
30 define <32 x i8> @BB32(i8* %ptr) nounwind uwtable readnone ssp {
31 ; CHECK-LABEL: BB32:
32 ; CHECK:       ## BB#0: ## %entry
33 ; CHECK-NEXT:    vpbroadcastb (%rdi), %ymm0
34 ; CHECK-NEXT:    retq
35 entry:
36   %q = load i8, i8* %ptr, align 4
37   %q0 = insertelement <32 x i8> undef, i8 %q, i32 0
38   %q1 = insertelement <32 x i8> %q0, i8 %q, i32 1
39   %q2 = insertelement <32 x i8> %q1, i8 %q, i32 2
40   %q3 = insertelement <32 x i8> %q2, i8 %q, i32 3
41   %q4 = insertelement <32 x i8> %q3, i8 %q, i32 4
42   %q5 = insertelement <32 x i8> %q4, i8 %q, i32 5
43   %q6 = insertelement <32 x i8> %q5, i8 %q, i32 6
44   %q7 = insertelement <32 x i8> %q6, i8 %q, i32 7
45   %q8 = insertelement <32 x i8> %q7, i8 %q, i32 8
46   %q9 = insertelement <32 x i8> %q8, i8 %q, i32 9
47   %qa = insertelement <32 x i8> %q9, i8 %q, i32 10
48   %qb = insertelement <32 x i8> %qa, i8 %q, i32 11
49   %qc = insertelement <32 x i8> %qb, i8 %q, i32 12
50   %qd = insertelement <32 x i8> %qc, i8 %q, i32 13
51   %qe = insertelement <32 x i8> %qd, i8 %q, i32 14
52   %qf = insertelement <32 x i8> %qe, i8 %q, i32 15
53
54   %q20 = insertelement <32 x i8> %qf, i8 %q,  i32 16
55   %q21 = insertelement <32 x i8> %q20, i8 %q, i32 17
56   %q22 = insertelement <32 x i8> %q21, i8 %q, i32 18
57   %q23 = insertelement <32 x i8> %q22, i8 %q, i32 19
58   %q24 = insertelement <32 x i8> %q23, i8 %q, i32 20
59   %q25 = insertelement <32 x i8> %q24, i8 %q, i32 21
60   %q26 = insertelement <32 x i8> %q25, i8 %q, i32 22
61   %q27 = insertelement <32 x i8> %q26, i8 %q, i32 23
62   %q28 = insertelement <32 x i8> %q27, i8 %q, i32 24
63   %q29 = insertelement <32 x i8> %q28, i8 %q, i32 25
64   %q2a = insertelement <32 x i8> %q29, i8 %q, i32 26
65   %q2b = insertelement <32 x i8> %q2a, i8 %q, i32 27
66   %q2c = insertelement <32 x i8> %q2b, i8 %q, i32 28
67   %q2d = insertelement <32 x i8> %q2c, i8 %q, i32 29
68   %q2e = insertelement <32 x i8> %q2d, i8 %q, i32 30
69   %q2f = insertelement <32 x i8> %q2e, i8 %q, i32 31
70   ret <32 x i8> %q2f
71 }
72
73 define <8 x i16> @W16(i16* %ptr) nounwind uwtable readnone ssp {
74 ; CHECK-LABEL: W16:
75 ; CHECK:       ## BB#0: ## %entry
76 ; CHECK-NEXT:    vpbroadcastw (%rdi), %xmm0
77 ; CHECK-NEXT:    retq
78 entry:
79   %q = load i16, i16* %ptr, align 4
80   %q0 = insertelement <8 x i16> undef, i16 %q, i32 0
81   %q1 = insertelement <8 x i16> %q0, i16 %q, i32 1
82   %q2 = insertelement <8 x i16> %q1, i16 %q, i32 2
83   %q3 = insertelement <8 x i16> %q2, i16 %q, i32 3
84   %q4 = insertelement <8 x i16> %q3, i16 %q, i32 4
85   %q5 = insertelement <8 x i16> %q4, i16 %q, i32 5
86   %q6 = insertelement <8 x i16> %q5, i16 %q, i32 6
87   %q7 = insertelement <8 x i16> %q6, i16 %q, i32 7
88   ret <8 x i16> %q7
89 }
90
91 define <16 x i16> @WW16(i16* %ptr) nounwind uwtable readnone ssp {
92 ; CHECK-LABEL: WW16:
93 ; CHECK:       ## BB#0: ## %entry
94 ; CHECK-NEXT:    vpbroadcastw (%rdi), %ymm0
95 ; CHECK-NEXT:    retq
96 entry:
97   %q = load i16, i16* %ptr, align 4
98   %q0 = insertelement <16 x i16> undef, i16 %q, i32 0
99   %q1 = insertelement <16 x i16> %q0, i16 %q, i32 1
100   %q2 = insertelement <16 x i16> %q1, i16 %q, i32 2
101   %q3 = insertelement <16 x i16> %q2, i16 %q, i32 3
102   %q4 = insertelement <16 x i16> %q3, i16 %q, i32 4
103   %q5 = insertelement <16 x i16> %q4, i16 %q, i32 5
104   %q6 = insertelement <16 x i16> %q5, i16 %q, i32 6
105   %q7 = insertelement <16 x i16> %q6, i16 %q, i32 7
106   %q8 = insertelement <16 x i16> %q7, i16 %q, i32 8
107   %q9 = insertelement <16 x i16> %q8, i16 %q, i32 9
108   %qa = insertelement <16 x i16> %q9, i16 %q, i32 10
109   %qb = insertelement <16 x i16> %qa, i16 %q, i32 11
110   %qc = insertelement <16 x i16> %qb, i16 %q, i32 12
111   %qd = insertelement <16 x i16> %qc, i16 %q, i32 13
112   %qe = insertelement <16 x i16> %qd, i16 %q, i32 14
113   %qf = insertelement <16 x i16> %qe, i16 %q, i32 15
114   ret <16 x i16> %qf
115 }
116
117 define <4 x i32> @D32(i32* %ptr) nounwind uwtable readnone ssp {
118 ; CHECK-LABEL: D32:
119 ; CHECK:       ## BB#0: ## %entry
120 ; CHECK-NEXT:    vbroadcastss (%rdi), %xmm0
121 ; CHECK-NEXT:    retq
122 entry:
123   %q = load i32, i32* %ptr, align 4
124   %q0 = insertelement <4 x i32> undef, i32 %q, i32 0
125   %q1 = insertelement <4 x i32> %q0, i32 %q, i32 1
126   %q2 = insertelement <4 x i32> %q1, i32 %q, i32 2
127   %q3 = insertelement <4 x i32> %q2, i32 %q, i32 3
128   ret <4 x i32> %q3
129 }
130
131 define <8 x i32> @DD32(i32* %ptr) nounwind uwtable readnone ssp {
132 ; CHECK-LABEL: DD32:
133 ; CHECK:       ## BB#0: ## %entry
134 ; CHECK-NEXT:    vbroadcastss (%rdi), %ymm0
135 ; CHECK-NEXT:    retq
136 entry:
137   %q = load i32, i32* %ptr, align 4
138   %q0 = insertelement <8 x i32> undef, i32 %q, i32 0
139   %q1 = insertelement <8 x i32> %q0, i32 %q, i32 1
140   %q2 = insertelement <8 x i32> %q1, i32 %q, i32 2
141   %q3 = insertelement <8 x i32> %q2, i32 %q, i32 3
142   %q4 = insertelement <8 x i32> %q3, i32 %q, i32 4
143   %q5 = insertelement <8 x i32> %q4, i32 %q, i32 5
144   %q6 = insertelement <8 x i32> %q5, i32 %q, i32 6
145   %q7 = insertelement <8 x i32> %q6, i32 %q, i32 7
146   ret <8 x i32> %q7
147 }
148
149 define <2 x i64> @Q64(i64* %ptr) nounwind uwtable readnone ssp {
150 ; CHECK-LABEL: Q64:
151 ; CHECK:       ## BB#0: ## %entry
152 ; CHECK-NEXT:    vpbroadcastq (%rdi), %xmm0
153 ; CHECK-NEXT:    retq
154 entry:
155   %q = load i64, i64* %ptr, align 4
156   %q0 = insertelement <2 x i64> undef, i64 %q, i32 0
157   %q1 = insertelement <2 x i64> %q0, i64 %q, i32 1
158   ret <2 x i64> %q1
159 }
160
161 define <4 x i64> @QQ64(i64* %ptr) nounwind uwtable readnone ssp {
162 ; CHECK-LABEL: QQ64:
163 ; CHECK:       ## BB#0: ## %entry
164 ; CHECK-NEXT:    vbroadcastsd (%rdi), %ymm0
165 ; CHECK-NEXT:    retq
166 entry:
167   %q = load i64, i64* %ptr, align 4
168   %q0 = insertelement <4 x i64> undef, i64 %q, i32 0
169   %q1 = insertelement <4 x i64> %q0, i64 %q, i32 1
170   %q2 = insertelement <4 x i64> %q1, i64 %q, i32 2
171   %q3 = insertelement <4 x i64> %q2, i64 %q, i32 3
172   ret <4 x i64> %q3
173 }
174
175 ; FIXME: Pointer adjusted broadcasts
176
177 define <16 x i8> @load_splat_16i8_16i8_1111111111111111(<16 x i8>* %ptr) nounwind uwtable readnone ssp {
178 ; CHECK-LABEL: load_splat_16i8_16i8_1111111111111111:
179 ; CHECK:       ## BB#0: ## %entry
180 ; CHECK-NEXT:    vmovdqa (%rdi), %xmm0
181 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
182 ; CHECK-NEXT:    retq
183 entry:
184   %ld = load <16 x i8>, <16 x i8>* %ptr
185   %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
186   ret <16 x i8> %ret
187 }
188
189 define <32 x i8> @load_splat_32i8_16i8_11111111111111111111111111111111(<16 x i8>* %ptr) nounwind uwtable readnone ssp {
190 ; CHECK-LABEL: load_splat_32i8_16i8_11111111111111111111111111111111:
191 ; CHECK:       ## BB#0: ## %entry
192 ; CHECK-NEXT:    vmovdqa (%rdi), %xmm0
193 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
194 ; CHECK-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
195 ; CHECK-NEXT:    retq
196 entry:
197   %ld = load <16 x i8>, <16 x i8>* %ptr
198   %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
199   ret <32 x i8> %ret
200 }
201
202 define <32 x i8> @load_splat_32i8_32i8_11111111111111111111111111111111(<32 x i8>* %ptr) nounwind uwtable readnone ssp {
203 ; CHECK-LABEL: load_splat_32i8_32i8_11111111111111111111111111111111:
204 ; CHECK:       ## BB#0: ## %entry
205 ; CHECK-NEXT:    vmovdqa (%rdi), %ymm0
206 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
207 ; CHECK-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
208 ; CHECK-NEXT:    retq
209 entry:
210   %ld = load <32 x i8>, <32 x i8>* %ptr
211   %ret = shufflevector <32 x i8> %ld, <32 x i8> undef, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
212   ret <32 x i8> %ret
213 }
214
215 define <8 x i16> @load_splat_8i16_8i16_11111111(<8 x i16>* %ptr) nounwind uwtable readnone ssp {
216 ; CHECK-LABEL: load_splat_8i16_8i16_11111111:
217 ; CHECK:       ## BB#0: ## %entry
218 ; CHECK-NEXT:    vmovdqa (%rdi), %xmm0
219 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
220 ; CHECK-NEXT:    retq
221 entry:
222   %ld = load <8 x i16>, <8 x i16>* %ptr
223   %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
224   ret <8 x i16> %ret
225 }
226
227 define <16 x i16> @load_splat_16i16_8i16_1111111111111111(<8 x i16>* %ptr) nounwind uwtable readnone ssp {
228 ; CHECK-LABEL: load_splat_16i16_8i16_1111111111111111:
229 ; CHECK:       ## BB#0: ## %entry
230 ; CHECK-NEXT:    vmovdqa (%rdi), %xmm0
231 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
232 ; CHECK-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
233 ; CHECK-NEXT:    retq
234 entry:
235   %ld = load <8 x i16>, <8 x i16>* %ptr
236   %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
237   ret <16 x i16> %ret
238 }
239
240 define <16 x i16> @load_splat_16i16_16i16_1111111111111111(<16 x i16>* %ptr) nounwind uwtable readnone ssp {
241 ; CHECK-LABEL: load_splat_16i16_16i16_1111111111111111:
242 ; CHECK:       ## BB#0: ## %entry
243 ; CHECK-NEXT:    vmovdqa (%rdi), %ymm0
244 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]
245 ; CHECK-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
246 ; CHECK-NEXT:    retq
247 entry:
248   %ld = load <16 x i16>, <16 x i16>* %ptr
249   %ret = shufflevector <16 x i16> %ld, <16 x i16> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
250   ret <16 x i16> %ret
251 }
252
253 define <4 x i32> @load_splat_4i32_4i32_1111(<4 x i32>* %ptr) nounwind uwtable readnone ssp {
254 ; CHECK-LABEL: load_splat_4i32_4i32_1111:
255 ; CHECK:       ## BB#0: ## %entry
256 ; CHECK-NEXT:    vpshufd {{.*#+}} xmm0 = mem[1,1,1,1]
257 ; CHECK-NEXT:    retq
258 entry:
259   %ld = load <4 x i32>, <4 x i32>* %ptr
260   %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
261   ret <4 x i32> %ret
262 }
263
264 define <8 x i32> @load_splat_8i32_4i32_33333333(<4 x i32>* %ptr) nounwind uwtable readnone ssp {
265 ; CHECK-LABEL: load_splat_8i32_4i32_33333333:
266 ; CHECK:       ## BB#0: ## %entry
267 ; CHECK-NEXT:    vmovdqa (%rdi), %xmm0
268 ; CHECK-NEXT:    vpbroadcastd LCPI15_0(%rip), %ymm1
269 ; CHECK-NEXT:    vpermd %ymm0, %ymm1, %ymm0
270 ; CHECK-NEXT:    retq
271 entry:
272   %ld = load <4 x i32>, <4 x i32>* %ptr
273   %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
274   ret <8 x i32> %ret
275 }
276
277 define <8 x i32> @load_splat_8i32_8i32_55555555(<8 x i32>* %ptr) nounwind uwtable readnone ssp {
278 ; CHECK-LABEL: load_splat_8i32_8i32_55555555:
279 ; CHECK:       ## BB#0: ## %entry
280 ; CHECK-NEXT:    vpbroadcastd LCPI16_0(%rip), %ymm0
281 ; CHECK-NEXT:    vpermd (%rdi), %ymm0, %ymm0
282 ; CHECK-NEXT:    retq
283 entry:
284   %ld = load <8 x i32>, <8 x i32>* %ptr
285   %ret = shufflevector <8 x i32> %ld, <8 x i32> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
286   ret <8 x i32> %ret
287 }
288
289 define <4 x float> @load_splat_4f32_4f32_1111(<4 x float>* %ptr) nounwind uwtable readnone ssp {
290 ; CHECK-LABEL: load_splat_4f32_4f32_1111:
291 ; CHECK:       ## BB#0: ## %entry
292 ; CHECK-NEXT:    vpermilps {{.*#+}} xmm0 = mem[1,1,1,1]
293 ; CHECK-NEXT:    retq
294 entry:
295   %ld = load <4 x float>, <4 x float>* %ptr
296   %ret = shufflevector <4 x float> %ld, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
297   ret <4 x float> %ret
298 }
299
300 define <8 x float> @load_splat_8f32_4f32_33333333(<4 x float>* %ptr) nounwind uwtable readnone ssp {
301 ; CHECK-LABEL: load_splat_8f32_4f32_33333333:
302 ; CHECK:       ## BB#0: ## %entry
303 ; CHECK-NEXT:    vmovaps (%rdi), %xmm0
304 ; CHECK-NEXT:    vbroadcastss LCPI18_0(%rip), %ymm1
305 ; CHECK-NEXT:    vpermps %ymm0, %ymm1, %ymm0
306 ; CHECK-NEXT:    retq
307 entry:
308   %ld = load <4 x float>, <4 x float>* %ptr
309   %ret = shufflevector <4 x float> %ld, <4 x float> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
310   ret <8 x float> %ret
311 }
312
313 define <8 x float> @load_splat_8f32_8f32_55555555(<8 x float>* %ptr) nounwind uwtable readnone ssp {
314 ; CHECK-LABEL: load_splat_8f32_8f32_55555555:
315 ; CHECK:       ## BB#0: ## %entry
316 ; CHECK-NEXT:    vbroadcastss LCPI19_0(%rip), %ymm0
317 ; CHECK-NEXT:    vpermps (%rdi), %ymm0, %ymm0
318 ; CHECK-NEXT:    retq
319 entry:
320   %ld = load <8 x float>, <8 x float>* %ptr
321   %ret = shufflevector <8 x float> %ld, <8 x float> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
322   ret <8 x float> %ret
323 }
324
325 define <2 x i64> @load_splat_2i64_2i64_1111(<2 x i64>* %ptr) nounwind uwtable readnone ssp {
326 ; CHECK-LABEL: load_splat_2i64_2i64_1111:
327 ; CHECK:       ## BB#0: ## %entry
328 ; CHECK-NEXT:    vpshufd {{.*#+}} xmm0 = mem[2,3,2,3]
329 ; CHECK-NEXT:    retq
330 entry:
331   %ld = load <2 x i64>, <2 x i64>* %ptr
332   %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
333   ret <2 x i64> %ret
334 }
335
336 define <4 x i64> @load_splat_4i64_2i64_1111(<2 x i64>* %ptr) nounwind uwtable readnone ssp {
337 ; CHECK-LABEL: load_splat_4i64_2i64_1111:
338 ; CHECK:       ## BB#0: ## %entry
339 ; CHECK-NEXT:    vmovdqa (%rdi), %xmm0
340 ; CHECK-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,1,1,1]
341 ; CHECK-NEXT:    retq
342 entry:
343   %ld = load <2 x i64>, <2 x i64>* %ptr
344   %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
345   ret <4 x i64> %ret
346 }
347
348 define <4 x i64> @load_splat_4i64_4i64_2222(<4 x i64>* %ptr) nounwind uwtable readnone ssp {
349 ; CHECK-LABEL: load_splat_4i64_4i64_2222:
350 ; CHECK:       ## BB#0: ## %entry
351 ; CHECK-NEXT:    vpermq {{.*#+}} ymm0 = mem[2,2,2,2]
352 ; CHECK-NEXT:    retq
353 entry:
354   %ld = load <4 x i64>, <4 x i64>* %ptr
355   %ret = shufflevector <4 x i64> %ld, <4 x i64> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
356   ret <4 x i64> %ret
357 }
358
359 define <2 x double> @load_splat_2f64_2f64_1111(<2 x double>* %ptr) nounwind uwtable readnone ssp {
360 ; CHECK-LABEL: load_splat_2f64_2f64_1111:
361 ; CHECK:       ## BB#0: ## %entry
362 ; CHECK-NEXT:    vmovaps (%rdi), %xmm0
363 ; CHECK-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
364 ; CHECK-NEXT:    retq
365 entry:
366   %ld = load <2 x double>, <2 x double>* %ptr
367   %ret = shufflevector <2 x double> %ld, <2 x double> undef, <2 x i32> <i32 1, i32 1>
368   ret <2 x double> %ret
369 }
370
371 define <4 x double> @load_splat_4f64_2f64_1111(<2 x double>* %ptr) nounwind uwtable readnone ssp {
372 ; CHECK-LABEL: load_splat_4f64_2f64_1111:
373 ; CHECK:       ## BB#0: ## %entry
374 ; CHECK-NEXT:    vmovapd (%rdi), %xmm0
375 ; CHECK-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,1,1]
376 ; CHECK-NEXT:    retq
377 entry:
378   %ld = load <2 x double>, <2 x double>* %ptr
379   %ret = shufflevector <2 x double> %ld, <2 x double> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
380   ret <4 x double> %ret
381 }
382
383 define <4 x double> @load_splat_4f64_4f64_2222(<4 x double>* %ptr) nounwind uwtable readnone ssp {
384 ; CHECK-LABEL: load_splat_4f64_4f64_2222:
385 ; CHECK:       ## BB#0: ## %entry
386 ; CHECK-NEXT:    vpermpd {{.*#+}} ymm0 = mem[2,2,2,2]
387 ; CHECK-NEXT:    retq
388 entry:
389   %ld = load <4 x double>, <4 x double>* %ptr
390   %ret = shufflevector <4 x double> %ld, <4 x double> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
391   ret <4 x double> %ret
392 }
393
394 ; make sure that we still don't support broadcast double into 128-bit vector
395 ; this used to crash
396 define <2 x double> @I(double* %ptr) nounwind uwtable readnone ssp {
397 ; CHECK-LABEL: I:
398 ; CHECK:       ## BB#0: ## %entry
399 ; CHECK-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
400 ; CHECK-NEXT:    retq
401 entry:
402   %q = load double, double* %ptr, align 4
403   %vecinit.i = insertelement <2 x double> undef, double %q, i32 0
404   %vecinit2.i = insertelement <2 x double> %vecinit.i, double %q, i32 1
405   ret <2 x double> %vecinit2.i
406 }
407
408 define <8 x i32> @V111(<8 x i32> %in) nounwind uwtable readnone ssp {
409 ; CHECK-LABEL: V111:
410 ; CHECK:       ## BB#0: ## %entry
411 ; CHECK-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
412 ; CHECK-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
413 ; CHECK-NEXT:    retq
414 entry:
415   %g = add <8 x i32> %in, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
416   ret <8 x i32> %g
417 }
418
419 define <8 x float> @V113(<8 x float> %in) nounwind uwtable readnone ssp {
420 ; CHECK-LABEL: V113:
421 ; CHECK:       ## BB#0: ## %entry
422 ; CHECK-NEXT:    vbroadcastss {{.*}}(%rip), %ymm1
423 ; CHECK-NEXT:    vaddps %ymm1, %ymm0, %ymm0
424 ; CHECK-NEXT:    retq
425 entry:
426   %g = fadd <8 x float> %in, <float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000>
427   ret <8 x float> %g
428 }
429
430 define <4 x float> @_e2(float* %ptr) nounwind uwtable readnone ssp {
431 ; CHECK-LABEL: _e2:
432 ; CHECK:       ## BB#0:
433 ; CHECK-NEXT:    vbroadcastss {{.*}}(%rip), %xmm0
434 ; CHECK-NEXT:    retq
435   %vecinit.i = insertelement <4 x float> undef, float        0xbf80000000000000, i32 0
436   %vecinit2.i = insertelement <4 x float> %vecinit.i, float  0xbf80000000000000, i32 1
437   %vecinit4.i = insertelement <4 x float> %vecinit2.i, float 0xbf80000000000000, i32 2
438   %vecinit6.i = insertelement <4 x float> %vecinit4.i, float 0xbf80000000000000, i32 3
439   ret <4 x float> %vecinit6.i
440 }
441
442 define <8 x i8> @_e4(i8* %ptr) nounwind uwtable readnone ssp {
443 ; CHECK-LABEL: _e4:
444 ; CHECK:       ## BB#0:
445 ; CHECK-NEXT:    vmovaps {{.*#+}} xmm0 = [52,52,52,52,52,52,52,52]
446 ; CHECK-NEXT:    retq
447   %vecinit0.i = insertelement <8 x i8> undef, i8       52, i32 0
448   %vecinit1.i = insertelement <8 x i8> %vecinit0.i, i8 52, i32 1
449   %vecinit2.i = insertelement <8 x i8> %vecinit1.i, i8 52, i32 2
450   %vecinit3.i = insertelement <8 x i8> %vecinit2.i, i8 52, i32 3
451   %vecinit4.i = insertelement <8 x i8> %vecinit3.i, i8 52, i32 4
452   %vecinit5.i = insertelement <8 x i8> %vecinit4.i, i8 52, i32 5
453   %vecinit6.i = insertelement <8 x i8> %vecinit5.i, i8 52, i32 6
454   %vecinit7.i = insertelement <8 x i8> %vecinit6.i, i8 52, i32 7
455   ret <8 x i8> %vecinit7.i
456 }
457
458
459 define void @crash() nounwind alwaysinline {
460 ; CHECK-LABEL: crash:
461 ; CHECK:       ## BB#0: ## %WGLoopsEntry
462 ; CHECK-NEXT:    xorl %eax, %eax
463 ; CHECK-NEXT:    testb %al, %al
464 ; CHECK-NEXT:    je LBB31_1
465 ; CHECK-NEXT:  ## BB#2: ## %ret
466 ; CHECK-NEXT:    retq
467 ; CHECK-NEXT:    .align 4, 0x90
468 ; CHECK-NEXT:  LBB31_1: ## %footer349VF
469 ; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1
470 ; CHECK-NEXT:    jmp LBB31_1
471 WGLoopsEntry:
472   br i1 undef, label %ret, label %footer329VF
473
474 footer329VF:
475   %A.0.inVF = fmul float undef, 6.553600e+04
476   %B.0.in407VF = fmul <8 x float> undef, <float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04>
477   %A.0VF = fptosi float %A.0.inVF to i32
478   %B.0408VF = fptosi <8 x float> %B.0.in407VF to <8 x i32>
479   %0 = and <8 x i32> %B.0408VF, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
480   %1 = and i32 %A.0VF, 65535
481   %temp1098VF = insertelement <8 x i32> undef, i32 %1, i32 0
482   %vector1099VF = shufflevector <8 x i32> %temp1098VF, <8 x i32> undef, <8 x i32> zeroinitializer
483   br i1 undef, label %preload1201VF, label %footer349VF
484
485 preload1201VF:
486   br label %footer349VF
487
488 footer349VF:
489   %2 = mul nsw <8 x i32> undef, %0
490   %3 = mul nsw <8 x i32> undef, %vector1099VF
491   br label %footer329VF
492
493 ret:
494   ret void
495 }
496
497 define <8 x i32> @_inreg0(i32 %scalar) nounwind uwtable readnone ssp {
498 ; CHECK-LABEL: _inreg0:
499 ; CHECK:       ## BB#0:
500 ; CHECK-NEXT:    vmovd %edi, %xmm0
501 ; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0
502 ; CHECK-NEXT:    retq
503   %in = insertelement <8 x i32> undef, i32 %scalar, i32 0
504   %wide = shufflevector <8 x i32> %in, <8 x i32> undef, <8 x i32> zeroinitializer
505   ret <8 x i32> %wide
506 }
507
508 define <8 x float> @_inreg1(float %scalar) nounwind uwtable readnone ssp {
509 ; CHECK-LABEL: _inreg1:
510 ; CHECK:       ## BB#0:
511 ; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0
512 ; CHECK-NEXT:    retq
513   %in = insertelement <8 x float> undef, float %scalar, i32 0
514   %wide = shufflevector <8 x float> %in, <8 x float> undef, <8 x i32> zeroinitializer
515   ret <8 x float> %wide
516 }
517
518 define <4 x float> @_inreg2(float %scalar) nounwind uwtable readnone ssp {
519 ; CHECK-LABEL: _inreg2:
520 ; CHECK:       ## BB#0:
521 ; CHECK-NEXT:    vbroadcastss %xmm0, %xmm0
522 ; CHECK-NEXT:    retq
523   %in = insertelement <4 x float> undef, float %scalar, i32 0
524   %wide = shufflevector <4 x float> %in, <4 x float> undef, <4 x i32> zeroinitializer
525   ret <4 x float> %wide
526 }
527
528 define <4 x double> @_inreg3(double %scalar) nounwind uwtable readnone ssp {
529 ; CHECK-LABEL: _inreg3:
530 ; CHECK:       ## BB#0:
531 ; CHECK-NEXT:    vbroadcastsd %xmm0, %ymm0
532 ; CHECK-NEXT:    retq
533   %in = insertelement <4 x double> undef, double %scalar, i32 0
534   %wide = shufflevector <4 x double> %in, <4 x double> undef, <4 x i32> zeroinitializer
535   ret <4 x double> %wide
536 }
537
538 define   <8 x float> @_inreg8xfloat(<8 x float> %a) {
539 ; CHECK-LABEL: _inreg8xfloat:
540 ; CHECK:       ## BB#0:
541 ; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0
542 ; CHECK-NEXT:    retq
543   %b = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> zeroinitializer
544   ret <8 x float> %b
545 }
546
547 define   <4 x float> @_inreg4xfloat(<4 x float> %a) {
548 ; CHECK-LABEL: _inreg4xfloat:
549 ; CHECK:       ## BB#0:
550 ; CHECK-NEXT:    vbroadcastss %xmm0, %xmm0
551 ; CHECK-NEXT:    retq
552   %b = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> zeroinitializer
553   ret <4 x float> %b
554 }
555
556 define   <16 x i16> @_inreg16xi16(<16 x i16> %a) {
557 ; CHECK-LABEL: _inreg16xi16:
558 ; CHECK:       ## BB#0:
559 ; CHECK-NEXT:    vpbroadcastw %xmm0, %ymm0
560 ; CHECK-NEXT:    retq
561   %b = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> zeroinitializer
562   ret <16 x i16> %b
563 }
564
565 define   <8 x i16> @_inreg8xi16(<8 x i16> %a) {
566 ; CHECK-LABEL: _inreg8xi16:
567 ; CHECK:       ## BB#0:
568 ; CHECK-NEXT:    vpbroadcastw %xmm0, %xmm0
569 ; CHECK-NEXT:    retq
570   %b = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> zeroinitializer
571   ret <8 x i16> %b
572 }
573
574 define   <4 x i64> @_inreg4xi64(<4 x i64> %a) {
575 ; CHECK-LABEL: _inreg4xi64:
576 ; CHECK:       ## BB#0:
577 ; CHECK-NEXT:    vbroadcastsd %xmm0, %ymm0
578 ; CHECK-NEXT:    retq
579   %b = shufflevector <4 x i64> %a, <4 x i64> undef, <4 x i32> zeroinitializer
580   ret <4 x i64> %b
581 }
582
583 define   <2 x i64> @_inreg2xi64(<2 x i64> %a) {
584 ; CHECK-LABEL: _inreg2xi64:
585 ; CHECK:       ## BB#0:
586 ; CHECK-NEXT:    vpbroadcastq %xmm0, %xmm0
587 ; CHECK-NEXT:    retq
588   %b = shufflevector <2 x i64> %a, <2 x i64> undef, <2 x i32> zeroinitializer
589   ret <2 x i64> %b
590 }
591
592 define   <4 x double> @_inreg4xdouble(<4 x double> %a) {
593 ; CHECK-LABEL: _inreg4xdouble:
594 ; CHECK:       ## BB#0:
595 ; CHECK-NEXT:    vbroadcastsd %xmm0, %ymm0
596 ; CHECK-NEXT:    retq
597   %b = shufflevector <4 x double> %a, <4 x double> undef, <4 x i32> zeroinitializer
598   ret <4 x double> %b
599 }
600
601 define   <2 x double> @_inreg2xdouble(<2 x double> %a) {
602 ; CHECK-LABEL: _inreg2xdouble:
603 ; CHECK:       ## BB#0:
604 ; CHECK-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
605 ; CHECK-NEXT:    retq
606   %b = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> zeroinitializer
607   ret <2 x double> %b
608 }
609
610 define   <8 x i32> @_inreg8xi32(<8 x i32> %a) {
611 ; CHECK-LABEL: _inreg8xi32:
612 ; CHECK:       ## BB#0:
613 ; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0
614 ; CHECK-NEXT:    retq
615   %b = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> zeroinitializer
616   ret <8 x i32> %b
617 }
618
619 define   <4 x i32> @_inreg4xi32(<4 x i32> %a) {
620 ; CHECK-LABEL: _inreg4xi32:
621 ; CHECK:       ## BB#0:
622 ; CHECK-NEXT:    vbroadcastss %xmm0, %xmm0
623 ; CHECK-NEXT:    retq
624   %b = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> zeroinitializer
625   ret <4 x i32> %b
626 }
627
628 define   <32 x i8> @_inreg32xi8(<32 x i8> %a) {
629 ; CHECK-LABEL: _inreg32xi8:
630 ; CHECK:       ## BB#0:
631 ; CHECK-NEXT:    vpbroadcastb %xmm0, %ymm0
632 ; CHECK-NEXT:    retq
633   %b = shufflevector <32 x i8> %a, <32 x i8> undef, <32 x i32> zeroinitializer
634   ret <32 x i8> %b
635 }
636
637 define   <16 x i8> @_inreg16xi8(<16 x i8> %a) {
638 ; CHECK-LABEL: _inreg16xi8:
639 ; CHECK:       ## BB#0:
640 ; CHECK-NEXT:    vpbroadcastb %xmm0, %xmm0
641 ; CHECK-NEXT:    retq
642   %b = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> zeroinitializer
643   ret <16 x i8> %b
644 }
645
646 ; These tests check that a vbroadcast instruction is used when we have a splat
647 ; formed from a concat_vectors (via the shufflevector) of two BUILD_VECTORs
648 ; (via the insertelements).
649
650 define <8 x float> @splat_concat1(float %f) {
651 ; CHECK-LABEL: splat_concat1:
652 ; CHECK:       ## BB#0:
653 ; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0
654 ; CHECK-NEXT:    retq
655   %1 = insertelement <4 x float> undef, float %f, i32 0
656   %2 = insertelement <4 x float> %1, float %f, i32 1
657   %3 = insertelement <4 x float> %2, float %f, i32 2
658   %4 = insertelement <4 x float> %3, float %f, i32 3
659   %5 = shufflevector <4 x float> %4, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
660   ret <8 x float> %5
661 }
662
663 define <8 x float> @splat_concat2(float %f) {
664 ; CHECK-LABEL: splat_concat2:
665 ; CHECK:       ## BB#0:
666 ; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0
667 ; CHECK-NEXT:    retq
668   %1 = insertelement <4 x float> undef, float %f, i32 0
669   %2 = insertelement <4 x float> %1, float %f, i32 1
670   %3 = insertelement <4 x float> %2, float %f, i32 2
671   %4 = insertelement <4 x float> %3, float %f, i32 3
672   %5 = insertelement <4 x float> undef, float %f, i32 0
673   %6 = insertelement <4 x float> %5, float %f, i32 1
674   %7 = insertelement <4 x float> %6, float %f, i32 2
675   %8 = insertelement <4 x float> %7, float %f, i32 3
676   %9 = shufflevector <4 x float> %4, <4 x float> %8, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
677   ret <8 x float> %9
678 }
679
680 define <4 x double> @splat_concat3(double %d) {
681 ; CHECK-LABEL: splat_concat3:
682 ; CHECK:       ## BB#0:
683 ; CHECK-NEXT:    vbroadcastsd %xmm0, %ymm0
684 ; CHECK-NEXT:    retq
685   %1 = insertelement <2 x double> undef, double %d, i32 0
686   %2 = insertelement <2 x double> %1, double %d, i32 1
687   %3 = shufflevector <2 x double> %2, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
688   ret <4 x double> %3
689 }
690
691 define <4 x double> @splat_concat4(double %d) {
692 ; CHECK-LABEL: splat_concat4:
693 ; CHECK:       ## BB#0:
694 ; CHECK-NEXT:    vbroadcastsd %xmm0, %ymm0
695 ; CHECK-NEXT:    retq
696   %1 = insertelement <2 x double> undef, double %d, i32 0
697   %2 = insertelement <2 x double> %1, double %d, i32 1
698   %3 = insertelement <2 x double> undef, double %d, i32 0
699   %4 = insertelement <2 x double> %3, double %d, i32 1
700   %5 = shufflevector <2 x double> %2, <2 x double> %4, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
701   ret <4 x double> %5
702 }
703
704 ; Test cases for <rdar://problem/16074331>.
705 ; Instruction selection for broacast instruction fails if
706 ; the load cannot be folded into the broadcast.
707 ; This happens if the load has initial one use but other uses are
708 ; created later, or if selection DAG cannot prove that folding the
709 ; load will not create a cycle in the DAG.
710 ; Those test cases exerce the latter.
711
712 ; CHECK-LABEL: isel_crash_16b
713 ; CHECK: vpbroadcastb {{[^,]+}}, %xmm{{[0-9]+}}
714 ; CHECK: ret
715 define void @isel_crash_16b(i8* %cV_R.addr) {
716 eintry:
717   %__a.addr.i = alloca <2 x i64>, align 16
718   %__b.addr.i = alloca <2 x i64>, align 16
719   %vCr = alloca <2 x i64>, align 16
720   store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16
721   %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16
722   %tmp2 = load i8, i8* %cV_R.addr, align 4
723   %splat.splatinsert = insertelement <16 x i8> undef, i8 %tmp2, i32 0
724   %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer
725   %tmp3 = bitcast <16 x i8> %splat.splat to <2 x i64>
726   store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16
727   store <2 x i64> %tmp3, <2 x i64>* %__b.addr.i, align 16
728   ret void
729 }
730
731 ; CHECK-LABEL: isel_crash_32b
732 ; CHECK: vpbroadcastb {{[^,]+}}, %ymm{{[0-9]+}}
733 ; CHECK: ret
734 define void @isel_crash_32b(i8* %cV_R.addr) {
735 eintry:
736   %__a.addr.i = alloca <4 x i64>, align 16
737   %__b.addr.i = alloca <4 x i64>, align 16
738   %vCr = alloca <4 x i64>, align 16
739   store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16
740   %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16
741   %tmp2 = load i8, i8* %cV_R.addr, align 4
742   %splat.splatinsert = insertelement <32 x i8> undef, i8 %tmp2, i32 0
743   %splat.splat = shufflevector <32 x i8> %splat.splatinsert, <32 x i8> undef, <32 x i32> zeroinitializer
744   %tmp3 = bitcast <32 x i8> %splat.splat to <4 x i64>
745   store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16
746   store <4 x i64> %tmp3, <4 x i64>* %__b.addr.i, align 16
747   ret void
748 }
749
750 ; CHECK-LABEL: isel_crash_8w
751 ; CHECK: vpbroadcastw {{[^,]+}}, %xmm{{[0-9]+}}
752 ; CHECK: ret
753 define void @isel_crash_8w(i16* %cV_R.addr) {
754 entry:
755   %__a.addr.i = alloca <2 x i64>, align 16
756   %__b.addr.i = alloca <2 x i64>, align 16
757   %vCr = alloca <2 x i64>, align 16
758   store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16
759   %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16
760   %tmp2 = load i16, i16* %cV_R.addr, align 4
761   %splat.splatinsert = insertelement <8 x i16> undef, i16 %tmp2, i32 0
762   %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer
763   %tmp3 = bitcast <8 x i16> %splat.splat to <2 x i64>
764   store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16
765   store <2 x i64> %tmp3, <2 x i64>* %__b.addr.i, align 16
766   ret void
767 }
768
769 ; CHECK-LABEL: isel_crash_16w
770 ; CHECK: vpbroadcastw {{[^,]+}}, %ymm{{[0-9]+}}
771 ; CHECK: ret
772 define void @isel_crash_16w(i16* %cV_R.addr) {
773 eintry:
774   %__a.addr.i = alloca <4 x i64>, align 16
775   %__b.addr.i = alloca <4 x i64>, align 16
776   %vCr = alloca <4 x i64>, align 16
777   store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16
778   %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16
779   %tmp2 = load i16, i16* %cV_R.addr, align 4
780   %splat.splatinsert = insertelement <16 x i16> undef, i16 %tmp2, i32 0
781   %splat.splat = shufflevector <16 x i16> %splat.splatinsert, <16 x i16> undef, <16 x i32> zeroinitializer
782   %tmp3 = bitcast <16 x i16> %splat.splat to <4 x i64>
783   store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16
784   store <4 x i64> %tmp3, <4 x i64>* %__b.addr.i, align 16
785   ret void
786 }
787
788 ; CHECK-LABEL: isel_crash_4d
789 ; CHECK: vbroadcastss {{[^,]+}}, %xmm{{[0-9]+}}
790 ; CHECK: ret
791 define void @isel_crash_4d(i32* %cV_R.addr) {
792 entry:
793   %__a.addr.i = alloca <2 x i64>, align 16
794   %__b.addr.i = alloca <2 x i64>, align 16
795   %vCr = alloca <2 x i64>, align 16
796   store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16
797   %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16
798   %tmp2 = load i32, i32* %cV_R.addr, align 4
799   %splat.splatinsert = insertelement <4 x i32> undef, i32 %tmp2, i32 0
800   %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
801   %tmp3 = bitcast <4 x i32> %splat.splat to <2 x i64>
802   store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16
803   store <2 x i64> %tmp3, <2 x i64>* %__b.addr.i, align 16
804   ret void
805 }
806
807 ; CHECK-LABEL: isel_crash_8d
808 ; CHECK: vbroadcastss {{[^,]+}}, %ymm{{[0-9]+}}
809 ; CHECK: ret
810 define void @isel_crash_8d(i32* %cV_R.addr) {
811 eintry:
812   %__a.addr.i = alloca <4 x i64>, align 16
813   %__b.addr.i = alloca <4 x i64>, align 16
814   %vCr = alloca <4 x i64>, align 16
815   store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16
816   %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16
817   %tmp2 = load i32, i32* %cV_R.addr, align 4
818   %splat.splatinsert = insertelement <8 x i32> undef, i32 %tmp2, i32 0
819   %splat.splat = shufflevector <8 x i32> %splat.splatinsert, <8 x i32> undef, <8 x i32> zeroinitializer
820   %tmp3 = bitcast <8 x i32> %splat.splat to <4 x i64>
821   store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16
822   store <4 x i64> %tmp3, <4 x i64>* %__b.addr.i, align 16
823   ret void
824 }
825
826 ; CHECK-LABEL: isel_crash_2q
827 ; CHECK: vpbroadcastq {{[^,]+}}, %xmm{{[0-9]+}}
828 ; CHECK: ret
829 define void @isel_crash_2q(i64* %cV_R.addr) {
830 entry:
831   %__a.addr.i = alloca <2 x i64>, align 16
832   %__b.addr.i = alloca <2 x i64>, align 16
833   %vCr = alloca <2 x i64>, align 16
834   store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16
835   %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16
836   %tmp2 = load i64, i64* %cV_R.addr, align 4
837   %splat.splatinsert = insertelement <2 x i64> undef, i64 %tmp2, i32 0
838   %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
839   store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16
840   store <2 x i64> %splat.splat, <2 x i64>* %__b.addr.i, align 16
841   ret void
842 }
843
844 ; CHECK-LABEL: isel_crash_4q
845 ; CHECK: vbroadcastsd {{[^,]+}}, %ymm{{[0-9]+}}
846 ; CHECK: ret
847 define void @isel_crash_4q(i64* %cV_R.addr) {
848 eintry:
849   %__a.addr.i = alloca <4 x i64>, align 16
850   %__b.addr.i = alloca <4 x i64>, align 16
851   %vCr = alloca <4 x i64>, align 16
852   store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16
853   %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16
854   %tmp2 = load i64, i64* %cV_R.addr, align 4
855   %splat.splatinsert = insertelement <4 x i64> undef, i64 %tmp2, i32 0
856   %splat.splat = shufflevector <4 x i64> %splat.splatinsert, <4 x i64> undef, <4 x i32> zeroinitializer
857   store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16
858   store <4 x i64> %splat.splat, <4 x i64>* %__b.addr.i, align 16
859   ret void
860 }