xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/merge-store.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-unknown-unknown %s -mcpu=cyclone -o - | FileCheck %s --check-prefix=CYCLONE --check-prefix=CHECK
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march aarch64 %s -mattr=-slow-misaligned-128store -o - | FileCheck %s --check-prefix=MISALIGNED --check-prefix=CHECK
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker@g0 = external global <3 x float>, align 16
5*9880d681SAndroid Build Coastguard Worker@g1 = external global <3 x float>, align 4
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[R0:[0-9]+]], {{\[}}[[R1:x[0-9]+]]{{\]}}, #4
8*9880d681SAndroid Build Coastguard Worker; CHECK: ld1{{\.?s?}} { v[[R0]]{{\.?s?}} }[1], {{\[}}[[R1]]{{\]}}
9*9880d681SAndroid Build Coastguard Worker; CHECK: str d[[R0]]
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine void @blam() {
12*9880d681SAndroid Build Coastguard Worker  %tmp4 = getelementptr inbounds <3 x float>, <3 x float>* @g1, i64 0, i64 0
13*9880d681SAndroid Build Coastguard Worker  %tmp5 = load <3 x float>, <3 x float>* @g0, align 16
14*9880d681SAndroid Build Coastguard Worker  %tmp6 = extractelement <3 x float> %tmp5, i64 0
15*9880d681SAndroid Build Coastguard Worker  store float %tmp6, float* %tmp4
16*9880d681SAndroid Build Coastguard Worker  %tmp7 = getelementptr inbounds float, float* %tmp4, i64 1
17*9880d681SAndroid Build Coastguard Worker  %tmp8 = load <3 x float>, <3 x float>* @g0, align 16
18*9880d681SAndroid Build Coastguard Worker  %tmp9 = extractelement <3 x float> %tmp8, i64 1
19*9880d681SAndroid Build Coastguard Worker  store float %tmp9, float* %tmp7
20*9880d681SAndroid Build Coastguard Worker  ret void;
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; PR21711 - Merge vector stores into wider vector stores.
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; On Cyclone, the stores should not get merged into a 16-byte store because
27*9880d681SAndroid Build Coastguard Worker; unaligned 16-byte stores are slow. This test would infinite loop when
28*9880d681SAndroid Build Coastguard Worker; the fastness of unaligned accesses was not specified correctly.
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine void @merge_vec_extract_stores(<4 x float> %v1, <2 x float>* %ptr) {
31*9880d681SAndroid Build Coastguard Worker  %idx0 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 3
32*9880d681SAndroid Build Coastguard Worker  %idx1 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 4
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker  %shuffle0 = shufflevector <4 x float> %v1, <4 x float> undef, <2 x i32> <i32 0, i32 1>
35*9880d681SAndroid Build Coastguard Worker  %shuffle1 = shufflevector <4 x float> %v1, <4 x float> undef, <2 x i32> <i32 2, i32 3>
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker  store <2 x float> %shuffle0, <2 x float>* %idx0, align 8
38*9880d681SAndroid Build Coastguard Worker  store <2 x float> %shuffle1, <2 x float>* %idx1, align 8
39*9880d681SAndroid Build Coastguard Worker  ret void
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; MISALIGNED-LABEL:    merge_vec_extract_stores
42*9880d681SAndroid Build Coastguard Worker; MISALIGNED:          stur   q0, [x0, #24]
43*9880d681SAndroid Build Coastguard Worker; MISALIGNED-NEXT:     ret
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally we would like to use a generic target for this test, but this relies
46*9880d681SAndroid Build Coastguard Worker; on suppressing store pairs.
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; CYCLONE-LABEL:    merge_vec_extract_stores
49*9880d681SAndroid Build Coastguard Worker; CYCLONE:          ext   v1.16b, v0.16b, v0.16b, #8
50*9880d681SAndroid Build Coastguard Worker; CYCLONE-NEXT:     str   d0, [x0, #24]
51*9880d681SAndroid Build Coastguard Worker; CYCLONE-NEXT:     str   d1, [x0, #32]
52*9880d681SAndroid Build Coastguard Worker; CYCLONE-NEXT:     ret
53*9880d681SAndroid Build Coastguard Worker}
54