Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-shuffle.ll
blobff1f8699b91afd7f9cab7f43d72afbd8d752d943
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:
10 ; CHECK:       // %bb.0:
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]
16 ; CHECK-NEXT:    ret
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
20   ret void
23 define void @interleave_store_without_splat(ptr %a, <4 x i32> %v1, <4 x i32> %v2) {
24 ; CHECK-LABEL: interleave_store_without_splat:
25 ; CHECK:       // %bb.0:
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]
30 ; CHECK-NEXT:    ret
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
34   ret void
37 define void @interleave_store_legalization(ptr %a, <8 x i32> %v1, <8 x i32> %v2) {
38 ; CHECK-LABEL: interleave_store_legalization:
39 ; CHECK:       // %bb.0:
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]
48 ; CHECK-NEXT:    ret
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
52   ret void
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:
58 ; CHECK:       // %bb.0:
59 ; CHECK-NEXT:    ret
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
63 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
67   br label %exit
69 exit:
70   ret void