xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-redundant-store.ll (revision cc82f1290a1e2157a6c0530d78d8cc84d2b8553d)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -O2 -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
3
4; #include <arm_sve.h>
5; #include <stdint.h>
6;
7; void redundant_store(uint32_t *p, svint32_t v) {
8;     *p = 1;
9;     *(svint32_t *)p = v;
10; }
11define void @redundant_store(ptr nocapture %p, <vscale x 4 x i32> %v) {
12; CHECK-LABEL: redundant_store:
13; CHECK:       // %bb.0:
14; CHECK-NEXT:    ptrue p0.s
15; CHECK-NEXT:    st1w { z0.s }, p0, [x0]
16; CHECK-NEXT:    ret
17  store i32 1, ptr %p, align 4
18  store <vscale x 4 x i32> %v, ptr %p, align 16
19  ret void
20}
21
22define void @two_scalable_same_size(ptr writeonly %ptr, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
23; CHECK-LABEL: two_scalable_same_size:
24; CHECK:       // %bb.0: // %entry
25; CHECK-NEXT:    ptrue p0.s
26; CHECK-NEXT:    st1w { z1.s }, p0, [x0]
27; CHECK-NEXT:    ret
28entry:
29  store <vscale x 4 x i32> %a, ptr %ptr
30  store <vscale x 4 x i32> %b, ptr %ptr
31  ret void
32}
33
34; make sure that scalable store is present, becuase we don't know its final size.
35define void @keep_scalable_store(ptr writeonly %ptr, ptr %a, <vscale x 4 x i32> %b) {
36; CHECK-LABEL: keep_scalable_store:
37; CHECK:       // %bb.0: // %entry
38; CHECK-NEXT:    ldp q2, q1, [x1]
39; CHECK-NEXT:    ptrue p0.s
40; CHECK-NEXT:    st1w { z0.s }, p0, [x0]
41; CHECK-NEXT:    stp q2, q1, [x0]
42; CHECK-NEXT:    ret
43entry:
44  %0 = load <8 x i32>, ptr %a
45  store <vscale x 4 x i32> %b, ptr %ptr
46  store <8 x i32> %0, ptr %ptr
47  ret void
48}
49
50define void @two_scalable_keep_stores(ptr writeonly %ptr, <vscale x 4 x i32> %a, <vscale x 4 x i64> %b) {
51; CHECK-LABEL: two_scalable_keep_stores:
52; CHECK:       // %bb.0: // %entry
53; CHECK-NEXT:    ptrue p0.d
54; CHECK-NEXT:    ptrue p1.s
55; CHECK-NEXT:    st1d { z2.d }, p0, [x0, #1, mul vl]
56; CHECK-NEXT:    st1d { z1.d }, p0, [x0]
57; CHECK-NEXT:    st1w { z0.s }, p1, [x0]
58; CHECK-NEXT:    ret
59entry:
60  store <vscale x 4 x i64> %b, ptr %ptr
61  store <vscale x 4 x i32> %a, ptr %ptr
62  ret void
63}
64
65define void @two_scalable_remove_store(ptr writeonly %ptr, <vscale x 4 x i32> %a, <vscale x 4 x i64> %b) {
66; CHECK-LABEL: two_scalable_remove_store:
67; CHECK:       // %bb.0: // %entry
68; CHECK-NEXT:    ptrue p0.d
69; CHECK-NEXT:    st1d { z2.d }, p0, [x0, #1, mul vl]
70; CHECK-NEXT:    st1d { z1.d }, p0, [x0]
71; CHECK-NEXT:    ret
72entry:
73  store <vscale x 4 x i32> %a, ptr %ptr
74  store <vscale x 4 x i64> %b, ptr %ptr
75  ret void
76}
77