xref: /llvm-project/llvm/test/CodeGen/AArch64/phi.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=aarch64 -global-isel=0 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3; RUN: llc -mtriple=aarch64 -global-isel=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4
5define i8 @ti8(i1 %c, ptr %p, i8 %a, i8 %b) {
6; CHECK-SD-LABEL: ti8:
7; CHECK-SD:       // %bb.0: // %entry
8; CHECK-SD-NEXT:    tbz w0, #0, .LBB0_2
9; CHECK-SD-NEXT:  // %bb.1: // %t
10; CHECK-SD-NEXT:    mov w3, w2
11; CHECK-SD-NEXT:    str wzr, [x1]
12; CHECK-SD-NEXT:  .LBB0_2: // %e
13; CHECK-SD-NEXT:    mov w0, w3
14; CHECK-SD-NEXT:    ret
15;
16; CHECK-GI-LABEL: ti8:
17; CHECK-GI:       // %bb.0: // %entry
18; CHECK-GI-NEXT:    mov w8, w0
19; CHECK-GI-NEXT:    mov w0, w3
20; CHECK-GI-NEXT:    tbz w8, #0, .LBB0_2
21; CHECK-GI-NEXT:  // %bb.1: // %t
22; CHECK-GI-NEXT:    mov w0, w2
23; CHECK-GI-NEXT:    str wzr, [x1]
24; CHECK-GI-NEXT:  .LBB0_2: // %e
25; CHECK-GI-NEXT:    ret
26entry:
27    br i1 %c, label %t, label %e
28t:
29    store i32 0, ptr %p
30    br label %e
31e:
32    %h = phi i8 [%a, %t], [%b, %entry]
33    ret i8 %h
34}
35
36define i16 @ti16(i1 %c, ptr %p, i16 %a, i16 %b) {
37; CHECK-SD-LABEL: ti16:
38; CHECK-SD:       // %bb.0: // %entry
39; CHECK-SD-NEXT:    tbz w0, #0, .LBB1_2
40; CHECK-SD-NEXT:  // %bb.1: // %t
41; CHECK-SD-NEXT:    mov w3, w2
42; CHECK-SD-NEXT:    str wzr, [x1]
43; CHECK-SD-NEXT:  .LBB1_2: // %e
44; CHECK-SD-NEXT:    mov w0, w3
45; CHECK-SD-NEXT:    ret
46;
47; CHECK-GI-LABEL: ti16:
48; CHECK-GI:       // %bb.0: // %entry
49; CHECK-GI-NEXT:    mov w8, w0
50; CHECK-GI-NEXT:    mov w0, w3
51; CHECK-GI-NEXT:    tbz w8, #0, .LBB1_2
52; CHECK-GI-NEXT:  // %bb.1: // %t
53; CHECK-GI-NEXT:    mov w0, w2
54; CHECK-GI-NEXT:    str wzr, [x1]
55; CHECK-GI-NEXT:  .LBB1_2: // %e
56; CHECK-GI-NEXT:    ret
57entry:
58    br i1 %c, label %t, label %e
59t:
60    store i32 0, ptr %p
61    br label %e
62e:
63    %h = phi i16 [%a, %t], [%b, %entry]
64    ret i16 %h
65}
66
67define i32 @ti32(i1 %c, ptr %p, i32 %a, i32 %b) {
68; CHECK-SD-LABEL: ti32:
69; CHECK-SD:       // %bb.0: // %entry
70; CHECK-SD-NEXT:    tbz w0, #0, .LBB2_2
71; CHECK-SD-NEXT:  // %bb.1: // %t
72; CHECK-SD-NEXT:    mov w3, w2
73; CHECK-SD-NEXT:    str wzr, [x1]
74; CHECK-SD-NEXT:  .LBB2_2: // %e
75; CHECK-SD-NEXT:    mov w0, w3
76; CHECK-SD-NEXT:    ret
77;
78; CHECK-GI-LABEL: ti32:
79; CHECK-GI:       // %bb.0: // %entry
80; CHECK-GI-NEXT:    mov w8, w0
81; CHECK-GI-NEXT:    mov w0, w3
82; CHECK-GI-NEXT:    tbz w8, #0, .LBB2_2
83; CHECK-GI-NEXT:  // %bb.1: // %t
84; CHECK-GI-NEXT:    mov w0, w2
85; CHECK-GI-NEXT:    str wzr, [x1]
86; CHECK-GI-NEXT:  .LBB2_2: // %e
87; CHECK-GI-NEXT:    ret
88entry:
89    br i1 %c, label %t, label %e
90t:
91    store i32 0, ptr %p
92    br label %e
93e:
94    %h = phi i32 [%a, %t], [%b, %entry]
95    ret i32 %h
96}
97
98define i64 @ti64(i1 %c, ptr %p, i64 %a, i64 %b) {
99; CHECK-SD-LABEL: ti64:
100; CHECK-SD:       // %bb.0: // %entry
101; CHECK-SD-NEXT:    tbz w0, #0, .LBB3_2
102; CHECK-SD-NEXT:  // %bb.1: // %t
103; CHECK-SD-NEXT:    mov x3, x2
104; CHECK-SD-NEXT:    str wzr, [x1]
105; CHECK-SD-NEXT:  .LBB3_2: // %e
106; CHECK-SD-NEXT:    mov x0, x3
107; CHECK-SD-NEXT:    ret
108;
109; CHECK-GI-LABEL: ti64:
110; CHECK-GI:       // %bb.0: // %entry
111; CHECK-GI-NEXT:    mov w8, w0
112; CHECK-GI-NEXT:    mov x0, x3
113; CHECK-GI-NEXT:    tbz w8, #0, .LBB3_2
114; CHECK-GI-NEXT:  // %bb.1: // %t
115; CHECK-GI-NEXT:    mov x0, x2
116; CHECK-GI-NEXT:    str wzr, [x1]
117; CHECK-GI-NEXT:  .LBB3_2: // %e
118; CHECK-GI-NEXT:    ret
119entry:
120    br i1 %c, label %t, label %e
121t:
122    store i32 0, ptr %p
123    br label %e
124e:
125    %h = phi i64 [%a, %t], [%b, %entry]
126    ret i64 %h
127}
128
129define i128 @ti128(i1 %c, ptr %p, i128 %a, i128 %b) {
130; CHECK-SD-LABEL: ti128:
131; CHECK-SD:       // %bb.0: // %entry
132; CHECK-SD-NEXT:    tbz w0, #0, .LBB4_2
133; CHECK-SD-NEXT:  // %bb.1: // %t
134; CHECK-SD-NEXT:    mov x4, x2
135; CHECK-SD-NEXT:    mov x5, x3
136; CHECK-SD-NEXT:    str wzr, [x1]
137; CHECK-SD-NEXT:  .LBB4_2: // %e
138; CHECK-SD-NEXT:    mov x0, x4
139; CHECK-SD-NEXT:    mov x1, x5
140; CHECK-SD-NEXT:    ret
141;
142; CHECK-GI-LABEL: ti128:
143; CHECK-GI:       // %bb.0: // %entry
144; CHECK-GI-NEXT:    mov w8, w0
145; CHECK-GI-NEXT:    mov x0, x4
146; CHECK-GI-NEXT:    tbz w8, #0, .LBB4_2
147; CHECK-GI-NEXT:  // %bb.1: // %t
148; CHECK-GI-NEXT:    mov x0, x2
149; CHECK-GI-NEXT:    mov x5, x3
150; CHECK-GI-NEXT:    str wzr, [x1]
151; CHECK-GI-NEXT:  .LBB4_2: // %e
152; CHECK-GI-NEXT:    mov x1, x5
153; CHECK-GI-NEXT:    ret
154entry:
155    br i1 %c, label %t, label %e
156t:
157    store i32 0, ptr %p
158    br label %e
159e:
160    %h = phi i128 [%a, %t], [%b, %entry]
161    ret i128 %h
162}
163
164define ptr @tp0(i1 %c, ptr %p, ptr %a, ptr %b) {
165; CHECK-SD-LABEL: tp0:
166; CHECK-SD:       // %bb.0: // %entry
167; CHECK-SD-NEXT:    tbz w0, #0, .LBB5_2
168; CHECK-SD-NEXT:  // %bb.1: // %t
169; CHECK-SD-NEXT:    mov x3, x2
170; CHECK-SD-NEXT:    str wzr, [x1]
171; CHECK-SD-NEXT:  .LBB5_2: // %e
172; CHECK-SD-NEXT:    mov x0, x3
173; CHECK-SD-NEXT:    ret
174;
175; CHECK-GI-LABEL: tp0:
176; CHECK-GI:       // %bb.0: // %entry
177; CHECK-GI-NEXT:    mov w8, w0
178; CHECK-GI-NEXT:    mov x0, x3
179; CHECK-GI-NEXT:    tbz w8, #0, .LBB5_2
180; CHECK-GI-NEXT:  // %bb.1: // %t
181; CHECK-GI-NEXT:    mov x0, x2
182; CHECK-GI-NEXT:    str wzr, [x1]
183; CHECK-GI-NEXT:  .LBB5_2: // %e
184; CHECK-GI-NEXT:    ret
185entry:
186    br i1 %c, label %t, label %e
187t:
188    store i32 0, ptr %p
189    br label %e
190e:
191    %h = phi ptr [%a, %t], [%b, %entry]
192    ret ptr %h
193}
194
195define half @tf16(i1 %c, ptr %p, half %a, half %b) {
196; CHECK-LABEL: tf16:
197; CHECK:       // %bb.0: // %entry
198; CHECK-NEXT:    tbz w0, #0, .LBB6_2
199; CHECK-NEXT:  // %bb.1: // %t
200; CHECK-NEXT:    fmov s1, s0
201; CHECK-NEXT:    str wzr, [x1]
202; CHECK-NEXT:  .LBB6_2: // %e
203; CHECK-NEXT:    fmov s0, s1
204; CHECK-NEXT:    ret
205entry:
206    br i1 %c, label %t, label %e
207t:
208    store i32 0, ptr %p
209    br label %e
210e:
211    %h = phi half [%a, %t], [%b, %entry]
212    ret half %h
213}
214
215define float @tf32(i1 %c, ptr %p, float %a, float %b) {
216; CHECK-LABEL: tf32:
217; CHECK:       // %bb.0: // %entry
218; CHECK-NEXT:    tbz w0, #0, .LBB7_2
219; CHECK-NEXT:  // %bb.1: // %t
220; CHECK-NEXT:    fmov s1, s0
221; CHECK-NEXT:    str wzr, [x1]
222; CHECK-NEXT:  .LBB7_2: // %e
223; CHECK-NEXT:    fmov s0, s1
224; CHECK-NEXT:    ret
225entry:
226    br i1 %c, label %t, label %e
227t:
228    store i32 0, ptr %p
229    br label %e
230e:
231    %h = phi float [%a, %t], [%b, %entry]
232    ret float %h
233}
234
235define double @tf64(i1 %c, ptr %p, double %a, double %b) {
236; CHECK-LABEL: tf64:
237; CHECK:       // %bb.0: // %entry
238; CHECK-NEXT:    tbz w0, #0, .LBB8_2
239; CHECK-NEXT:  // %bb.1: // %t
240; CHECK-NEXT:    fmov d1, d0
241; CHECK-NEXT:    str wzr, [x1]
242; CHECK-NEXT:  .LBB8_2: // %e
243; CHECK-NEXT:    fmov d0, d1
244; CHECK-NEXT:    ret
245entry:
246    br i1 %c, label %t, label %e
247t:
248    store i32 0, ptr %p
249    br label %e
250e:
251    %h = phi double [%a, %t], [%b, %entry]
252    ret double %h
253}
254
255define fp128 @tf128(i1 %c, ptr %p, fp128 %a, fp128 %b) {
256; CHECK-SD-LABEL: tf128:
257; CHECK-SD:       // %bb.0: // %entry
258; CHECK-SD-NEXT:    tbz w0, #0, .LBB9_2
259; CHECK-SD-NEXT:  // %bb.1: // %t
260; CHECK-SD-NEXT:    mov v1.16b, v0.16b
261; CHECK-SD-NEXT:    str wzr, [x1]
262; CHECK-SD-NEXT:  .LBB9_2: // %e
263; CHECK-SD-NEXT:    mov v0.16b, v1.16b
264; CHECK-SD-NEXT:    ret
265;
266; CHECK-GI-LABEL: tf128:
267; CHECK-GI:       // %bb.0: // %entry
268; CHECK-GI-NEXT:    tbz w0, #0, .LBB9_2
269; CHECK-GI-NEXT:  // %bb.1: // %t
270; CHECK-GI-NEXT:    mov d2, v0.d[1]
271; CHECK-GI-NEXT:    fmov d1, d0
272; CHECK-GI-NEXT:    str wzr, [x1]
273; CHECK-GI-NEXT:    b .LBB9_3
274; CHECK-GI-NEXT:  .LBB9_2:
275; CHECK-GI-NEXT:    mov d2, v1.d[1]
276; CHECK-GI-NEXT:  .LBB9_3: // %e
277; CHECK-GI-NEXT:    fmov x8, d1
278; CHECK-GI-NEXT:    mov v0.d[0], x8
279; CHECK-GI-NEXT:    fmov x8, d2
280; CHECK-GI-NEXT:    mov v0.d[1], x8
281; CHECK-GI-NEXT:    ret
282entry:
283    br i1 %c, label %t, label %e
284t:
285    store i32 0, ptr %p
286    br label %e
287e:
288    %h = phi fp128 [%a, %t], [%b, %entry]
289    ret fp128 %h
290}
291
292define <2 x i8> @tv2i8(i1 %c, ptr %p, <2 x i8> %a, <2 x i8> %b) {
293; CHECK-SD-LABEL: tv2i8:
294; CHECK-SD:       // %bb.0: // %entry
295; CHECK-SD-NEXT:    tbz w0, #0, .LBB10_2
296; CHECK-SD-NEXT:  // %bb.1: // %t
297; CHECK-SD-NEXT:    fmov d1, d0
298; CHECK-SD-NEXT:    str wzr, [x1]
299; CHECK-SD-NEXT:  .LBB10_2: // %e
300; CHECK-SD-NEXT:    fmov d0, d1
301; CHECK-SD-NEXT:    ret
302;
303; CHECK-GI-LABEL: tv2i8:
304; CHECK-GI:       // %bb.0: // %entry
305; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
306; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
307; CHECK-GI-NEXT:    tbz w0, #0, .LBB10_2
308; CHECK-GI-NEXT:  // %bb.1: // %t
309; CHECK-GI-NEXT:    mov w8, v0.s[1]
310; CHECK-GI-NEXT:    str wzr, [x1]
311; CHECK-GI-NEXT:    mov v0.b[1], w8
312; CHECK-GI-NEXT:    fmov d1, d0
313; CHECK-GI-NEXT:    b .LBB10_3
314; CHECK-GI-NEXT:  .LBB10_2:
315; CHECK-GI-NEXT:    mov w8, v1.s[1]
316; CHECK-GI-NEXT:    mov v1.b[1], w8
317; CHECK-GI-NEXT:  .LBB10_3: // %e
318; CHECK-GI-NEXT:    umov w8, v1.b[0]
319; CHECK-GI-NEXT:    umov w9, v1.b[1]
320; CHECK-GI-NEXT:    mov v0.s[0], w8
321; CHECK-GI-NEXT:    mov v0.s[1], w9
322; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
323; CHECK-GI-NEXT:    ret
324entry:
325    br i1 %c, label %t, label %e
326t:
327    store i32 0, ptr %p
328    br label %e
329e:
330    %h = phi <2 x i8> [%a, %t], [%b, %entry]
331    ret <2 x i8> %h
332}
333
334define <3 x i8> @tv3i8(i1 %c, ptr %p, <3 x i8> %a, <3 x i8> %b) {
335; CHECK-SD-LABEL: tv3i8:
336; CHECK-SD:       // %bb.0: // %entry
337; CHECK-SD-NEXT:    tbz w0, #0, .LBB11_2
338; CHECK-SD-NEXT:  // %bb.1: // %t
339; CHECK-SD-NEXT:    mov w5, w2
340; CHECK-SD-NEXT:    mov w6, w3
341; CHECK-SD-NEXT:    mov w7, w4
342; CHECK-SD-NEXT:    str wzr, [x1]
343; CHECK-SD-NEXT:  .LBB11_2: // %e
344; CHECK-SD-NEXT:    mov w0, w5
345; CHECK-SD-NEXT:    mov w1, w6
346; CHECK-SD-NEXT:    mov w2, w7
347; CHECK-SD-NEXT:    ret
348;
349; CHECK-GI-LABEL: tv3i8:
350; CHECK-GI:       // %bb.0: // %entry
351; CHECK-GI-NEXT:    tbz w0, #0, .LBB11_2
352; CHECK-GI-NEXT:  // %bb.1: // %t
353; CHECK-GI-NEXT:    fmov s0, w2
354; CHECK-GI-NEXT:    str wzr, [x1]
355; CHECK-GI-NEXT:    mov v0.b[1], w3
356; CHECK-GI-NEXT:    mov v0.b[2], w4
357; CHECK-GI-NEXT:    b .LBB11_3
358; CHECK-GI-NEXT:  .LBB11_2:
359; CHECK-GI-NEXT:    fmov s0, w5
360; CHECK-GI-NEXT:    mov v0.b[1], w6
361; CHECK-GI-NEXT:    mov v0.b[2], w7
362; CHECK-GI-NEXT:  .LBB11_3: // %e
363; CHECK-GI-NEXT:    umov w0, v0.b[0]
364; CHECK-GI-NEXT:    umov w1, v0.b[1]
365; CHECK-GI-NEXT:    umov w2, v0.b[2]
366; CHECK-GI-NEXT:    ret
367entry:
368    br i1 %c, label %t, label %e
369t:
370    store i32 0, ptr %p
371    br label %e
372e:
373    %h = phi <3 x i8> [%a, %t], [%b, %entry]
374    ret <3 x i8> %h
375}
376
377define <4 x i8> @tv4i8(i1 %c, ptr %p, <4 x i8> %a, <4 x i8> %b) {
378; CHECK-SD-LABEL: tv4i8:
379; CHECK-SD:       // %bb.0: // %entry
380; CHECK-SD-NEXT:    tbz w0, #0, .LBB12_2
381; CHECK-SD-NEXT:  // %bb.1: // %t
382; CHECK-SD-NEXT:    fmov d1, d0
383; CHECK-SD-NEXT:    str wzr, [x1]
384; CHECK-SD-NEXT:  .LBB12_2: // %e
385; CHECK-SD-NEXT:    fmov d0, d1
386; CHECK-SD-NEXT:    ret
387;
388; CHECK-GI-LABEL: tv4i8:
389; CHECK-GI:       // %bb.0: // %entry
390; CHECK-GI-NEXT:    tbz w0, #0, .LBB12_2
391; CHECK-GI-NEXT:  // %bb.1: // %t
392; CHECK-GI-NEXT:    uzp1 v0.8b, v0.8b, v0.8b
393; CHECK-GI-NEXT:    str wzr, [x1]
394; CHECK-GI-NEXT:    ushll v0.8h, v0.8b, #0
395; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
396; CHECK-GI-NEXT:    ret
397; CHECK-GI-NEXT:  .LBB12_2:
398; CHECK-GI-NEXT:    uzp1 v0.8b, v1.8b, v0.8b
399; CHECK-GI-NEXT:    ushll v0.8h, v0.8b, #0
400; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
401; CHECK-GI-NEXT:    ret
402entry:
403    br i1 %c, label %t, label %e
404t:
405    store i32 0, ptr %p
406    br label %e
407e:
408    %h = phi <4 x i8> [%a, %t], [%b, %entry]
409    ret <4 x i8> %h
410}
411
412define <8 x i8> @tv8i8(i1 %c, ptr %p, <8 x i8> %a, <8 x i8> %b) {
413; CHECK-LABEL: tv8i8:
414; CHECK:       // %bb.0: // %entry
415; CHECK-NEXT:    tbz w0, #0, .LBB13_2
416; CHECK-NEXT:  // %bb.1: // %t
417; CHECK-NEXT:    fmov d1, d0
418; CHECK-NEXT:    str wzr, [x1]
419; CHECK-NEXT:  .LBB13_2: // %e
420; CHECK-NEXT:    fmov d0, d1
421; CHECK-NEXT:    ret
422entry:
423    br i1 %c, label %t, label %e
424t:
425    store i32 0, ptr %p
426    br label %e
427e:
428    %h = phi <8 x i8> [%a, %t], [%b, %entry]
429    ret <8 x i8> %h
430}
431
432define <16 x i8> @tv16i8(i1 %c, ptr %p, <16 x i8> %a, <16 x i8> %b) {
433; CHECK-LABEL: tv16i8:
434; CHECK:       // %bb.0: // %entry
435; CHECK-NEXT:    tbz w0, #0, .LBB14_2
436; CHECK-NEXT:  // %bb.1: // %t
437; CHECK-NEXT:    mov v1.16b, v0.16b
438; CHECK-NEXT:    str wzr, [x1]
439; CHECK-NEXT:  .LBB14_2: // %e
440; CHECK-NEXT:    mov v0.16b, v1.16b
441; CHECK-NEXT:    ret
442entry:
443    br i1 %c, label %t, label %e
444t:
445    store i32 0, ptr %p
446    br label %e
447e:
448    %h = phi <16 x i8> [%a, %t], [%b, %entry]
449    ret <16 x i8> %h
450}
451
452define <32 x i8> @tv32i8(i1 %c, ptr %p, <32 x i8> %a, <32 x i8> %b) {
453; CHECK-SD-LABEL: tv32i8:
454; CHECK-SD:       // %bb.0: // %entry
455; CHECK-SD-NEXT:    tbz w0, #0, .LBB15_2
456; CHECK-SD-NEXT:  // %bb.1: // %t
457; CHECK-SD-NEXT:    mov v2.16b, v0.16b
458; CHECK-SD-NEXT:    mov v3.16b, v1.16b
459; CHECK-SD-NEXT:    str wzr, [x1]
460; CHECK-SD-NEXT:  .LBB15_2: // %e
461; CHECK-SD-NEXT:    mov v0.16b, v2.16b
462; CHECK-SD-NEXT:    mov v1.16b, v3.16b
463; CHECK-SD-NEXT:    ret
464;
465; CHECK-GI-LABEL: tv32i8:
466; CHECK-GI:       // %bb.0: // %entry
467; CHECK-GI-NEXT:    mov v4.16b, v0.16b
468; CHECK-GI-NEXT:    mov v0.16b, v2.16b
469; CHECK-GI-NEXT:    tbz w0, #0, .LBB15_2
470; CHECK-GI-NEXT:  // %bb.1: // %t
471; CHECK-GI-NEXT:    mov v0.16b, v4.16b
472; CHECK-GI-NEXT:    mov v3.16b, v1.16b
473; CHECK-GI-NEXT:    str wzr, [x1]
474; CHECK-GI-NEXT:  .LBB15_2: // %e
475; CHECK-GI-NEXT:    mov v1.16b, v3.16b
476; CHECK-GI-NEXT:    ret
477entry:
478    br i1 %c, label %t, label %e
479t:
480    store i32 0, ptr %p
481    br label %e
482e:
483    %h = phi <32 x i8> [%a, %t], [%b, %entry]
484    ret <32 x i8> %h
485}
486
487define <2 x i16> @tv2i16(i1 %c, ptr %p, <2 x i16> %a, <2 x i16> %b) {
488; CHECK-SD-LABEL: tv2i16:
489; CHECK-SD:       // %bb.0: // %entry
490; CHECK-SD-NEXT:    tbz w0, #0, .LBB16_2
491; CHECK-SD-NEXT:  // %bb.1: // %t
492; CHECK-SD-NEXT:    fmov d1, d0
493; CHECK-SD-NEXT:    str wzr, [x1]
494; CHECK-SD-NEXT:  .LBB16_2: // %e
495; CHECK-SD-NEXT:    fmov d0, d1
496; CHECK-SD-NEXT:    ret
497;
498; CHECK-GI-LABEL: tv2i16:
499; CHECK-GI:       // %bb.0: // %entry
500; CHECK-GI-NEXT:    tbz w0, #0, .LBB16_2
501; CHECK-GI-NEXT:  // %bb.1: // %t
502; CHECK-GI-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
503; CHECK-GI-NEXT:    str wzr, [x1]
504; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
505; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
506; CHECK-GI-NEXT:    ret
507; CHECK-GI-NEXT:  .LBB16_2:
508; CHECK-GI-NEXT:    uzp1 v0.4h, v1.4h, v0.4h
509; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
510; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
511; CHECK-GI-NEXT:    ret
512entry:
513    br i1 %c, label %t, label %e
514t:
515    store i32 0, ptr %p
516    br label %e
517e:
518    %h = phi <2 x i16> [%a, %t], [%b, %entry]
519    ret <2 x i16> %h
520}
521
522define <3 x i16> @tv3i16(i1 %c, ptr %p, <3 x i16> %a, <3 x i16> %b) {
523; CHECK-LABEL: tv3i16:
524; CHECK:       // %bb.0: // %entry
525; CHECK-NEXT:    tbz w0, #0, .LBB17_2
526; CHECK-NEXT:  // %bb.1: // %t
527; CHECK-NEXT:    fmov d1, d0
528; CHECK-NEXT:    str wzr, [x1]
529; CHECK-NEXT:  .LBB17_2: // %e
530; CHECK-NEXT:    fmov d0, d1
531; CHECK-NEXT:    ret
532entry:
533    br i1 %c, label %t, label %e
534t:
535    store i32 0, ptr %p
536    br label %e
537e:
538    %h = phi <3 x i16> [%a, %t], [%b, %entry]
539    ret <3 x i16> %h
540}
541
542define <4 x i16> @tv4i16(i1 %c, ptr %p, <4 x i16> %a, <4 x i16> %b) {
543; CHECK-LABEL: tv4i16:
544; CHECK:       // %bb.0: // %entry
545; CHECK-NEXT:    tbz w0, #0, .LBB18_2
546; CHECK-NEXT:  // %bb.1: // %t
547; CHECK-NEXT:    fmov d1, d0
548; CHECK-NEXT:    str wzr, [x1]
549; CHECK-NEXT:  .LBB18_2: // %e
550; CHECK-NEXT:    fmov d0, d1
551; CHECK-NEXT:    ret
552entry:
553    br i1 %c, label %t, label %e
554t:
555    store i32 0, ptr %p
556    br label %e
557e:
558    %h = phi <4 x i16> [%a, %t], [%b, %entry]
559    ret <4 x i16> %h
560}
561
562define <8 x i16> @tv8i16(i1 %c, ptr %p, <8 x i16> %a, <8 x i16> %b) {
563; CHECK-LABEL: tv8i16:
564; CHECK:       // %bb.0: // %entry
565; CHECK-NEXT:    tbz w0, #0, .LBB19_2
566; CHECK-NEXT:  // %bb.1: // %t
567; CHECK-NEXT:    mov v1.16b, v0.16b
568; CHECK-NEXT:    str wzr, [x1]
569; CHECK-NEXT:  .LBB19_2: // %e
570; CHECK-NEXT:    mov v0.16b, v1.16b
571; CHECK-NEXT:    ret
572entry:
573    br i1 %c, label %t, label %e
574t:
575    store i32 0, ptr %p
576    br label %e
577e:
578    %h = phi <8 x i16> [%a, %t], [%b, %entry]
579    ret <8 x i16> %h
580}
581
582define <16 x i16> @tv16i16(i1 %c, ptr %p, <16 x i16> %a, <16 x i16> %b) {
583; CHECK-SD-LABEL: tv16i16:
584; CHECK-SD:       // %bb.0: // %entry
585; CHECK-SD-NEXT:    tbz w0, #0, .LBB20_2
586; CHECK-SD-NEXT:  // %bb.1: // %t
587; CHECK-SD-NEXT:    mov v2.16b, v0.16b
588; CHECK-SD-NEXT:    mov v3.16b, v1.16b
589; CHECK-SD-NEXT:    str wzr, [x1]
590; CHECK-SD-NEXT:  .LBB20_2: // %e
591; CHECK-SD-NEXT:    mov v0.16b, v2.16b
592; CHECK-SD-NEXT:    mov v1.16b, v3.16b
593; CHECK-SD-NEXT:    ret
594;
595; CHECK-GI-LABEL: tv16i16:
596; CHECK-GI:       // %bb.0: // %entry
597; CHECK-GI-NEXT:    mov v4.16b, v0.16b
598; CHECK-GI-NEXT:    mov v0.16b, v2.16b
599; CHECK-GI-NEXT:    tbz w0, #0, .LBB20_2
600; CHECK-GI-NEXT:  // %bb.1: // %t
601; CHECK-GI-NEXT:    mov v0.16b, v4.16b
602; CHECK-GI-NEXT:    mov v3.16b, v1.16b
603; CHECK-GI-NEXT:    str wzr, [x1]
604; CHECK-GI-NEXT:  .LBB20_2: // %e
605; CHECK-GI-NEXT:    mov v1.16b, v3.16b
606; CHECK-GI-NEXT:    ret
607entry:
608    br i1 %c, label %t, label %e
609t:
610    store i32 0, ptr %p
611    br label %e
612e:
613    %h = phi <16 x i16> [%a, %t], [%b, %entry]
614    ret <16 x i16> %h
615}
616
617define <2 x i32> @tv2i32(i1 %c, ptr %p, <2 x i32> %a, <2 x i32> %b) {
618; CHECK-LABEL: tv2i32:
619; CHECK:       // %bb.0: // %entry
620; CHECK-NEXT:    tbz w0, #0, .LBB21_2
621; CHECK-NEXT:  // %bb.1: // %t
622; CHECK-NEXT:    fmov d1, d0
623; CHECK-NEXT:    str wzr, [x1]
624; CHECK-NEXT:  .LBB21_2: // %e
625; CHECK-NEXT:    fmov d0, d1
626; CHECK-NEXT:    ret
627entry:
628    br i1 %c, label %t, label %e
629t:
630    store i32 0, ptr %p
631    br label %e
632e:
633    %h = phi <2 x i32> [%a, %t], [%b, %entry]
634    ret <2 x i32> %h
635}
636
637define <3 x i32> @tv3i32(i1 %c, ptr %p, <3 x i32> %a, <3 x i32> %b) {
638; CHECK-LABEL: tv3i32:
639; CHECK:       // %bb.0: // %entry
640; CHECK-NEXT:    tbz w0, #0, .LBB22_2
641; CHECK-NEXT:  // %bb.1: // %t
642; CHECK-NEXT:    mov v1.16b, v0.16b
643; CHECK-NEXT:    str wzr, [x1]
644; CHECK-NEXT:  .LBB22_2: // %e
645; CHECK-NEXT:    mov v0.16b, v1.16b
646; CHECK-NEXT:    ret
647entry:
648    br i1 %c, label %t, label %e
649t:
650    store i32 0, ptr %p
651    br label %e
652e:
653    %h = phi <3 x i32> [%a, %t], [%b, %entry]
654    ret <3 x i32> %h
655}
656
657define <4 x i32> @tv4i32(i1 %c, ptr %p, <4 x i32> %a, <4 x i32> %b) {
658; CHECK-LABEL: tv4i32:
659; CHECK:       // %bb.0: // %entry
660; CHECK-NEXT:    tbz w0, #0, .LBB23_2
661; CHECK-NEXT:  // %bb.1: // %t
662; CHECK-NEXT:    mov v1.16b, v0.16b
663; CHECK-NEXT:    str wzr, [x1]
664; CHECK-NEXT:  .LBB23_2: // %e
665; CHECK-NEXT:    mov v0.16b, v1.16b
666; CHECK-NEXT:    ret
667entry:
668    br i1 %c, label %t, label %e
669t:
670    store i32 0, ptr %p
671    br label %e
672e:
673    %h = phi <4 x i32> [%a, %t], [%b, %entry]
674    ret <4 x i32> %h
675}
676
677define <8 x i32> @tv8i32(i1 %c, ptr %p, <8 x i32> %a, <8 x i32> %b) {
678; CHECK-SD-LABEL: tv8i32:
679; CHECK-SD:       // %bb.0: // %entry
680; CHECK-SD-NEXT:    tbz w0, #0, .LBB24_2
681; CHECK-SD-NEXT:  // %bb.1: // %t
682; CHECK-SD-NEXT:    mov v2.16b, v0.16b
683; CHECK-SD-NEXT:    mov v3.16b, v1.16b
684; CHECK-SD-NEXT:    str wzr, [x1]
685; CHECK-SD-NEXT:  .LBB24_2: // %e
686; CHECK-SD-NEXT:    mov v0.16b, v2.16b
687; CHECK-SD-NEXT:    mov v1.16b, v3.16b
688; CHECK-SD-NEXT:    ret
689;
690; CHECK-GI-LABEL: tv8i32:
691; CHECK-GI:       // %bb.0: // %entry
692; CHECK-GI-NEXT:    mov v4.16b, v0.16b
693; CHECK-GI-NEXT:    mov v0.16b, v2.16b
694; CHECK-GI-NEXT:    tbz w0, #0, .LBB24_2
695; CHECK-GI-NEXT:  // %bb.1: // %t
696; CHECK-GI-NEXT:    mov v0.16b, v4.16b
697; CHECK-GI-NEXT:    mov v3.16b, v1.16b
698; CHECK-GI-NEXT:    str wzr, [x1]
699; CHECK-GI-NEXT:  .LBB24_2: // %e
700; CHECK-GI-NEXT:    mov v1.16b, v3.16b
701; CHECK-GI-NEXT:    ret
702entry:
703    br i1 %c, label %t, label %e
704t:
705    store i32 0, ptr %p
706    br label %e
707e:
708    %h = phi <8 x i32> [%a, %t], [%b, %entry]
709    ret <8 x i32> %h
710}
711
712define <2 x i64> @tv2i64(i1 %c, ptr %p, <2 x i64> %a, <2 x i64> %b) {
713; CHECK-LABEL: tv2i64:
714; CHECK:       // %bb.0: // %entry
715; CHECK-NEXT:    tbz w0, #0, .LBB25_2
716; CHECK-NEXT:  // %bb.1: // %t
717; CHECK-NEXT:    mov v1.16b, v0.16b
718; CHECK-NEXT:    str wzr, [x1]
719; CHECK-NEXT:  .LBB25_2: // %e
720; CHECK-NEXT:    mov v0.16b, v1.16b
721; CHECK-NEXT:    ret
722entry:
723    br i1 %c, label %t, label %e
724t:
725    store i32 0, ptr %p
726    br label %e
727e:
728    %h = phi <2 x i64> [%a, %t], [%b, %entry]
729    ret <2 x i64> %h
730}
731
732define <3 x i64> @tv3i64(i1 %c, ptr %p, <3 x i64> %a, <3 x i64> %b) {
733; CHECK-SD-LABEL: tv3i64:
734; CHECK-SD:       // %bb.0: // %entry
735; CHECK-SD-NEXT:    tbz w0, #0, .LBB26_2
736; CHECK-SD-NEXT:  // %bb.1: // %t
737; CHECK-SD-NEXT:    fmov d3, d0
738; CHECK-SD-NEXT:    fmov d4, d1
739; CHECK-SD-NEXT:    str wzr, [x1]
740; CHECK-SD-NEXT:    fmov d5, d2
741; CHECK-SD-NEXT:  .LBB26_2: // %e
742; CHECK-SD-NEXT:    fmov d0, d3
743; CHECK-SD-NEXT:    fmov d1, d4
744; CHECK-SD-NEXT:    fmov d2, d5
745; CHECK-SD-NEXT:    ret
746;
747; CHECK-GI-LABEL: tv3i64:
748; CHECK-GI:       // %bb.0: // %entry
749; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
750; CHECK-GI-NEXT:    // kill: def $d4 killed $d4 def $q4
751; CHECK-GI-NEXT:    tbz w0, #0, .LBB26_2
752; CHECK-GI-NEXT:  // %bb.1: // %t
753; CHECK-GI-NEXT:    fmov d6, d0
754; CHECK-GI-NEXT:    fmov d7, d2
755; CHECK-GI-NEXT:    str wzr, [x1]
756; CHECK-GI-NEXT:    mov v6.d[1], v1.d[0]
757; CHECK-GI-NEXT:    mov v2.16b, v7.16b
758; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
759; CHECK-GI-NEXT:    mov d1, v6.d[1]
760; CHECK-GI-NEXT:    mov v0.16b, v6.16b
761; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
762; CHECK-GI-NEXT:    ret
763; CHECK-GI-NEXT:  .LBB26_2:
764; CHECK-GI-NEXT:    fmov d0, d3
765; CHECK-GI-NEXT:    fmov d2, d5
766; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
767; CHECK-GI-NEXT:    mov v0.d[1], v4.d[0]
768; CHECK-GI-NEXT:    mov d1, v0.d[1]
769; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
770; CHECK-GI-NEXT:    ret
771entry:
772    br i1 %c, label %t, label %e
773t:
774    store i32 0, ptr %p
775    br label %e
776e:
777    %h = phi <3 x i64> [%a, %t], [%b, %entry]
778    ret <3 x i64> %h
779}
780
781define <4 x i64> @tv4i64(i1 %c, ptr %p, <4 x i64> %a, <4 x i64> %b) {
782; CHECK-SD-LABEL: tv4i64:
783; CHECK-SD:       // %bb.0: // %entry
784; CHECK-SD-NEXT:    tbz w0, #0, .LBB27_2
785; CHECK-SD-NEXT:  // %bb.1: // %t
786; CHECK-SD-NEXT:    mov v2.16b, v0.16b
787; CHECK-SD-NEXT:    mov v3.16b, v1.16b
788; CHECK-SD-NEXT:    str wzr, [x1]
789; CHECK-SD-NEXT:  .LBB27_2: // %e
790; CHECK-SD-NEXT:    mov v0.16b, v2.16b
791; CHECK-SD-NEXT:    mov v1.16b, v3.16b
792; CHECK-SD-NEXT:    ret
793;
794; CHECK-GI-LABEL: tv4i64:
795; CHECK-GI:       // %bb.0: // %entry
796; CHECK-GI-NEXT:    mov v4.16b, v0.16b
797; CHECK-GI-NEXT:    mov v0.16b, v2.16b
798; CHECK-GI-NEXT:    tbz w0, #0, .LBB27_2
799; CHECK-GI-NEXT:  // %bb.1: // %t
800; CHECK-GI-NEXT:    mov v0.16b, v4.16b
801; CHECK-GI-NEXT:    mov v3.16b, v1.16b
802; CHECK-GI-NEXT:    str wzr, [x1]
803; CHECK-GI-NEXT:  .LBB27_2: // %e
804; CHECK-GI-NEXT:    mov v1.16b, v3.16b
805; CHECK-GI-NEXT:    ret
806entry:
807    br i1 %c, label %t, label %e
808t:
809    store i32 0, ptr %p
810    br label %e
811e:
812    %h = phi <4 x i64> [%a, %t], [%b, %entry]
813    ret <4 x i64> %h
814}
815
816define <2 x i128> @tv2i128(i1 %c, ptr %p, <2 x i128> %a, <2 x i128> %b) {
817; CHECK-SD-LABEL: tv2i128:
818; CHECK-SD:       // %bb.0: // %entry
819; CHECK-SD-NEXT:    tbz w0, #0, .LBB28_2
820; CHECK-SD-NEXT:  // %bb.1: // %t
821; CHECK-SD-NEXT:    mov x6, x2
822; CHECK-SD-NEXT:    mov x7, x3
823; CHECK-SD-NEXT:    str wzr, [x1]
824; CHECK-SD-NEXT:    b .LBB28_3
825; CHECK-SD-NEXT:  .LBB28_2:
826; CHECK-SD-NEXT:    ldp x4, x5, [sp]
827; CHECK-SD-NEXT:  .LBB28_3: // %e
828; CHECK-SD-NEXT:    mov x0, x6
829; CHECK-SD-NEXT:    mov x1, x7
830; CHECK-SD-NEXT:    mov x2, x4
831; CHECK-SD-NEXT:    mov x3, x5
832; CHECK-SD-NEXT:    ret
833;
834; CHECK-GI-LABEL: tv2i128:
835; CHECK-GI:       // %bb.0: // %entry
836; CHECK-GI-NEXT:    tbz w0, #0, .LBB28_2
837; CHECK-GI-NEXT:  // %bb.1: // %t
838; CHECK-GI-NEXT:    mov x9, x2
839; CHECK-GI-NEXT:    mov x10, x3
840; CHECK-GI-NEXT:    mov x2, x4
841; CHECK-GI-NEXT:    mov x3, x5
842; CHECK-GI-NEXT:    str wzr, [x1]
843; CHECK-GI-NEXT:    mov x0, x9
844; CHECK-GI-NEXT:    mov x1, x10
845; CHECK-GI-NEXT:    ret
846; CHECK-GI-NEXT:  .LBB28_2:
847; CHECK-GI-NEXT:    ldp x2, x3, [sp]
848; CHECK-GI-NEXT:    mov x0, x6
849; CHECK-GI-NEXT:    mov x1, x7
850; CHECK-GI-NEXT:    ret
851entry:
852    br i1 %c, label %t, label %e
853t:
854    store i32 0, ptr %p
855    br label %e
856e:
857    %h = phi <2 x i128> [%a, %t], [%b, %entry]
858    ret <2 x i128> %h
859}
860
861define <2 x ptr> @tv2p0(i1 %c, ptr %p, <2 x ptr> %a, <2 x ptr> %b) {
862; CHECK-LABEL: tv2p0:
863; CHECK:       // %bb.0: // %entry
864; CHECK-NEXT:    tbz w0, #0, .LBB29_2
865; CHECK-NEXT:  // %bb.1: // %t
866; CHECK-NEXT:    mov v1.16b, v0.16b
867; CHECK-NEXT:    str wzr, [x1]
868; CHECK-NEXT:  .LBB29_2: // %e
869; CHECK-NEXT:    mov v0.16b, v1.16b
870; CHECK-NEXT:    ret
871entry:
872    br i1 %c, label %t, label %e
873t:
874    store i32 0, ptr %p
875    br label %e
876e:
877    %h = phi <2 x ptr> [%a, %t], [%b, %entry]
878    ret <2 x ptr> %h
879}
880
881define <3 x ptr> @tv3p0(i1 %c, ptr %p, <3 x ptr> %a, <3 x ptr> %b) {
882; CHECK-SD-LABEL: tv3p0:
883; CHECK-SD:       // %bb.0: // %entry
884; CHECK-SD-NEXT:    tbz w0, #0, .LBB30_2
885; CHECK-SD-NEXT:  // %bb.1: // %t
886; CHECK-SD-NEXT:    fmov d3, d0
887; CHECK-SD-NEXT:    fmov d4, d1
888; CHECK-SD-NEXT:    str wzr, [x1]
889; CHECK-SD-NEXT:    fmov d5, d2
890; CHECK-SD-NEXT:  .LBB30_2: // %e
891; CHECK-SD-NEXT:    fmov d0, d3
892; CHECK-SD-NEXT:    fmov d1, d4
893; CHECK-SD-NEXT:    fmov d2, d5
894; CHECK-SD-NEXT:    ret
895;
896; CHECK-GI-LABEL: tv3p0:
897; CHECK-GI:       // %bb.0: // %entry
898; CHECK-GI-NEXT:    tbz w0, #0, .LBB30_2
899; CHECK-GI-NEXT:  // %bb.1: // %t
900; CHECK-GI-NEXT:    fmov x8, d0
901; CHECK-GI-NEXT:    fmov x9, d2
902; CHECK-GI-NEXT:    str wzr, [x1]
903; CHECK-GI-NEXT:    mov v0.d[0], x8
904; CHECK-GI-NEXT:    fmov x8, d1
905; CHECK-GI-NEXT:    b .LBB30_3
906; CHECK-GI-NEXT:  .LBB30_2:
907; CHECK-GI-NEXT:    fmov x8, d3
908; CHECK-GI-NEXT:    fmov x9, d5
909; CHECK-GI-NEXT:    mov v0.d[0], x8
910; CHECK-GI-NEXT:    fmov x8, d4
911; CHECK-GI-NEXT:  .LBB30_3: // %e
912; CHECK-GI-NEXT:    mov v1.d[0], x9
913; CHECK-GI-NEXT:    mov v0.d[1], x8
914; CHECK-GI-NEXT:    mov d2, v0.d[1]
915; CHECK-GI-NEXT:    fmov x10, d1
916; CHECK-GI-NEXT:    fmov d1, d2
917; CHECK-GI-NEXT:    fmov d2, x10
918; CHECK-GI-NEXT:    ret
919entry:
920    br i1 %c, label %t, label %e
921t:
922    store i32 0, ptr %p
923    br label %e
924e:
925    %h = phi <3 x ptr> [%a, %t], [%b, %entry]
926    ret <3 x ptr> %h
927}
928
929define <4 x ptr> @tv4p0(i1 %c, ptr %p, <4 x ptr> %a, <4 x ptr> %b) {
930; CHECK-SD-LABEL: tv4p0:
931; CHECK-SD:       // %bb.0: // %entry
932; CHECK-SD-NEXT:    tbz w0, #0, .LBB31_2
933; CHECK-SD-NEXT:  // %bb.1: // %t
934; CHECK-SD-NEXT:    mov v2.16b, v0.16b
935; CHECK-SD-NEXT:    mov v3.16b, v1.16b
936; CHECK-SD-NEXT:    str wzr, [x1]
937; CHECK-SD-NEXT:  .LBB31_2: // %e
938; CHECK-SD-NEXT:    mov v0.16b, v2.16b
939; CHECK-SD-NEXT:    mov v1.16b, v3.16b
940; CHECK-SD-NEXT:    ret
941;
942; CHECK-GI-LABEL: tv4p0:
943; CHECK-GI:       // %bb.0: // %entry
944; CHECK-GI-NEXT:    mov v4.16b, v0.16b
945; CHECK-GI-NEXT:    mov v0.16b, v2.16b
946; CHECK-GI-NEXT:    tbz w0, #0, .LBB31_2
947; CHECK-GI-NEXT:  // %bb.1: // %t
948; CHECK-GI-NEXT:    mov v0.16b, v4.16b
949; CHECK-GI-NEXT:    mov v3.16b, v1.16b
950; CHECK-GI-NEXT:    str wzr, [x1]
951; CHECK-GI-NEXT:  .LBB31_2: // %e
952; CHECK-GI-NEXT:    mov v1.16b, v3.16b
953; CHECK-GI-NEXT:    ret
954entry:
955    br i1 %c, label %t, label %e
956t:
957    store i32 0, ptr %p
958    br label %e
959e:
960    %h = phi <4 x ptr> [%a, %t], [%b, %entry]
961    ret <4 x ptr> %h
962}
963
964define <2 x half> @tv2f16(i1 %c, ptr %p, <2 x half> %a, <2 x half> %b) {
965; CHECK-LABEL: tv2f16:
966; CHECK:       // %bb.0: // %entry
967; CHECK-NEXT:    tbz w0, #0, .LBB32_2
968; CHECK-NEXT:  // %bb.1: // %t
969; CHECK-NEXT:    fmov d1, d0
970; CHECK-NEXT:    str wzr, [x1]
971; CHECK-NEXT:  .LBB32_2: // %e
972; CHECK-NEXT:    fmov d0, d1
973; CHECK-NEXT:    ret
974entry:
975    br i1 %c, label %t, label %e
976t:
977    store i32 0, ptr %p
978    br label %e
979e:
980    %h = phi <2 x half> [%a, %t], [%b, %entry]
981    ret <2 x half> %h
982}
983
984define <3 x half> @tv3f16(i1 %c, ptr %p, <3 x half> %a, <3 x half> %b) {
985; CHECK-LABEL: tv3f16:
986; CHECK:       // %bb.0: // %entry
987; CHECK-NEXT:    tbz w0, #0, .LBB33_2
988; CHECK-NEXT:  // %bb.1: // %t
989; CHECK-NEXT:    fmov d1, d0
990; CHECK-NEXT:    str wzr, [x1]
991; CHECK-NEXT:  .LBB33_2: // %e
992; CHECK-NEXT:    fmov d0, d1
993; CHECK-NEXT:    ret
994entry:
995    br i1 %c, label %t, label %e
996t:
997    store i32 0, ptr %p
998    br label %e
999e:
1000    %h = phi <3 x half> [%a, %t], [%b, %entry]
1001    ret <3 x half> %h
1002}
1003
1004define <4 x half> @tv4f16(i1 %c, ptr %p, <4 x half> %a, <4 x half> %b) {
1005; CHECK-LABEL: tv4f16:
1006; CHECK:       // %bb.0: // %entry
1007; CHECK-NEXT:    tbz w0, #0, .LBB34_2
1008; CHECK-NEXT:  // %bb.1: // %t
1009; CHECK-NEXT:    fmov d1, d0
1010; CHECK-NEXT:    str wzr, [x1]
1011; CHECK-NEXT:  .LBB34_2: // %e
1012; CHECK-NEXT:    fmov d0, d1
1013; CHECK-NEXT:    ret
1014entry:
1015    br i1 %c, label %t, label %e
1016t:
1017    store i32 0, ptr %p
1018    br label %e
1019e:
1020    %h = phi <4 x half> [%a, %t], [%b, %entry]
1021    ret <4 x half> %h
1022}
1023
1024define <8 x half> @tv8f16(i1 %c, ptr %p, <8 x half> %a, <8 x half> %b) {
1025; CHECK-LABEL: tv8f16:
1026; CHECK:       // %bb.0: // %entry
1027; CHECK-NEXT:    tbz w0, #0, .LBB35_2
1028; CHECK-NEXT:  // %bb.1: // %t
1029; CHECK-NEXT:    mov v1.16b, v0.16b
1030; CHECK-NEXT:    str wzr, [x1]
1031; CHECK-NEXT:  .LBB35_2: // %e
1032; CHECK-NEXT:    mov v0.16b, v1.16b
1033; CHECK-NEXT:    ret
1034entry:
1035    br i1 %c, label %t, label %e
1036t:
1037    store i32 0, ptr %p
1038    br label %e
1039e:
1040    %h = phi <8 x half> [%a, %t], [%b, %entry]
1041    ret <8 x half> %h
1042}
1043
1044define <16 x half> @tv16f16(i1 %c, ptr %p, <16 x half> %a, <16 x half> %b) {
1045; CHECK-SD-LABEL: tv16f16:
1046; CHECK-SD:       // %bb.0: // %entry
1047; CHECK-SD-NEXT:    tbz w0, #0, .LBB36_2
1048; CHECK-SD-NEXT:  // %bb.1: // %t
1049; CHECK-SD-NEXT:    mov v2.16b, v0.16b
1050; CHECK-SD-NEXT:    mov v3.16b, v1.16b
1051; CHECK-SD-NEXT:    str wzr, [x1]
1052; CHECK-SD-NEXT:  .LBB36_2: // %e
1053; CHECK-SD-NEXT:    mov v0.16b, v2.16b
1054; CHECK-SD-NEXT:    mov v1.16b, v3.16b
1055; CHECK-SD-NEXT:    ret
1056;
1057; CHECK-GI-LABEL: tv16f16:
1058; CHECK-GI:       // %bb.0: // %entry
1059; CHECK-GI-NEXT:    mov v4.16b, v0.16b
1060; CHECK-GI-NEXT:    mov v0.16b, v2.16b
1061; CHECK-GI-NEXT:    tbz w0, #0, .LBB36_2
1062; CHECK-GI-NEXT:  // %bb.1: // %t
1063; CHECK-GI-NEXT:    mov v0.16b, v4.16b
1064; CHECK-GI-NEXT:    mov v3.16b, v1.16b
1065; CHECK-GI-NEXT:    str wzr, [x1]
1066; CHECK-GI-NEXT:  .LBB36_2: // %e
1067; CHECK-GI-NEXT:    mov v1.16b, v3.16b
1068; CHECK-GI-NEXT:    ret
1069entry:
1070    br i1 %c, label %t, label %e
1071t:
1072    store i32 0, ptr %p
1073    br label %e
1074e:
1075    %h = phi <16 x half> [%a, %t], [%b, %entry]
1076    ret <16 x half> %h
1077}
1078
1079define <2 x float> @tv2f32(i1 %c, ptr %p, <2 x float> %a, <2 x float> %b) {
1080; CHECK-LABEL: tv2f32:
1081; CHECK:       // %bb.0: // %entry
1082; CHECK-NEXT:    tbz w0, #0, .LBB37_2
1083; CHECK-NEXT:  // %bb.1: // %t
1084; CHECK-NEXT:    fmov d1, d0
1085; CHECK-NEXT:    str wzr, [x1]
1086; CHECK-NEXT:  .LBB37_2: // %e
1087; CHECK-NEXT:    fmov d0, d1
1088; CHECK-NEXT:    ret
1089entry:
1090    br i1 %c, label %t, label %e
1091t:
1092    store i32 0, ptr %p
1093    br label %e
1094e:
1095    %h = phi <2 x float> [%a, %t], [%b, %entry]
1096    ret <2 x float> %h
1097}
1098
1099define <3 x float> @tv3f32(i1 %c, ptr %p, <3 x float> %a, <3 x float> %b) {
1100; CHECK-LABEL: tv3f32:
1101; CHECK:       // %bb.0: // %entry
1102; CHECK-NEXT:    tbz w0, #0, .LBB38_2
1103; CHECK-NEXT:  // %bb.1: // %t
1104; CHECK-NEXT:    mov v1.16b, v0.16b
1105; CHECK-NEXT:    str wzr, [x1]
1106; CHECK-NEXT:  .LBB38_2: // %e
1107; CHECK-NEXT:    mov v0.16b, v1.16b
1108; CHECK-NEXT:    ret
1109entry:
1110    br i1 %c, label %t, label %e
1111t:
1112    store i32 0, ptr %p
1113    br label %e
1114e:
1115    %h = phi <3 x float> [%a, %t], [%b, %entry]
1116    ret <3 x float> %h
1117}
1118
1119define <4 x float> @tv4f32(i1 %c, ptr %p, <4 x float> %a, <4 x float> %b) {
1120; CHECK-LABEL: tv4f32:
1121; CHECK:       // %bb.0: // %entry
1122; CHECK-NEXT:    tbz w0, #0, .LBB39_2
1123; CHECK-NEXT:  // %bb.1: // %t
1124; CHECK-NEXT:    mov v1.16b, v0.16b
1125; CHECK-NEXT:    str wzr, [x1]
1126; CHECK-NEXT:  .LBB39_2: // %e
1127; CHECK-NEXT:    mov v0.16b, v1.16b
1128; CHECK-NEXT:    ret
1129entry:
1130    br i1 %c, label %t, label %e
1131t:
1132    store i32 0, ptr %p
1133    br label %e
1134e:
1135    %h = phi <4 x float> [%a, %t], [%b, %entry]
1136    ret <4 x float> %h
1137}
1138
1139define <8 x float> @tv8f32(i1 %c, ptr %p, <8 x float> %a, <8 x float> %b) {
1140; CHECK-SD-LABEL: tv8f32:
1141; CHECK-SD:       // %bb.0: // %entry
1142; CHECK-SD-NEXT:    tbz w0, #0, .LBB40_2
1143; CHECK-SD-NEXT:  // %bb.1: // %t
1144; CHECK-SD-NEXT:    mov v2.16b, v0.16b
1145; CHECK-SD-NEXT:    mov v3.16b, v1.16b
1146; CHECK-SD-NEXT:    str wzr, [x1]
1147; CHECK-SD-NEXT:  .LBB40_2: // %e
1148; CHECK-SD-NEXT:    mov v0.16b, v2.16b
1149; CHECK-SD-NEXT:    mov v1.16b, v3.16b
1150; CHECK-SD-NEXT:    ret
1151;
1152; CHECK-GI-LABEL: tv8f32:
1153; CHECK-GI:       // %bb.0: // %entry
1154; CHECK-GI-NEXT:    mov v4.16b, v0.16b
1155; CHECK-GI-NEXT:    mov v0.16b, v2.16b
1156; CHECK-GI-NEXT:    tbz w0, #0, .LBB40_2
1157; CHECK-GI-NEXT:  // %bb.1: // %t
1158; CHECK-GI-NEXT:    mov v0.16b, v4.16b
1159; CHECK-GI-NEXT:    mov v3.16b, v1.16b
1160; CHECK-GI-NEXT:    str wzr, [x1]
1161; CHECK-GI-NEXT:  .LBB40_2: // %e
1162; CHECK-GI-NEXT:    mov v1.16b, v3.16b
1163; CHECK-GI-NEXT:    ret
1164entry:
1165    br i1 %c, label %t, label %e
1166t:
1167    store i32 0, ptr %p
1168    br label %e
1169e:
1170    %h = phi <8 x float> [%a, %t], [%b, %entry]
1171    ret <8 x float> %h
1172}
1173
1174define <2 x double> @tv2f64(i1 %c, ptr %p, <2 x double> %a, <2 x double> %b) {
1175; CHECK-LABEL: tv2f64:
1176; CHECK:       // %bb.0: // %entry
1177; CHECK-NEXT:    tbz w0, #0, .LBB41_2
1178; CHECK-NEXT:  // %bb.1: // %t
1179; CHECK-NEXT:    mov v1.16b, v0.16b
1180; CHECK-NEXT:    str wzr, [x1]
1181; CHECK-NEXT:  .LBB41_2: // %e
1182; CHECK-NEXT:    mov v0.16b, v1.16b
1183; CHECK-NEXT:    ret
1184entry:
1185    br i1 %c, label %t, label %e
1186t:
1187    store i32 0, ptr %p
1188    br label %e
1189e:
1190    %h = phi <2 x double> [%a, %t], [%b, %entry]
1191    ret <2 x double> %h
1192}
1193
1194define <3 x double> @tv3f64(i1 %c, ptr %p, <3 x double> %a, <3 x double> %b) {
1195; CHECK-SD-LABEL: tv3f64:
1196; CHECK-SD:       // %bb.0: // %entry
1197; CHECK-SD-NEXT:    tbz w0, #0, .LBB42_2
1198; CHECK-SD-NEXT:  // %bb.1: // %t
1199; CHECK-SD-NEXT:    fmov d3, d0
1200; CHECK-SD-NEXT:    fmov d4, d1
1201; CHECK-SD-NEXT:    str wzr, [x1]
1202; CHECK-SD-NEXT:    fmov d5, d2
1203; CHECK-SD-NEXT:  .LBB42_2: // %e
1204; CHECK-SD-NEXT:    fmov d0, d3
1205; CHECK-SD-NEXT:    fmov d1, d4
1206; CHECK-SD-NEXT:    fmov d2, d5
1207; CHECK-SD-NEXT:    ret
1208;
1209; CHECK-GI-LABEL: tv3f64:
1210; CHECK-GI:       // %bb.0: // %entry
1211; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1212; CHECK-GI-NEXT:    // kill: def $d4 killed $d4 def $q4
1213; CHECK-GI-NEXT:    tbz w0, #0, .LBB42_2
1214; CHECK-GI-NEXT:  // %bb.1: // %t
1215; CHECK-GI-NEXT:    fmov d6, d0
1216; CHECK-GI-NEXT:    fmov d7, d2
1217; CHECK-GI-NEXT:    str wzr, [x1]
1218; CHECK-GI-NEXT:    mov v6.d[1], v1.d[0]
1219; CHECK-GI-NEXT:    mov v2.16b, v7.16b
1220; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
1221; CHECK-GI-NEXT:    mov d1, v6.d[1]
1222; CHECK-GI-NEXT:    mov v0.16b, v6.16b
1223; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1224; CHECK-GI-NEXT:    ret
1225; CHECK-GI-NEXT:  .LBB42_2:
1226; CHECK-GI-NEXT:    fmov d0, d3
1227; CHECK-GI-NEXT:    fmov d2, d5
1228; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
1229; CHECK-GI-NEXT:    mov v0.d[1], v4.d[0]
1230; CHECK-GI-NEXT:    mov d1, v0.d[1]
1231; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1232; CHECK-GI-NEXT:    ret
1233entry:
1234    br i1 %c, label %t, label %e
1235t:
1236    store i32 0, ptr %p
1237    br label %e
1238e:
1239    %h = phi <3 x double> [%a, %t], [%b, %entry]
1240    ret <3 x double> %h
1241}
1242
1243define <4 x double> @tv4f64(i1 %c, ptr %p, <4 x double> %a, <4 x double> %b) {
1244; CHECK-SD-LABEL: tv4f64:
1245; CHECK-SD:       // %bb.0: // %entry
1246; CHECK-SD-NEXT:    tbz w0, #0, .LBB43_2
1247; CHECK-SD-NEXT:  // %bb.1: // %t
1248; CHECK-SD-NEXT:    mov v2.16b, v0.16b
1249; CHECK-SD-NEXT:    mov v3.16b, v1.16b
1250; CHECK-SD-NEXT:    str wzr, [x1]
1251; CHECK-SD-NEXT:  .LBB43_2: // %e
1252; CHECK-SD-NEXT:    mov v0.16b, v2.16b
1253; CHECK-SD-NEXT:    mov v1.16b, v3.16b
1254; CHECK-SD-NEXT:    ret
1255;
1256; CHECK-GI-LABEL: tv4f64:
1257; CHECK-GI:       // %bb.0: // %entry
1258; CHECK-GI-NEXT:    mov v4.16b, v0.16b
1259; CHECK-GI-NEXT:    mov v0.16b, v2.16b
1260; CHECK-GI-NEXT:    tbz w0, #0, .LBB43_2
1261; CHECK-GI-NEXT:  // %bb.1: // %t
1262; CHECK-GI-NEXT:    mov v0.16b, v4.16b
1263; CHECK-GI-NEXT:    mov v3.16b, v1.16b
1264; CHECK-GI-NEXT:    str wzr, [x1]
1265; CHECK-GI-NEXT:  .LBB43_2: // %e
1266; CHECK-GI-NEXT:    mov v1.16b, v3.16b
1267; CHECK-GI-NEXT:    ret
1268entry:
1269    br i1 %c, label %t, label %e
1270t:
1271    store i32 0, ptr %p
1272    br label %e
1273e:
1274    %h = phi <4 x double> [%a, %t], [%b, %entry]
1275    ret <4 x double> %h
1276}
1277
1278define <2 x fp128> @tv2f128(i1 %c, ptr %p, <2 x fp128> %a, <2 x fp128> %b) {
1279; CHECK-SD-LABEL: tv2f128:
1280; CHECK-SD:       // %bb.0: // %entry
1281; CHECK-SD-NEXT:    tbz w0, #0, .LBB44_2
1282; CHECK-SD-NEXT:  // %bb.1: // %t
1283; CHECK-SD-NEXT:    mov v2.16b, v0.16b
1284; CHECK-SD-NEXT:    mov v3.16b, v1.16b
1285; CHECK-SD-NEXT:    str wzr, [x1]
1286; CHECK-SD-NEXT:  .LBB44_2: // %e
1287; CHECK-SD-NEXT:    mov v0.16b, v2.16b
1288; CHECK-SD-NEXT:    mov v1.16b, v3.16b
1289; CHECK-SD-NEXT:    ret
1290;
1291; CHECK-GI-LABEL: tv2f128:
1292; CHECK-GI:       // %bb.0: // %entry
1293; CHECK-GI-NEXT:    tbz w0, #0, .LBB44_2
1294; CHECK-GI-NEXT:  // %bb.1: // %t
1295; CHECK-GI-NEXT:    mov d4, v1.d[1]
1296; CHECK-GI-NEXT:    mov d5, v0.d[1]
1297; CHECK-GI-NEXT:    str wzr, [x1]
1298; CHECK-GI-NEXT:    fmov d2, d0
1299; CHECK-GI-NEXT:    fmov d3, d1
1300; CHECK-GI-NEXT:    b .LBB44_3
1301; CHECK-GI-NEXT:  .LBB44_2:
1302; CHECK-GI-NEXT:    mov d4, v3.d[1]
1303; CHECK-GI-NEXT:    mov d5, v2.d[1]
1304; CHECK-GI-NEXT:  .LBB44_3: // %e
1305; CHECK-GI-NEXT:    fmov x8, d2
1306; CHECK-GI-NEXT:    fmov x9, d3
1307; CHECK-GI-NEXT:    mov v0.d[0], x8
1308; CHECK-GI-NEXT:    mov v1.d[0], x9
1309; CHECK-GI-NEXT:    fmov x8, d5
1310; CHECK-GI-NEXT:    fmov x9, d4
1311; CHECK-GI-NEXT:    mov v0.d[1], x8
1312; CHECK-GI-NEXT:    mov v1.d[1], x9
1313; CHECK-GI-NEXT:    ret
1314entry:
1315    br i1 %c, label %t, label %e
1316t:
1317    store i32 0, ptr %p
1318    br label %e
1319e:
1320    %h = phi <2 x fp128> [%a, %t], [%b, %entry]
1321    ret <2 x fp128> %h
1322}
1323