[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-shuffle.ll
blob05efb6d86bad5a3b12d5eeeb4d0b417ef2c18960
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:
9 ; CHECK:       // %bb.0:
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]
15 ; CHECK-NEXT:    ret
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
19   ret void
22 define void @interleave_store_without_splat(ptr %a, <4 x i32> %v1, <4 x i32> %v2) {
23 ; CHECK-LABEL: interleave_store_without_splat:
24 ; CHECK:       // %bb.0:
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]
29 ; CHECK-NEXT:    ret
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
33   ret void
36 define void @interleave_store_legalization(ptr %a, <8 x i32> %v1, <8 x i32> %v2) {
37 ; CHECK-LABEL: interleave_store_legalization:
38 ; CHECK:       // %bb.0:
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]
47 ; CHECK-NEXT:    ret
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
51   ret void
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:
57 ; CHECK:       // %bb.0:
58 ; CHECK-NEXT:    ret
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
62 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
66   br label %exit
68 exit:
69   ret void