Skip to content

Commit e01de76

Browse files
[LLVM][CodeGen][SVE] Improve custom lowering for EXTRACT_SUBVECTOR.
We can extract any legal fixed length vector from a scalable vector by using VECTOR_SPLICE. I've also taken the time to simplify the code a little.
1 parent 427c5bf commit e01de76

File tree

3 files changed

+31
-149
lines changed

3 files changed

+31
-149
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13897,23 +13897,27 @@ AArch64TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
1389713897

1389813898
SDValue AArch64TargetLowering::LowerEXTRACT_SUBVECTOR(SDValue Op,
1389913899
SelectionDAG &DAG) const {
13900-
assert(Op.getValueType().isFixedLengthVector() &&
13900+
EVT VT = Op.getValueType();
13901+
assert(VT.isFixedLengthVector() &&
1390113902
"Only cases that extract a fixed length vector are supported!");
1390213903

1390313904
EVT InVT = Op.getOperand(0).getValueType();
1390413905
unsigned Idx = Op.getConstantOperandVal(1);
1390513906
unsigned Size = Op.getValueSizeInBits();
1390613907

1390713908
// If we don't have legal types yet, do nothing
13908-
if (!DAG.getTargetLoweringInfo().isTypeLegal(InVT))
13909+
if (!isTypeLegal(InVT))
1390913910
return SDValue();
1391013911

1391113912
if (InVT.isScalableVector()) {
1391213913
// This will be matched by custom code during ISelDAGToDAG.
13913-
if (Idx == 0 && isPackedVectorType(InVT, DAG))
13914+
if (Idx == 0)
1391413915
return Op;
1391513916

13916-
return SDValue();
13917+
SDLoc DL(Op);
13918+
SDValue Splice = DAG.getNode(ISD::VECTOR_SPLICE, DL, InVT, Op.getOperand(0),
13919+
Op.getOperand(0), Op.getOperand(1));
13920+
return convertFromScalableVector(DAG, VT, Splice);
1391713921
}
1391813922

1391913923
// This will get lowered to an appropriate EXTRACT_SUBREG in ISel.
@@ -13934,8 +13938,8 @@ SDValue AArch64TargetLowering::LowerEXTRACT_SUBVECTOR(SDValue Op,
1393413938
convertToScalableVector(DAG, ContainerVT, Op.getOperand(0));
1393513939

1393613940
SDValue Splice = DAG.getNode(ISD::VECTOR_SPLICE, DL, ContainerVT, NewInVec,
13937-
NewInVec, DAG.getConstant(Idx, DL, MVT::i64));
13938-
return convertFromScalableVector(DAG, Op.getValueType(), Splice);
13941+
NewInVec, Op.getOperand(1));
13942+
return convertFromScalableVector(DAG, VT, Splice);
1393913943
}
1394013944

1394113945
return SDValue();

llvm/test/CodeGen/AArch64/sve-extract-fixed-from-scalable-vector.ll

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,8 @@ define <4 x float> @extract_v4f32_nxv16f32_12(<vscale x 16 x float> %arg) {
143143
define <2 x float> @extract_v2f32_nxv16f32_2(<vscale x 16 x float> %arg) {
144144
; CHECK-LABEL: extract_v2f32_nxv16f32_2:
145145
; CHECK: // %bb.0:
146-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
147-
; CHECK-NEXT: addvl sp, sp, #-1
148-
; CHECK-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
149-
; CHECK-NEXT: .cfi_offset w29, -16
150-
; CHECK-NEXT: ptrue p0.s
151-
; CHECK-NEXT: st1w { z0.s }, p0, [sp]
152-
; CHECK-NEXT: ldr d0, [sp, #8]
153-
; CHECK-NEXT: addvl sp, sp, #1
154-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
146+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
147+
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
155148
; CHECK-NEXT: ret
156149
%ext = call <2 x float> @llvm.vector.extract.v2f32.nxv16f32(<vscale x 16 x float> %arg, i64 2)
157150
ret <2 x float> %ext
@@ -274,15 +267,8 @@ define <4 x i3> @extract_v4i3_nxv32i3_16(<vscale x 32 x i3> %arg) {
274267
define <2 x i32> @extract_v2i32_nxv16i32_2(<vscale x 16 x i32> %arg) {
275268
; CHECK-LABEL: extract_v2i32_nxv16i32_2:
276269
; CHECK: // %bb.0:
277-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
278-
; CHECK-NEXT: addvl sp, sp, #-1
279-
; CHECK-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
280-
; CHECK-NEXT: .cfi_offset w29, -16
281-
; CHECK-NEXT: ptrue p0.s
282-
; CHECK-NEXT: st1w { z0.s }, p0, [sp]
283-
; CHECK-NEXT: ldr d0, [sp, #8]
284-
; CHECK-NEXT: addvl sp, sp, #1
285-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
270+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
271+
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
286272
; CHECK-NEXT: ret
287273
%ext = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %arg, i64 2)
288274
ret <2 x i32> %ext

llvm/test/CodeGen/AArch64/sve-extract-fixed-vector.ll

Lines changed: 17 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,8 @@ define <2 x i64> @extract_v2i64_nxv2i64(<vscale x 2 x i64> %vec) nounwind {
1515
define <2 x i64> @extract_v2i64_nxv2i64_idx2(<vscale x 2 x i64> %vec) nounwind {
1616
; CHECK-LABEL: extract_v2i64_nxv2i64_idx2:
1717
; CHECK: // %bb.0:
18-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
19-
; CHECK-NEXT: addvl sp, sp, #-1
20-
; CHECK-NEXT: cntd x8
21-
; CHECK-NEXT: mov w9, #2 // =0x2
22-
; CHECK-NEXT: ptrue p0.d
23-
; CHECK-NEXT: sub x8, x8, #2
24-
; CHECK-NEXT: cmp x8, #2
25-
; CHECK-NEXT: st1d { z0.d }, p0, [sp]
26-
; CHECK-NEXT: csel x8, x8, x9, lo
27-
; CHECK-NEXT: mov x9, sp
28-
; CHECK-NEXT: lsl x8, x8, #3
29-
; CHECK-NEXT: ldr q0, [x9, x8]
30-
; CHECK-NEXT: addvl sp, sp, #1
31-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
18+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #16
19+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
3220
; CHECK-NEXT: ret
3321
%retval = call <2 x i64> @llvm.vector.extract.v2i64.nxv2i64(<vscale x 2 x i64> %vec, i64 2)
3422
ret <2 x i64> %retval
@@ -48,20 +36,8 @@ define <4 x i32> @extract_v4i32_nxv4i32(<vscale x 4 x i32> %vec) nounwind {
4836
define <4 x i32> @extract_v4i32_nxv4i32_idx4(<vscale x 4 x i32> %vec) nounwind {
4937
; CHECK-LABEL: extract_v4i32_nxv4i32_idx4:
5038
; CHECK: // %bb.0:
51-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
52-
; CHECK-NEXT: addvl sp, sp, #-1
53-
; CHECK-NEXT: cntw x8
54-
; CHECK-NEXT: mov w9, #4 // =0x4
55-
; CHECK-NEXT: ptrue p0.s
56-
; CHECK-NEXT: sub x8, x8, #4
57-
; CHECK-NEXT: cmp x8, #4
58-
; CHECK-NEXT: st1w { z0.s }, p0, [sp]
59-
; CHECK-NEXT: csel x8, x8, x9, lo
60-
; CHECK-NEXT: mov x9, sp
61-
; CHECK-NEXT: lsl x8, x8, #2
62-
; CHECK-NEXT: ldr q0, [x9, x8]
63-
; CHECK-NEXT: addvl sp, sp, #1
64-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
39+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #16
40+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
6541
; CHECK-NEXT: ret
6642
%retval = call <4 x i32> @llvm.vector.extract.v4i32.nxv4i32(<vscale x 4 x i32> %vec, i64 4)
6743
ret <4 x i32> %retval
@@ -82,18 +58,9 @@ define <4 x i32> @extract_v4i32_nxv2i32(<vscale x 2 x i32> %vec) nounwind #1 {
8258
define <4 x i32> @extract_v4i32_nxv2i32_idx4(<vscale x 2 x i32> %vec) nounwind #1 {
8359
; CHECK-LABEL: extract_v4i32_nxv2i32_idx4:
8460
; CHECK: // %bb.0:
85-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
86-
; CHECK-NEXT: addvl sp, sp, #-1
87-
; CHECK-NEXT: ptrue p0.d
88-
; CHECK-NEXT: mov x8, #4 // =0x4
89-
; CHECK-NEXT: mov x9, sp
90-
; CHECK-NEXT: ptrue p1.d, vl4
91-
; CHECK-NEXT: st1d { z0.d }, p0, [sp]
92-
; CHECK-NEXT: ld1d { z0.d }, p1/z, [x9, x8, lsl #3]
61+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #32
9362
; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s
9463
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
95-
; CHECK-NEXT: addvl sp, sp, #1
96-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
9764
; CHECK-NEXT: ret
9865
%retval = call <4 x i32> @llvm.vector.extract.v4i32.nxv2i32(<vscale x 2 x i32> %vec, i64 4)
9966
ret <4 x i32> %retval
@@ -113,20 +80,8 @@ define <8 x i16> @extract_v8i16_nxv8i16(<vscale x 8 x i16> %vec) nounwind {
11380
define <8 x i16> @extract_v8i16_nxv8i16_idx8(<vscale x 8 x i16> %vec) nounwind {
11481
; CHECK-LABEL: extract_v8i16_nxv8i16_idx8:
11582
; CHECK: // %bb.0:
116-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
117-
; CHECK-NEXT: addvl sp, sp, #-1
118-
; CHECK-NEXT: cnth x8
119-
; CHECK-NEXT: mov w9, #8 // =0x8
120-
; CHECK-NEXT: ptrue p0.h
121-
; CHECK-NEXT: sub x8, x8, #8
122-
; CHECK-NEXT: cmp x8, #8
123-
; CHECK-NEXT: st1h { z0.h }, p0, [sp]
124-
; CHECK-NEXT: csel x8, x8, x9, lo
125-
; CHECK-NEXT: mov x9, sp
126-
; CHECK-NEXT: lsl x8, x8, #1
127-
; CHECK-NEXT: ldr q0, [x9, x8]
128-
; CHECK-NEXT: addvl sp, sp, #1
129-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
83+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #16
84+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
13085
; CHECK-NEXT: ret
13186
%retval = call <8 x i16> @llvm.vector.extract.v8i16.nxv8i16(<vscale x 8 x i16> %vec, i64 8)
13287
ret <8 x i16> %retval
@@ -147,18 +102,9 @@ define <8 x i16> @extract_v8i16_nxv4i16(<vscale x 4 x i16> %vec) nounwind #1 {
147102
define <8 x i16> @extract_v8i16_nxv4i16_idx8(<vscale x 4 x i16> %vec) nounwind #1 {
148103
; CHECK-LABEL: extract_v8i16_nxv4i16_idx8:
149104
; CHECK: // %bb.0:
150-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
151-
; CHECK-NEXT: addvl sp, sp, #-1
152-
; CHECK-NEXT: ptrue p0.s
153-
; CHECK-NEXT: mov x8, #8 // =0x8
154-
; CHECK-NEXT: mov x9, sp
155-
; CHECK-NEXT: ptrue p1.s, vl8
156-
; CHECK-NEXT: st1w { z0.s }, p0, [sp]
157-
; CHECK-NEXT: ld1w { z0.s }, p1/z, [x9, x8, lsl #2]
105+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #32
158106
; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h
159107
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
160-
; CHECK-NEXT: addvl sp, sp, #1
161-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
162108
; CHECK-NEXT: ret
163109
%retval = call <8 x i16> @llvm.vector.extract.v8i16.nxv4i16(<vscale x 4 x i16> %vec, i64 8)
164110
ret <8 x i16> %retval
@@ -180,19 +126,10 @@ define <8 x i16> @extract_v8i16_nxv2i16(<vscale x 2 x i16> %vec) nounwind #1 {
180126
define <8 x i16> @extract_v8i16_nxv2i16_idx8(<vscale x 2 x i16> %vec) nounwind #1 {
181127
; CHECK-LABEL: extract_v8i16_nxv2i16_idx8:
182128
; CHECK: // %bb.0:
183-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
184-
; CHECK-NEXT: addvl sp, sp, #-1
185-
; CHECK-NEXT: ptrue p0.d
186-
; CHECK-NEXT: mov x8, #8 // =0x8
187-
; CHECK-NEXT: mov x9, sp
188-
; CHECK-NEXT: ptrue p1.d, vl8
189-
; CHECK-NEXT: st1d { z0.d }, p0, [sp]
190-
; CHECK-NEXT: ld1d { z0.d }, p1/z, [x9, x8, lsl #3]
129+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #64
191130
; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s
192131
; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h
193132
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
194-
; CHECK-NEXT: addvl sp, sp, #1
195-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
196133
; CHECK-NEXT: ret
197134
%retval = call <8 x i16> @llvm.vector.extract.v8i16.nxv2i16(<vscale x 2 x i16> %vec, i64 8)
198135
ret <8 x i16> %retval
@@ -212,19 +149,8 @@ define <16 x i8> @extract_v16i8_nxv16i8(<vscale x 16 x i8> %vec) nounwind {
212149
define <16 x i8> @extract_v16i8_nxv16i8_idx16(<vscale x 16 x i8> %vec) nounwind {
213150
; CHECK-LABEL: extract_v16i8_nxv16i8_idx16:
214151
; CHECK: // %bb.0:
215-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
216-
; CHECK-NEXT: addvl sp, sp, #-1
217-
; CHECK-NEXT: rdvl x8, #1
218-
; CHECK-NEXT: ptrue p0.b
219-
; CHECK-NEXT: mov w9, #16 // =0x10
220-
; CHECK-NEXT: sub x8, x8, #16
221-
; CHECK-NEXT: cmp x8, #16
222-
; CHECK-NEXT: st1b { z0.b }, p0, [sp]
223-
; CHECK-NEXT: csel x8, x8, x9, lo
224-
; CHECK-NEXT: mov x9, sp
225-
; CHECK-NEXT: ldr q0, [x9, x8]
226-
; CHECK-NEXT: addvl sp, sp, #1
227-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
152+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #16
153+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
228154
; CHECK-NEXT: ret
229155
%retval = call <16 x i8> @llvm.vector.extract.v16i8.nxv16i8(<vscale x 16 x i8> %vec, i64 16)
230156
ret <16 x i8> %retval
@@ -245,18 +171,9 @@ define <16 x i8> @extract_v16i8_nxv8i8(<vscale x 8 x i8> %vec) nounwind #1 {
245171
define <16 x i8> @extract_v16i8_nxv8i8_idx16(<vscale x 8 x i8> %vec) nounwind #1 {
246172
; CHECK-LABEL: extract_v16i8_nxv8i8_idx16:
247173
; CHECK: // %bb.0:
248-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
249-
; CHECK-NEXT: addvl sp, sp, #-1
250-
; CHECK-NEXT: ptrue p0.h
251-
; CHECK-NEXT: mov x8, #16 // =0x10
252-
; CHECK-NEXT: mov x9, sp
253-
; CHECK-NEXT: ptrue p1.h, vl16
254-
; CHECK-NEXT: st1h { z0.h }, p0, [sp]
255-
; CHECK-NEXT: ld1h { z0.h }, p1/z, [x9, x8, lsl #1]
174+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #32
256175
; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b
257176
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
258-
; CHECK-NEXT: addvl sp, sp, #1
259-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
260177
; CHECK-NEXT: ret
261178
%retval = call <16 x i8> @llvm.vector.extract.v16i8.nxv8i8(<vscale x 8 x i8> %vec, i64 16)
262179
ret <16 x i8> %retval
@@ -278,19 +195,10 @@ define <16 x i8> @extract_v16i8_nxv4i8(<vscale x 4 x i8> %vec) nounwind #1 {
278195
define <16 x i8> @extract_v16i8_nxv4i8_idx16(<vscale x 4 x i8> %vec) nounwind #1 {
279196
; CHECK-LABEL: extract_v16i8_nxv4i8_idx16:
280197
; CHECK: // %bb.0:
281-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
282-
; CHECK-NEXT: addvl sp, sp, #-1
283-
; CHECK-NEXT: ptrue p0.s
284-
; CHECK-NEXT: mov x8, #16 // =0x10
285-
; CHECK-NEXT: mov x9, sp
286-
; CHECK-NEXT: ptrue p1.s, vl16
287-
; CHECK-NEXT: st1w { z0.s }, p0, [sp]
288-
; CHECK-NEXT: ld1w { z0.s }, p1/z, [x9, x8, lsl #2]
198+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #64
289199
; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h
290200
; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b
291201
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
292-
; CHECK-NEXT: addvl sp, sp, #1
293-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
294202
; CHECK-NEXT: ret
295203
%retval = call <16 x i8> @llvm.vector.extract.v16i8.nxv4i8(<vscale x 4 x i8> %vec, i64 16)
296204
ret <16 x i8> %retval
@@ -313,17 +221,11 @@ define <16 x i8> @extract_v16i8_nxv2i8(<vscale x 2 x i8> %vec) nounwind #1 {
313221
define <16 x i8> @extract_v16i8_nxv2i8_idx16(<vscale x 2 x i8> %vec) nounwind #1 {
314222
; CHECK-LABEL: extract_v16i8_nxv2i8_idx16:
315223
; CHECK: // %bb.0:
316-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
317-
; CHECK-NEXT: addvl sp, sp, #-1
318-
; CHECK-NEXT: ptrue p0.d
319-
; CHECK-NEXT: st1d { z0.d }, p0, [sp]
320-
; CHECK-NEXT: ld1d { z0.d }, p0/z, [sp]
224+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #128
321225
; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s
322226
; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h
323227
; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b
324228
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
325-
; CHECK-NEXT: addvl sp, sp, #1
326-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
327229
; CHECK-NEXT: ret
328230
%retval = call <16 x i8> @llvm.vector.extract.v16i8.nxv2i8(<vscale x 2 x i8> %vec, i64 16)
329231
ret <16 x i8> %retval
@@ -434,13 +336,8 @@ define <16 x i1> @extract_v16i1_nxv16i1(<vscale x 16 x i1> %inmask) {
434336
define <2 x i64> @extract_fixed_v2i64_nxv2i64(<vscale x 2 x i64> %vec) nounwind #0 {
435337
; CHECK-LABEL: extract_fixed_v2i64_nxv2i64:
436338
; CHECK: // %bb.0:
437-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
438-
; CHECK-NEXT: addvl sp, sp, #-1
439-
; CHECK-NEXT: ptrue p0.d
440-
; CHECK-NEXT: st1d { z0.d }, p0, [sp]
441-
; CHECK-NEXT: ldr q0, [sp, #16]
442-
; CHECK-NEXT: addvl sp, sp, #1
443-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
339+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #16
340+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
444341
; CHECK-NEXT: ret
445342
%retval = call <2 x i64> @llvm.vector.extract.v2i64.nxv2i64(<vscale x 2 x i64> %vec, i64 2)
446343
ret <2 x i64> %retval
@@ -449,14 +346,9 @@ define <2 x i64> @extract_fixed_v2i64_nxv2i64(<vscale x 2 x i64> %vec) nounwind
449346
define void @extract_fixed_v4i64_nxv2i64(<vscale x 2 x i64> %vec, ptr %p) nounwind #0 {
450347
; CHECK-LABEL: extract_fixed_v4i64_nxv2i64:
451348
; CHECK: // %bb.0:
452-
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
453-
; CHECK-NEXT: addvl sp, sp, #-1
349+
; CHECK-NEXT: ext z0.b, z0.b, z0.b, #32
454350
; CHECK-NEXT: ptrue p0.d
455-
; CHECK-NEXT: st1d { z0.d }, p0, [sp]
456-
; CHECK-NEXT: ld1d { z0.d }, p0/z, [sp]
457351
; CHECK-NEXT: st1d { z0.d }, p0, [x0]
458-
; CHECK-NEXT: addvl sp, sp, #1
459-
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
460352
; CHECK-NEXT: ret
461353
%retval = call <4 x i64> @llvm.vector.extract.v4i64.nxv2i64(<vscale x 2 x i64> %vec, i64 4)
462354
store <4 x i64> %retval, ptr %p

0 commit comments

Comments
 (0)