@@ -28,3 +28,122 @@ define void @store(ptr %x, <vscale x 1 x i32> %y, <vscale x 1 x i32> %z) {
2828 store %struct.test %b , ptr %x
2929 ret void
3030}
31+
32+ define {<vscale x 16 x i8 >, <vscale x 16 x i8 >} @split_load (ptr %p ) nounwind {
33+ ; CHECK-LABEL: define { <vscale x 16 x i8>, <vscale x 16 x i8> } @split_load
34+ ; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
35+ ; CHECK-NEXT: entry:
36+ ; CHECK-NEXT: [[R:%.*]] = load { <vscale x 16 x i8>, <vscale x 16 x i8> }, ptr [[P]], align 16
37+ ; CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[R]]
38+ ;
39+ entry:
40+ %r = load {<vscale x 16 x i8 >, <vscale x 16 x i8 >}, ptr %p
41+ ret {<vscale x 16 x i8 >, <vscale x 16 x i8 >} %r
42+ }
43+
44+ define {<vscale x 16 x i8 >} @split_load_one (ptr %p ) nounwind {
45+ ; CHECK-LABEL: define { <vscale x 16 x i8> } @split_load_one
46+ ; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] {
47+ ; CHECK-NEXT: entry:
48+ ; CHECK-NEXT: [[R_UNPACK:%.*]] = load <vscale x 16 x i8>, ptr [[P]], align 16
49+ ; CHECK-NEXT: [[R1:%.*]] = insertvalue { <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[R_UNPACK]], 0
50+ ; CHECK-NEXT: ret { <vscale x 16 x i8> } [[R1]]
51+ ;
52+ entry:
53+ %r = load {<vscale x 16 x i8 >}, ptr %p
54+ ret {<vscale x 16 x i8 >} %r
55+ }
56+
57+ define void @split_store ({<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p ) nounwind {
58+ ; CHECK-LABEL: define void @split_store
59+ ; CHECK-SAME: ({ <vscale x 4 x i32>, <vscale x 4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
60+ ; CHECK-NEXT: entry:
61+ ; CHECK-NEXT: store { <vscale x 4 x i32>, <vscale x 4 x i32> } [[X]], ptr [[P]], align 16
62+ ; CHECK-NEXT: ret void
63+ ;
64+ entry:
65+ store {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p
66+ ret void
67+ }
68+
69+ define void @split_store_one ({<vscale x 4 x i32 >} %x , ptr %p ) nounwind {
70+ ; CHECK-LABEL: define void @split_store_one
71+ ; CHECK-SAME: ({ <vscale x 4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
72+ ; CHECK-NEXT: entry:
73+ ; CHECK-NEXT: [[TMP0:%.*]] = extractvalue { <vscale x 4 x i32> } [[X]], 0
74+ ; CHECK-NEXT: store <vscale x 4 x i32> [[TMP0]], ptr [[P]], align 16
75+ ; CHECK-NEXT: ret void
76+ ;
77+ entry:
78+ store {<vscale x 4 x i32 >} %x , ptr %p
79+ ret void
80+ }
81+
82+ define {<16 x i8 >, <16 x i8 >} @check_v16i8_v4i32 ({<4 x i32 >, <4 x i32 >} %x , ptr %p ) nounwind {
83+ ; CHECK-LABEL: define { <16 x i8>, <16 x i8> } @check_v16i8_v4i32
84+ ; CHECK-SAME: ({ <4 x i32>, <4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
85+ ; CHECK-NEXT: entry:
86+ ; CHECK-NEXT: [[X_ELT:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[X]], 0
87+ ; CHECK-NEXT: store <4 x i32> [[X_ELT]], ptr [[P]], align 16
88+ ; CHECK-NEXT: [[P_REPACK1:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 16
89+ ; CHECK-NEXT: [[X_ELT2:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[X]], 1
90+ ; CHECK-NEXT: store <4 x i32> [[X_ELT2]], ptr [[P_REPACK1]], align 16
91+ ; CHECK-NEXT: [[R_UNPACK_CAST:%.*]] = bitcast <4 x i32> [[X_ELT]] to <16 x i8>
92+ ; CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <16 x i8>, <16 x i8> } poison, <16 x i8> [[R_UNPACK_CAST]], 0
93+ ; CHECK-NEXT: [[R_UNPACK4_CAST:%.*]] = bitcast <4 x i32> [[X_ELT2]] to <16 x i8>
94+ ; CHECK-NEXT: [[R5:%.*]] = insertvalue { <16 x i8>, <16 x i8> } [[TMP0]], <16 x i8> [[R_UNPACK4_CAST]], 1
95+ ; CHECK-NEXT: ret { <16 x i8>, <16 x i8> } [[R5]]
96+ ;
97+ entry:
98+ store {<4 x i32 >, <4 x i32 >} %x , ptr %p
99+ %r = load {<16 x i8 >, <16 x i8 >}, ptr %p
100+ ret {<16 x i8 >, <16 x i8 >} %r
101+ }
102+
103+ define {<vscale x 16 x i8 >, <vscale x 16 x i8 >} @check_nxv16i8_nxv4i32 ({<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p ) nounwind {
104+ ; CHECK-LABEL: define { <vscale x 16 x i8>, <vscale x 16 x i8> } @check_nxv16i8_nxv4i32
105+ ; CHECK-SAME: ({ <vscale x 4 x i32>, <vscale x 4 x i32> } [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
106+ ; CHECK-NEXT: entry:
107+ ; CHECK-NEXT: store { <vscale x 4 x i32>, <vscale x 4 x i32> } [[X]], ptr [[P]], align 16
108+ ; CHECK-NEXT: [[R:%.*]] = load { <vscale x 16 x i8>, <vscale x 16 x i8> }, ptr [[P]], align 16
109+ ; CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[R]]
110+ ;
111+ entry:
112+ store {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p
113+ %r = load {<vscale x 16 x i8 >, <vscale x 16 x i8 >}, ptr %p
114+ ret {<vscale x 16 x i8 >, <vscale x 16 x i8 >} %r
115+ }
116+
117+ define {<vscale x 16 x i8 >, <vscale x 16 x i8 >} @alloca_nxv16i8_nxv4i32 ({<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x ) nounwind {
118+ ; CHECK-LABEL: define { <vscale x 16 x i8>, <vscale x 16 x i8> } @alloca_nxv16i8_nxv4i32
119+ ; CHECK-SAME: ({ <vscale x 4 x i32>, <vscale x 4 x i32> } [[X:%.*]]) #[[ATTR0]] {
120+ ; CHECK-NEXT: entry:
121+ ; CHECK-NEXT: [[P:%.*]] = alloca { <vscale x 4 x i32>, <vscale x 4 x i32> }, align 16
122+ ; CHECK-NEXT: store { <vscale x 4 x i32>, <vscale x 4 x i32> } [[X]], ptr [[P]], align 16
123+ ; CHECK-NEXT: [[R:%.*]] = load { <vscale x 16 x i8>, <vscale x 16 x i8> }, ptr [[P]], align 16
124+ ; CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[R]]
125+ ;
126+ entry:
127+ %p = alloca {<vscale x 4 x i32 >, <vscale x 4 x i32 >}
128+ store {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %x , ptr %p
129+ %r = load {<vscale x 16 x i8 >, <vscale x 16 x i8 >}, ptr %p
130+ ret {<vscale x 16 x i8 >, <vscale x 16 x i8 >} %r
131+ }
132+
133+ define { <16 x i8 >, <32 x i8 > } @differenttypes ({ <4 x i32 >, <8 x i32 > } %a , ptr %p ) {
134+ ; CHECK-LABEL: define { <16 x i8>, <32 x i8> } @differenttypes
135+ ; CHECK-SAME: ({ <4 x i32>, <8 x i32> } [[A:%.*]], ptr [[P:%.*]]) {
136+ ; CHECK-NEXT: entry:
137+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull [[P]])
138+ ; CHECK-NEXT: store { <4 x i32>, <8 x i32> } [[A]], ptr [[P]], align 16
139+ ; CHECK-NEXT: [[TMP0:%.*]] = load { <16 x i8>, <32 x i8> }, ptr [[P]], align 16
140+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr nonnull [[P]])
141+ ; CHECK-NEXT: ret { <16 x i8>, <32 x i8> } [[TMP0]]
142+ ;
143+ entry:
144+ call void @llvm.lifetime.start.p0 (i64 -1 , ptr nonnull %p ) #5
145+ store { <4 x i32 >, <8 x i32 > } %a , ptr %p , align 16
146+ %2 = load { <16 x i8 >, <32 x i8 > }, ptr %p , align 16
147+ call void @llvm.lifetime.end.p0 (i64 -1 , ptr nonnull %p ) #5
148+ ret { <16 x i8 >, <32 x i8 > } %2
149+ }
0 commit comments