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