Skip to content

Commit 970513b

Browse files
committed
[AArch64][ISel] Add unary vector_splice tests (NFC)
They use extract shuffles for fixed vectors, and llvm.vector.splice intrinsics for scalable vectors. In the previous tests using ld+extract+st, the extract was optimized away and replaced by a smaller load at the right offset. This meant we didin't really test the vector_splice ISD node.
1 parent 1ccb570 commit 970513b

File tree

2 files changed

+554
-4
lines changed

2 files changed

+554
-4
lines changed

llvm/test/CodeGen/AArch64/named-vector-shuffles-sve.ll

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ define <vscale x 16 x i8> @splice_nxv16i8_last_idx(<vscale x 16 x i8> %a, <vscal
3333
ret <vscale x 16 x i8> %res
3434
}
3535

36+
define <vscale x 16 x i8> @splice_nxv16i8_first_idx_unary(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) #0 {
37+
; CHECK-LABEL: splice_nxv16i8_first_idx_unary:
38+
; CHECK: // %bb.0:
39+
; CHECK-NEXT: mov z0.d, z1.d
40+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #1
41+
; CHECK-NEXT: ret
42+
%res = call <vscale x 16 x i8> @llvm.vector.splice.nxv16i8(<vscale x 16 x i8> %b, <vscale x 16 x i8> %b, i32 1)
43+
ret <vscale x 16 x i8> %res
44+
}
45+
3646
define <vscale x 8 x i16> @splice_nxv8i16_first_idx(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) #0 {
3747
; CHECK-LABEL: splice_nxv8i16_first_idx:
3848
; CHECK: // %bb.0:
@@ -42,6 +52,16 @@ define <vscale x 8 x i16> @splice_nxv8i16_first_idx(<vscale x 8 x i16> %a, <vsca
4252
ret <vscale x 8 x i16> %res
4353
}
4454

55+
define <vscale x 8 x i16> @splice_nxv8i16_first_idx_unary(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) #0 {
56+
; CHECK-LABEL: splice_nxv8i16_first_idx_unary:
57+
; CHECK: // %bb.0:
58+
; CHECK-NEXT: mov z0.d, z1.d
59+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #2
60+
; CHECK-NEXT: ret
61+
%res = call <vscale x 8 x i16> @llvm.vector.splice.nxv8i16(<vscale x 8 x i16> %b, <vscale x 8 x i16> %b, i32 1)
62+
ret <vscale x 8 x i16> %res
63+
}
64+
4565
define <vscale x 4 x i32> @splice_nxv4i32_first_idx(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) #0 {
4666
; CHECK-LABEL: splice_nxv4i32_first_idx:
4767
; CHECK: // %bb.0:
@@ -60,6 +80,16 @@ define <vscale x 4 x i32> @splice_nxv4i32_last_idx(<vscale x 4 x i32> %a, <vscal
6080
ret <vscale x 4 x i32> %res
6181
}
6282

83+
define <vscale x 4 x i32> @splice_nxv4i32_first_idx_unary(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) #0 {
84+
; CHECK-LABEL: splice_nxv4i32_first_idx_unary:
85+
; CHECK: // %bb.0:
86+
; CHECK-NEXT: mov z0.d, z1.d
87+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
88+
; CHECK-NEXT: ret
89+
%res = call <vscale x 4 x i32> @llvm.vector.splice.nxv4i32(<vscale x 4 x i32> %b, <vscale x 4 x i32> %b, i32 1)
90+
ret <vscale x 4 x i32> %res
91+
}
92+
6393
define <vscale x 2 x i64> @splice_nxv2i64_first_idx(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) #0 {
6494
; CHECK-LABEL: splice_nxv2i64_first_idx:
6595
; CHECK: // %bb.0:
@@ -78,6 +108,16 @@ define <vscale x 2 x i64> @splice_nxv2i64_last_idx(<vscale x 2 x i64> %a, <vscal
78108
ret <vscale x 2 x i64> %res
79109
}
80110

111+
define <vscale x 2 x i64> @splice_nxv2i64_first_idx_unary(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) #0 {
112+
; CHECK-LABEL: splice_nxv2i64_first_idx_unary:
113+
; CHECK: // %bb.0:
114+
; CHECK-NEXT: mov z0.d, z1.d
115+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
116+
; CHECK-NEXT: ret
117+
%res = call <vscale x 2 x i64> @llvm.vector.splice.nxv2i64(<vscale x 2 x i64> %b, <vscale x 2 x i64> %b, i32 1)
118+
ret <vscale x 2 x i64> %res
119+
}
120+
81121
define <vscale x 2 x half> @splice_nxv2f16_neg_idx(<vscale x 2 x half> %a, <vscale x 2 x half> %b) #0 {
82122
; CHECK-LABEL: splice_nxv2f16_neg_idx:
83123
; CHECK: // %bb.0:
@@ -100,6 +140,18 @@ define <vscale x 2 x half> @splice_nxv2f16_neg2_idx(<vscale x 2 x half> %a, <vsc
100140
ret <vscale x 2 x half> %res
101141
}
102142

143+
define <vscale x 2 x half> @splice_nxv2f16_neg_idx_unary(<vscale x 2 x half> %a, <vscale x 2 x half> %b) #0 {
144+
; CHECK-LABEL: splice_nxv2f16_neg_idx_unary:
145+
; CHECK: // %bb.0:
146+
; CHECK-NEXT: ptrue p0.d, vl1
147+
; CHECK-NEXT: mov z0.d, z1.d
148+
; CHECK-NEXT: rev p0.d, p0.d
149+
; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d
150+
; CHECK-NEXT: ret
151+
%res = call <vscale x 2 x half> @llvm.vector.splice.nxv2f16(<vscale x 2 x half> %b, <vscale x 2 x half> %b, i32 -1)
152+
ret <vscale x 2 x half> %res
153+
}
154+
103155
define <vscale x 2 x half> @splice_nxv2f16_first_idx(<vscale x 2 x half> %a, <vscale x 2 x half> %b) #0 {
104156
; CHECK-LABEL: splice_nxv2f16_first_idx:
105157
; CHECK: // %bb.0:
@@ -118,6 +170,16 @@ define <vscale x 2 x half> @splice_nxv2f16_last_idx(<vscale x 2 x half> %a, <vsc
118170
ret <vscale x 2 x half> %res
119171
}
120172

173+
define <vscale x 2 x half> @splice_nxv2f16_first_idx_unary(<vscale x 2 x half> %a, <vscale x 2 x half> %b) #0 {
174+
; CHECK-LABEL: splice_nxv2f16_first_idx_unary:
175+
; CHECK: // %bb.0:
176+
; CHECK-NEXT: mov z0.d, z1.d
177+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
178+
; CHECK-NEXT: ret
179+
%res = call <vscale x 2 x half> @llvm.vector.splice.nxv2f16(<vscale x 2 x half> %b, <vscale x 2 x half> %b, i32 1)
180+
ret <vscale x 2 x half> %res
181+
}
182+
121183
define <vscale x 4 x half> @splice_nxv4f16_neg_idx(<vscale x 4 x half> %a, <vscale x 4 x half> %b) #0 {
122184
; CHECK-LABEL: splice_nxv4f16_neg_idx:
123185
; CHECK: // %bb.0:
@@ -140,6 +202,18 @@ define <vscale x 4 x half> @splice_nxv4f16_neg3_idx(<vscale x 4 x half> %a, <vsc
140202
ret <vscale x 4 x half> %res
141203
}
142204

205+
define <vscale x 4 x half> @splice_nxv4f16_neg_idx_unary(<vscale x 4 x half> %a, <vscale x 4 x half> %b) #0 {
206+
; CHECK-LABEL: splice_nxv4f16_neg_idx_unary:
207+
; CHECK: // %bb.0:
208+
; CHECK-NEXT: ptrue p0.s, vl1
209+
; CHECK-NEXT: mov z0.d, z1.d
210+
; CHECK-NEXT: rev p0.s, p0.s
211+
; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s
212+
; CHECK-NEXT: ret
213+
%res = call <vscale x 4 x half> @llvm.vector.splice.nxv4f16(<vscale x 4 x half> %b, <vscale x 4 x half> %b, i32 -1)
214+
ret <vscale x 4 x half> %res
215+
}
216+
143217
define <vscale x 4 x half> @splice_nxv4f16_first_idx(<vscale x 4 x half> %a, <vscale x 4 x half> %b) #0 {
144218
; CHECK-LABEL: splice_nxv4f16_first_idx:
145219
; CHECK: // %bb.0:
@@ -158,6 +232,16 @@ define <vscale x 4 x half> @splice_nxv4f16_last_idx(<vscale x 4 x half> %a, <vsc
158232
ret <vscale x 4 x half> %res
159233
}
160234

235+
define <vscale x 4 x half> @splice_nxv4f16_first_idx_unary(<vscale x 4 x half> %a, <vscale x 4 x half> %b) #0 {
236+
; CHECK-LABEL: splice_nxv4f16_first_idx_unary:
237+
; CHECK: // %bb.0:
238+
; CHECK-NEXT: mov z0.d, z1.d
239+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
240+
; CHECK-NEXT: ret
241+
%res = call <vscale x 4 x half> @llvm.vector.splice.nxv4f16(<vscale x 4 x half> %b, <vscale x 4 x half> %b, i32 1)
242+
ret <vscale x 4 x half> %res
243+
}
244+
161245
define <vscale x 8 x half> @splice_nxv8f16_first_idx(<vscale x 8 x half> %a, <vscale x 8 x half> %b) #0 {
162246
; CHECK-LABEL: splice_nxv8f16_first_idx:
163247
; CHECK: // %bb.0:
@@ -176,6 +260,16 @@ define <vscale x 8 x half> @splice_nxv8f16_last_idx(<vscale x 8 x half> %a, <vsc
176260
ret <vscale x 8 x half> %res
177261
}
178262

263+
define <vscale x 8 x half> @splice_nxv8f16_first_idx_unary(<vscale x 8 x half> %a, <vscale x 8 x half> %b) #0 {
264+
; CHECK-LABEL: splice_nxv8f16_first_idx_unary:
265+
; CHECK: // %bb.0:
266+
; CHECK-NEXT: mov z0.d, z1.d
267+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #2
268+
; CHECK-NEXT: ret
269+
%res = call <vscale x 8 x half> @llvm.vector.splice.nxv8f16(<vscale x 8 x half> %b, <vscale x 8 x half> %b, i32 1)
270+
ret <vscale x 8 x half> %res
271+
}
272+
179273
define <vscale x 2 x float> @splice_nxv2f32_neg_idx(<vscale x 2 x float> %a, <vscale x 2 x float> %b) #0 {
180274
; CHECK-LABEL: splice_nxv2f32_neg_idx:
181275
; CHECK: // %bb.0:
@@ -198,6 +292,18 @@ define <vscale x 2 x float> @splice_nxv2f32_neg2_idx(<vscale x 2 x float> %a, <v
198292
ret <vscale x 2 x float> %res
199293
}
200294

295+
define <vscale x 2 x float> @splice_nxv2f32_neg_idx_unary(<vscale x 2 x float> %a, <vscale x 2 x float> %b) #0 {
296+
; CHECK-LABEL: splice_nxv2f32_neg_idx_unary:
297+
; CHECK: // %bb.0:
298+
; CHECK-NEXT: ptrue p0.d, vl1
299+
; CHECK-NEXT: mov z0.d, z1.d
300+
; CHECK-NEXT: rev p0.d, p0.d
301+
; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d
302+
; CHECK-NEXT: ret
303+
%res = call <vscale x 2 x float> @llvm.vector.splice.nxv2f32(<vscale x 2 x float> %b, <vscale x 2 x float> %b, i32 -1)
304+
ret <vscale x 2 x float> %res
305+
}
306+
201307
define <vscale x 2 x float> @splice_nxv2f32_first_idx(<vscale x 2 x float> %a, <vscale x 2 x float> %b) #0 {
202308
; CHECK-LABEL: splice_nxv2f32_first_idx:
203309
; CHECK: // %bb.0:
@@ -216,6 +322,16 @@ define <vscale x 2 x float> @splice_nxv2f32_last_idx(<vscale x 2 x float> %a, <v
216322
ret <vscale x 2 x float> %res
217323
}
218324

325+
define <vscale x 2 x float> @splice_nxv2f32_first_idx_unary(<vscale x 2 x float> %a, <vscale x 2 x float> %b) #0 {
326+
; CHECK-LABEL: splice_nxv2f32_first_idx_unary:
327+
; CHECK: // %bb.0:
328+
; CHECK-NEXT: mov z0.d, z1.d
329+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
330+
; CHECK-NEXT: ret
331+
%res = call <vscale x 2 x float> @llvm.vector.splice.nxv2f32(<vscale x 2 x float> %b, <vscale x 2 x float> %b, i32 1)
332+
ret <vscale x 2 x float> %res
333+
}
334+
219335
define <vscale x 4 x float> @splice_nxv4f32_first_idx(<vscale x 4 x float> %a, <vscale x 4 x float> %b) #0 {
220336
; CHECK-LABEL: splice_nxv4f32_first_idx:
221337
; CHECK: // %bb.0:
@@ -234,6 +350,16 @@ define <vscale x 4 x float> @splice_nxv4f32_last_idx(<vscale x 4 x float> %a, <v
234350
ret <vscale x 4 x float> %res
235351
}
236352

353+
define <vscale x 4 x float> @splice_nxv4f32_first_idx_unary(<vscale x 4 x float> %a, <vscale x 4 x float> %b) #0 {
354+
; CHECK-LABEL: splice_nxv4f32_first_idx_unary:
355+
; CHECK: // %bb.0:
356+
; CHECK-NEXT: mov z0.d, z1.d
357+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
358+
; CHECK-NEXT: ret
359+
%res = call <vscale x 4 x float> @llvm.vector.splice.nxv4f32(<vscale x 4 x float> %b, <vscale x 4 x float> %b, i32 1)
360+
ret <vscale x 4 x float> %res
361+
}
362+
237363
define <vscale x 2 x double> @splice_nxv2f64_first_idx(<vscale x 2 x double> %a, <vscale x 2 x double> %b) #0 {
238364
; CHECK-LABEL: splice_nxv2f64_first_idx:
239365
; CHECK: // %bb.0:
@@ -252,6 +378,16 @@ define <vscale x 2 x double> @splice_nxv2f64_last_idx(<vscale x 2 x double> %a,
252378
ret <vscale x 2 x double> %res
253379
}
254380

381+
define <vscale x 2 x double> @splice_nxv2f64_first_idx_unary(<vscale x 2 x double> %a, <vscale x 2 x double> %b) #0 {
382+
; CHECK-LABEL: splice_nxv2f64_first_idx_unary:
383+
; CHECK: // %bb.0:
384+
; CHECK-NEXT: mov z0.d, z1.d
385+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
386+
; CHECK-NEXT: ret
387+
%res = call <vscale x 2 x double> @llvm.vector.splice.nxv2f64(<vscale x 2 x double> %b, <vscale x 2 x double> %b, i32 1)
388+
ret <vscale x 2 x double> %res
389+
}
390+
255391
; Ensure predicate based splice is promoted to use ZPRs.
256392
define <vscale x 2 x i1> @splice_nxv2i1_idx(<vscale x 2 x i1> %a, <vscale x 2 x i1> %b) #0 {
257393
; CHECK-LABEL: splice_nxv2i1_idx:
@@ -710,6 +846,18 @@ define <vscale x 2 x bfloat> @splice_nxv2bf16_neg2_idx(<vscale x 2 x bfloat> %a,
710846
ret <vscale x 2 x bfloat> %res
711847
}
712848

849+
define <vscale x 2 x bfloat> @splice_nxv2bf16_neg_idx_unary(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) #0 {
850+
; CHECK-LABEL: splice_nxv2bf16_neg_idx_unary:
851+
; CHECK: // %bb.0:
852+
; CHECK-NEXT: ptrue p0.d, vl1
853+
; CHECK-NEXT: mov z0.d, z1.d
854+
; CHECK-NEXT: rev p0.d, p0.d
855+
; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d
856+
; CHECK-NEXT: ret
857+
%res = call <vscale x 2 x bfloat> @llvm.vector.splice.nxv2bf16(<vscale x 2 x bfloat> %b, <vscale x 2 x bfloat> %b, i32 -1)
858+
ret <vscale x 2 x bfloat> %res
859+
}
860+
713861
define <vscale x 2 x bfloat> @splice_nxv2bf16_first_idx(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) #0 {
714862
; CHECK-LABEL: splice_nxv2bf16_first_idx:
715863
; CHECK: // %bb.0:
@@ -728,6 +876,16 @@ define <vscale x 2 x bfloat> @splice_nxv2bf16_last_idx(<vscale x 2 x bfloat> %a,
728876
ret <vscale x 2 x bfloat> %res
729877
}
730878

879+
define <vscale x 2 x bfloat> @splice_nxv2bf16_first_idx_unary(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) #0 {
880+
; CHECK-LABEL: splice_nxv2bf16_first_idx_unary:
881+
; CHECK: // %bb.0:
882+
; CHECK-NEXT: mov z0.d, z1.d
883+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #8
884+
; CHECK-NEXT: ret
885+
%res = call <vscale x 2 x bfloat> @llvm.vector.splice.nxv2bf16(<vscale x 2 x bfloat> %b, <vscale x 2 x bfloat> %b, i32 1)
886+
ret <vscale x 2 x bfloat> %res
887+
}
888+
731889
define <vscale x 4 x bfloat> @splice_nxv4bf16_neg_idx(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) #0 {
732890
; CHECK-LABEL: splice_nxv4bf16_neg_idx:
733891
; CHECK: // %bb.0:
@@ -750,6 +908,18 @@ define <vscale x 4 x bfloat> @splice_nxv4bf16_neg3_idx(<vscale x 4 x bfloat> %a,
750908
ret <vscale x 4 x bfloat> %res
751909
}
752910

911+
define <vscale x 4 x bfloat> @splice_nxv4bf16_neg_idx_unary(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) #0 {
912+
; CHECK-LABEL: splice_nxv4bf16_neg_idx_unary:
913+
; CHECK: // %bb.0:
914+
; CHECK-NEXT: ptrue p0.s, vl1
915+
; CHECK-NEXT: mov z0.d, z1.d
916+
; CHECK-NEXT: rev p0.s, p0.s
917+
; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s
918+
; CHECK-NEXT: ret
919+
%res = call <vscale x 4 x bfloat> @llvm.vector.splice.nxv4bf16(<vscale x 4 x bfloat> %b, <vscale x 4 x bfloat> %b, i32 -1)
920+
ret <vscale x 4 x bfloat> %res
921+
}
922+
753923
define <vscale x 4 x bfloat> @splice_nxv4bf16_first_idx(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) #0 {
754924
; CHECK-LABEL: splice_nxv4bf16_first_idx:
755925
; CHECK: // %bb.0:
@@ -768,6 +938,16 @@ define <vscale x 4 x bfloat> @splice_nxv4bf16_last_idx(<vscale x 4 x bfloat> %a,
768938
ret <vscale x 4 x bfloat> %res
769939
}
770940

941+
define <vscale x 4 x bfloat> @splice_nxv4bf16_first_idx_unary(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) #0 {
942+
; CHECK-LABEL: splice_nxv4bf16_first_idx_unary:
943+
; CHECK: // %bb.0:
944+
; CHECK-NEXT: mov z0.d, z1.d
945+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4
946+
; CHECK-NEXT: ret
947+
%res = call <vscale x 4 x bfloat> @llvm.vector.splice.nxv4bf16(<vscale x 4 x bfloat> %b, <vscale x 4 x bfloat> %b, i32 1)
948+
ret <vscale x 4 x bfloat> %res
949+
}
950+
771951
define <vscale x 8 x bfloat> @splice_nxv8bf16_first_idx(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) #0 {
772952
; CHECK-LABEL: splice_nxv8bf16_first_idx:
773953
; CHECK: // %bb.0:
@@ -786,6 +966,16 @@ define <vscale x 8 x bfloat> @splice_nxv8bf16_last_idx(<vscale x 8 x bfloat> %a,
786966
ret <vscale x 8 x bfloat> %res
787967
}
788968

969+
define <vscale x 8 x bfloat> @splice_nxv8bf16_first_idx_unary(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) #0 {
970+
; CHECK-LABEL: splice_nxv8bf16_first_idx_unary:
971+
; CHECK: // %bb.0:
972+
; CHECK-NEXT: mov z0.d, z1.d
973+
; CHECK-NEXT: ext z0.b, z0.b, z1.b, #2
974+
; CHECK-NEXT: ret
975+
%res = call <vscale x 8 x bfloat> @llvm.vector.splice.nxv8bf16(<vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %b, i32 1)
976+
ret <vscale x 8 x bfloat> %res
977+
}
978+
789979
; Ensure predicate based splice is promoted to use ZPRs.
790980
define <vscale x 2 x i1> @splice_nxv2i1(<vscale x 2 x i1> %a, <vscale x 2 x i1> %b) #0 {
791981
; CHECK-LABEL: splice_nxv2i1:

0 commit comments

Comments
 (0)