xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/RISCV/load-store.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
110625958SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
23be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v \
3a3106371SPhilip Reames; RUN: -riscv-v-vector-bits-min=-1 -riscv-v-slp-max-vf=0 -S | FileCheck %s --check-prefixes=CHECK
43be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v -S | FileCheck %s --check-prefixes=DEFAULT
5a3106371SPhilip Reames
610625958SPhilip Reames
710625958SPhilip Reamesdefine void @simple_copy(ptr %dest, ptr %p) {
810625958SPhilip Reames; CHECK-LABEL: @simple_copy(
910625958SPhilip Reames; CHECK-NEXT:  entry:
1010625958SPhilip Reames; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
1110625958SPhilip Reames; CHECK-NEXT:    store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 4
1210625958SPhilip Reames; CHECK-NEXT:    ret void
1310625958SPhilip Reames;
14a3106371SPhilip Reames; DEFAULT-LABEL: @simple_copy(
15a3106371SPhilip Reames; DEFAULT-NEXT:  entry:
167f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
177f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 4
18a3106371SPhilip Reames; DEFAULT-NEXT:    ret void
19a3106371SPhilip Reames;
2010625958SPhilip Reamesentry:
2110625958SPhilip Reames  %e0 = load i16, ptr %p, align 4
2210625958SPhilip Reames  %inc = getelementptr inbounds i16, ptr %p, i64 1
2310625958SPhilip Reames  %e1 = load i16, ptr %inc, align 2
2410625958SPhilip Reames
2510625958SPhilip Reames  store i16 %e0, ptr %dest, align 4
2610625958SPhilip Reames  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
2710625958SPhilip Reames  store i16 %e1, ptr %inc2, align 2
2810625958SPhilip Reames  ret void
2910625958SPhilip Reames}
3010625958SPhilip Reames
3110625958SPhilip Reamesdefine void @vec_add(ptr %dest, ptr %p) {
3210625958SPhilip Reames; CHECK-LABEL: @vec_add(
3310625958SPhilip Reames; CHECK-NEXT:  entry:
3410625958SPhilip Reames; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
35*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)
3610625958SPhilip Reames; CHECK-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
3710625958SPhilip Reames; CHECK-NEXT:    ret void
3810625958SPhilip Reames;
39a3106371SPhilip Reames; DEFAULT-LABEL: @vec_add(
40a3106371SPhilip Reames; DEFAULT-NEXT:  entry:
417f26c27eSPhilip Reames; DEFAULT-NEXT:    [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
42*38fffa63SPaul Walker; DEFAULT-NEXT:    [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1)
437f26c27eSPhilip Reames; DEFAULT-NEXT:    store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
44a3106371SPhilip Reames; DEFAULT-NEXT:    ret void
45a3106371SPhilip Reames;
4610625958SPhilip Reamesentry:
4710625958SPhilip Reames  %e0 = load i16, ptr %p, align 4
4810625958SPhilip Reames  %inc = getelementptr inbounds i16, ptr %p, i64 1
4910625958SPhilip Reames  %e1 = load i16, ptr %inc, align 2
5010625958SPhilip Reames
5110625958SPhilip Reames  %a0 = add i16 %e0, 1
5210625958SPhilip Reames  %a1 = add i16 %e1, 1
5310625958SPhilip Reames
5410625958SPhilip Reames  store i16 %a0, ptr %dest, align 4
5510625958SPhilip Reames  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
5610625958SPhilip Reames  store i16 %a1, ptr %inc2, align 2
5710625958SPhilip Reames  ret void
5810625958SPhilip Reames}
5910625958SPhilip Reames
6010625958SPhilip Reames
6117f2ee80SPhilip Reamesdefine void @splat_store_i16(ptr %dest, ptr %p) {
6217f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i16(
6310625958SPhilip Reames; CHECK-NEXT:  entry:
6410625958SPhilip Reames; CHECK-NEXT:    [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4
6510625958SPhilip Reames; CHECK-NEXT:    store i16 [[E0]], ptr [[DEST:%.*]], align 4
6610625958SPhilip Reames; CHECK-NEXT:    [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1
6710625958SPhilip Reames; CHECK-NEXT:    store i16 [[E0]], ptr [[INC2]], align 2
6810625958SPhilip Reames; CHECK-NEXT:    ret void
6910625958SPhilip Reames;
7017f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i16(
71a3106371SPhilip Reames; DEFAULT-NEXT:  entry:
72a3106371SPhilip Reames; DEFAULT-NEXT:    [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4
73a3106371SPhilip Reames; DEFAULT-NEXT:    store i16 [[E0]], ptr [[DEST:%.*]], align 4
74a3106371SPhilip Reames; DEFAULT-NEXT:    [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1
75a3106371SPhilip Reames; DEFAULT-NEXT:    store i16 [[E0]], ptr [[INC2]], align 2
76a3106371SPhilip Reames; DEFAULT-NEXT:    ret void
77a3106371SPhilip Reames;
7810625958SPhilip Reamesentry:
7910625958SPhilip Reames  %e0 = load i16, ptr %p, align 4
8010625958SPhilip Reames
8110625958SPhilip Reames  store i16 %e0, ptr %dest, align 4
8210625958SPhilip Reames  %inc2 = getelementptr inbounds i16, ptr %dest, i64 1
8310625958SPhilip Reames  store i16 %e0, ptr %inc2, align 2
8410625958SPhilip Reames  ret void
8510625958SPhilip Reames}
8610625958SPhilip Reames
8717f2ee80SPhilip Reamesdefine void @splat_store_i64(ptr %dest, ptr %p) {
8817f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i64(
8917f2ee80SPhilip Reames; CHECK-NEXT:  entry:
9017f2ee80SPhilip Reames; CHECK-NEXT:    [[E0:%.*]] = load i64, ptr [[P:%.*]], align 4
9117f2ee80SPhilip Reames; CHECK-NEXT:    store i64 [[E0]], ptr [[DEST:%.*]], align 4
9217f2ee80SPhilip Reames; CHECK-NEXT:    [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1
9317f2ee80SPhilip Reames; CHECK-NEXT:    store i64 [[E0]], ptr [[INC2]], align 2
9417f2ee80SPhilip Reames; CHECK-NEXT:    ret void
9517f2ee80SPhilip Reames;
9617f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i64(
9717f2ee80SPhilip Reames; DEFAULT-NEXT:  entry:
9817f2ee80SPhilip Reames; DEFAULT-NEXT:    [[E0:%.*]] = load i64, ptr [[P:%.*]], align 4
9917f2ee80SPhilip Reames; DEFAULT-NEXT:    store i64 [[E0]], ptr [[DEST:%.*]], align 4
10017f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1
10117f2ee80SPhilip Reames; DEFAULT-NEXT:    store i64 [[E0]], ptr [[INC2]], align 2
10217f2ee80SPhilip Reames; DEFAULT-NEXT:    ret void
10317f2ee80SPhilip Reames;
10417f2ee80SPhilip Reamesentry:
10517f2ee80SPhilip Reames  %e0 = load i64, ptr %p, align 4
10617f2ee80SPhilip Reames
10717f2ee80SPhilip Reames  store i64 %e0, ptr %dest, align 4
10817f2ee80SPhilip Reames  %inc2 = getelementptr inbounds i64, ptr %dest, i64 1
10917f2ee80SPhilip Reames  store i64 %e0, ptr %inc2, align 2
11017f2ee80SPhilip Reames  ret void
11117f2ee80SPhilip Reames}
11217f2ee80SPhilip Reames
11317f2ee80SPhilip Reamesdefine void @splat_store_i64_zero(ptr %dest) {
11417f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i64_zero(
11517f2ee80SPhilip Reames; CHECK-NEXT:  entry:
11617f2ee80SPhilip Reames; CHECK-NEXT:    store i64 0, ptr [[DEST:%.*]], align 4
11717f2ee80SPhilip Reames; CHECK-NEXT:    [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1
11817f2ee80SPhilip Reames; CHECK-NEXT:    store i64 0, ptr [[INC2]], align 2
11917f2ee80SPhilip Reames; CHECK-NEXT:    ret void
12017f2ee80SPhilip Reames;
12117f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i64_zero(
12217f2ee80SPhilip Reames; DEFAULT-NEXT:  entry:
12317f2ee80SPhilip Reames; DEFAULT-NEXT:    store i64 0, ptr [[DEST:%.*]], align 4
12417f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1
12517f2ee80SPhilip Reames; DEFAULT-NEXT:    store i64 0, ptr [[INC2]], align 2
12617f2ee80SPhilip Reames; DEFAULT-NEXT:    ret void
12717f2ee80SPhilip Reames;
12817f2ee80SPhilip Reamesentry:
12917f2ee80SPhilip Reames  store i64 0, ptr %dest, align 4
13017f2ee80SPhilip Reames  %inc2 = getelementptr inbounds i64, ptr %dest, i64 1
13117f2ee80SPhilip Reames  store i64 0, ptr %inc2, align 2
13217f2ee80SPhilip Reames  ret void
13317f2ee80SPhilip Reames}
13417f2ee80SPhilip Reames
13517f2ee80SPhilip Reamesdefine void @splat_store_i64_one(ptr %dest) {
13617f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i64_one(
13717f2ee80SPhilip Reames; CHECK-NEXT:  entry:
13817f2ee80SPhilip Reames; CHECK-NEXT:    store i64 1, ptr [[DEST:%.*]], align 4
13917f2ee80SPhilip Reames; CHECK-NEXT:    [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1
14017f2ee80SPhilip Reames; CHECK-NEXT:    store i64 1, ptr [[INC2]], align 2
14117f2ee80SPhilip Reames; CHECK-NEXT:    ret void
14217f2ee80SPhilip Reames;
14317f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i64_one(
14417f2ee80SPhilip Reames; DEFAULT-NEXT:  entry:
14517f2ee80SPhilip Reames; DEFAULT-NEXT:    store i64 1, ptr [[DEST:%.*]], align 4
14617f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1
14717f2ee80SPhilip Reames; DEFAULT-NEXT:    store i64 1, ptr [[INC2]], align 2
14817f2ee80SPhilip Reames; DEFAULT-NEXT:    ret void
14917f2ee80SPhilip Reames;
15017f2ee80SPhilip Reamesentry:
15117f2ee80SPhilip Reames  store i64 1, ptr %dest, align 4
15217f2ee80SPhilip Reames  %inc2 = getelementptr inbounds i64, ptr %dest, i64 1
15317f2ee80SPhilip Reames  store i64 1, ptr %inc2, align 2
15417f2ee80SPhilip Reames  ret void
15517f2ee80SPhilip Reames}
15617f2ee80SPhilip Reames
15717f2ee80SPhilip Reamesdefine void @splat_store_i32_zero(ptr %dest) {
15817f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i32_zero(
15917f2ee80SPhilip Reames; CHECK-NEXT:  entry:
16017f2ee80SPhilip Reames; CHECK-NEXT:    store <4 x i32> zeroinitializer, ptr [[DEST:%.*]], align 4
16117f2ee80SPhilip Reames; CHECK-NEXT:    ret void
16217f2ee80SPhilip Reames;
16317f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i32_zero(
16417f2ee80SPhilip Reames; DEFAULT-NEXT:  entry:
1657f26c27eSPhilip Reames; DEFAULT-NEXT:    store <4 x i32> zeroinitializer, ptr [[DEST:%.*]], align 4
16617f2ee80SPhilip Reames; DEFAULT-NEXT:    ret void
16717f2ee80SPhilip Reames;
16817f2ee80SPhilip Reamesentry:
16917f2ee80SPhilip Reames  store i32 0, ptr %dest, align 4
17017f2ee80SPhilip Reames  %inc1 = getelementptr inbounds i32, ptr %dest, i64 1
17117f2ee80SPhilip Reames  store i32 0, ptr %inc1, align 2
17217f2ee80SPhilip Reames  %inc2 = getelementptr inbounds i32, ptr %dest, i64 2
17317f2ee80SPhilip Reames  store i32 0, ptr %inc2, align 2
17417f2ee80SPhilip Reames  %inc3 = getelementptr inbounds i32, ptr %dest, i64 3
17517f2ee80SPhilip Reames  store i32 0, ptr %inc3, align 2
17617f2ee80SPhilip Reames  ret void
17717f2ee80SPhilip Reames}
17817f2ee80SPhilip Reames
17917f2ee80SPhilip Reamesdefine void @splat_store_i32_one(ptr %dest) {
18017f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i32_one(
18117f2ee80SPhilip Reames; CHECK-NEXT:  entry:
182*38fffa63SPaul Walker; CHECK-NEXT:    store <4 x i32> splat (i32 1), ptr [[DEST:%.*]], align 4
18317f2ee80SPhilip Reames; CHECK-NEXT:    ret void
18417f2ee80SPhilip Reames;
18517f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i32_one(
18617f2ee80SPhilip Reames; DEFAULT-NEXT:  entry:
187*38fffa63SPaul Walker; DEFAULT-NEXT:    store <4 x i32> splat (i32 1), ptr [[DEST:%.*]], align 4
18817f2ee80SPhilip Reames; DEFAULT-NEXT:    ret void
18917f2ee80SPhilip Reames;
19017f2ee80SPhilip Reamesentry:
19117f2ee80SPhilip Reames  store i32 1, ptr %dest, align 4
19217f2ee80SPhilip Reames  %inc1 = getelementptr inbounds i32, ptr %dest, i64 1
19317f2ee80SPhilip Reames  store i32 1, ptr %inc1, align 2
19417f2ee80SPhilip Reames  %inc2 = getelementptr inbounds i32, ptr %dest, i64 2
19517f2ee80SPhilip Reames  store i32 1, ptr %inc2, align 2
19617f2ee80SPhilip Reames  %inc3 = getelementptr inbounds i32, ptr %dest, i64 3
19717f2ee80SPhilip Reames  store i32 1, ptr %inc3, align 2
19817f2ee80SPhilip Reames  ret void
19917f2ee80SPhilip Reames}
20017f2ee80SPhilip Reames
20117f2ee80SPhilip Reamesdefine void @store_stepvector_i32(ptr %dest) {
20217f2ee80SPhilip Reames; CHECK-LABEL: @store_stepvector_i32(
20317f2ee80SPhilip Reames; CHECK-NEXT:  entry:
20402bfe2deSPhilip Reames; CHECK-NEXT:    store i32 0, ptr [[DEST:%.*]], align 4
20502bfe2deSPhilip Reames; CHECK-NEXT:    [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1
20602bfe2deSPhilip Reames; CHECK-NEXT:    store i32 1, ptr [[INC1]], align 2
20702bfe2deSPhilip Reames; CHECK-NEXT:    [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2
20802bfe2deSPhilip Reames; CHECK-NEXT:    store i32 2, ptr [[INC2]], align 2
20902bfe2deSPhilip Reames; CHECK-NEXT:    [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3
21002bfe2deSPhilip Reames; CHECK-NEXT:    store i32 3, ptr [[INC3]], align 2
21117f2ee80SPhilip Reames; CHECK-NEXT:    ret void
21217f2ee80SPhilip Reames;
21317f2ee80SPhilip Reames; DEFAULT-LABEL: @store_stepvector_i32(
21417f2ee80SPhilip Reames; DEFAULT-NEXT:  entry:
21517f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 0, ptr [[DEST:%.*]], align 4
21617f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1
21717f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 1, ptr [[INC1]], align 2
21817f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2
21917f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 2, ptr [[INC2]], align 2
22017f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3
22117f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 3, ptr [[INC3]], align 2
22217f2ee80SPhilip Reames; DEFAULT-NEXT:    ret void
22317f2ee80SPhilip Reames;
22417f2ee80SPhilip Reamesentry:
22517f2ee80SPhilip Reames  store i32 0, ptr %dest, align 4
22617f2ee80SPhilip Reames  %inc1 = getelementptr inbounds i32, ptr %dest, i64 1
22717f2ee80SPhilip Reames  store i32 1, ptr %inc1, align 2
22817f2ee80SPhilip Reames  %inc2 = getelementptr inbounds i32, ptr %dest, i64 2
22917f2ee80SPhilip Reames  store i32 2, ptr %inc2, align 2
23017f2ee80SPhilip Reames  %inc3 = getelementptr inbounds i32, ptr %dest, i64 3
23117f2ee80SPhilip Reames  store i32 3, ptr %inc3, align 2
23217f2ee80SPhilip Reames  ret void
23317f2ee80SPhilip Reames}
23417f2ee80SPhilip Reames
23517f2ee80SPhilip Reamesdefine void @store_arbitrary_constant_i32(ptr %dest) {
23617f2ee80SPhilip Reames; CHECK-LABEL: @store_arbitrary_constant_i32(
23717f2ee80SPhilip Reames; CHECK-NEXT:  entry:
23802bfe2deSPhilip Reames; CHECK-NEXT:    store i32 0, ptr [[DEST:%.*]], align 4
23902bfe2deSPhilip Reames; CHECK-NEXT:    [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1
24002bfe2deSPhilip Reames; CHECK-NEXT:    store i32 -33, ptr [[INC1]], align 2
24102bfe2deSPhilip Reames; CHECK-NEXT:    [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2
24202bfe2deSPhilip Reames; CHECK-NEXT:    store i32 44, ptr [[INC2]], align 2
24302bfe2deSPhilip Reames; CHECK-NEXT:    [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3
24402bfe2deSPhilip Reames; CHECK-NEXT:    store i32 77, ptr [[INC3]], align 2
24517f2ee80SPhilip Reames; CHECK-NEXT:    ret void
24617f2ee80SPhilip Reames;
24717f2ee80SPhilip Reames; DEFAULT-LABEL: @store_arbitrary_constant_i32(
24817f2ee80SPhilip Reames; DEFAULT-NEXT:  entry:
24917f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 0, ptr [[DEST:%.*]], align 4
25017f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1
25117f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 -33, ptr [[INC1]], align 2
25217f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2
25317f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 44, ptr [[INC2]], align 2
25417f2ee80SPhilip Reames; DEFAULT-NEXT:    [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3
25517f2ee80SPhilip Reames; DEFAULT-NEXT:    store i32 77, ptr [[INC3]], align 2
25617f2ee80SPhilip Reames; DEFAULT-NEXT:    ret void
25717f2ee80SPhilip Reames;
25817f2ee80SPhilip Reamesentry:
25917f2ee80SPhilip Reames  store i32 0, ptr %dest, align 4
26017f2ee80SPhilip Reames  %inc1 = getelementptr inbounds i32, ptr %dest, i64 1
26117f2ee80SPhilip Reames  store i32 -33, ptr %inc1, align 2
26217f2ee80SPhilip Reames  %inc2 = getelementptr inbounds i32, ptr %dest, i64 2
26317f2ee80SPhilip Reames  store i32 44, ptr %inc2, align 2
26417f2ee80SPhilip Reames  %inc3 = getelementptr inbounds i32, ptr %dest, i64 3
26517f2ee80SPhilip Reames  store i32 77, ptr %inc3, align 2
26617f2ee80SPhilip Reames  ret void
26717f2ee80SPhilip Reames}
268