1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible-sve < %s | FileCheck %s
5 target triple = "aarch64-unknown-linux-gnu"
7 define void @hang_when_merging_stores_after_legalisation(ptr %a, <2 x i32> %b) {
8 ; CHECK-LABEL: hang_when_merging_stores_after_legalisation:
10 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
11 ; CHECK-NEXT: ptrue p0.s, vl4
12 ; CHECK-NEXT: mov z0.s, s0
13 ; CHECK-NEXT: mov z1.d, z0.d
14 ; CHECK-NEXT: st2w { z0.s, z1.s }, p0, [x0]
16 %splat = shufflevector <2 x i32> %b, <2 x i32> undef, <8 x i32> zeroinitializer
17 %interleaved.vec = shufflevector <8 x i32> %splat, <8 x i32> undef, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
18 store <8 x i32> %interleaved.vec, ptr %a, align 4
22 define void @interleave_store_without_splat(ptr %a, <4 x i32> %v1, <4 x i32> %v2) {
23 ; CHECK-LABEL: interleave_store_without_splat:
25 ; CHECK-NEXT: ptrue p0.s, vl4
26 ; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z0_z1 def $z0_z1
27 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0_z1 def $z0_z1
28 ; CHECK-NEXT: st2w { z0.s, z1.s }, p0, [x0]
30 %shuffle = shufflevector <4 x i32> %v1, <4 x i32> %v2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
31 %interleaved = shufflevector <8 x i32> %shuffle, <8 x i32> undef, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
32 store <8 x i32> %interleaved, ptr %a, align 1
36 define void @interleave_store_legalization(ptr %a, <8 x i32> %v1, <8 x i32> %v2) {
37 ; CHECK-LABEL: interleave_store_legalization:
39 ; CHECK-NEXT: ptrue p0.s, vl4
40 ; CHECK-NEXT: mov z5.d, z2.d
41 ; CHECK-NEXT: // kill: def $q3 killed $q3 def $z2_z3
42 ; CHECK-NEXT: mov x8, #8 // =0x8
43 ; CHECK-NEXT: mov z4.d, z0.d
44 ; CHECK-NEXT: mov z2.d, z1.d
45 ; CHECK-NEXT: st2w { z4.s, z5.s }, p0, [x0]
46 ; CHECK-NEXT: st2w { z2.s, z3.s }, p0, [x0, x8, lsl #2]
48 %interleaved.vec = shufflevector <8 x i32> %v1, <8 x i32> %v2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11,
49 i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
50 store <16 x i32> %interleaved.vec, ptr %a, align 4
54 ; Ensure we don't crash when trying to lower a shuffle via an extract
55 define void @crash_when_lowering_extract_shuffle(ptr %dst, i1 %cond) {
56 ; CHECK-LABEL: crash_when_lowering_extract_shuffle:
59 %broadcast.splat = shufflevector <32 x i1> zeroinitializer, <32 x i1> zeroinitializer, <32 x i32> zeroinitializer
60 br i1 %cond, label %exit, label %vector.body
63 %1 = load <32 x i32>, ptr %dst, align 16
64 %predphi = select <32 x i1> %broadcast.splat, <32 x i32> zeroinitializer, <32 x i32> %1
65 store <32 x i32> %predphi, ptr %dst, align 16