Skip to content

Commit 3d72619

Browse files
committed
[InstCombine] Add a test for splitting scalable structs. NFC
1 parent 6d4e72a commit 3d72619

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

llvm/test/Transforms/InstCombine/scalable-vector-struct.ll

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)