Skip to content

Commit bb77047

Browse files
authored
[RISCV] Handle fixed length vectors with exact VLEN in loweringEXTRACT_SUBVECTOR (#79949)
This is a revival of #65392. When we lower an extract_subvector, we extract the subregister that the subvector is contained in first and then do a vslidedown with LMUL=1. We can currently only do this for scalable vectors though because the index is scaled by vscale and thus we will know what subregister the subvector lies in. For fixed length vectors, the index isn't scaled by vscale and so the subvector could lie in any arbitrary subregister, so we have to do a vslidedown with the full LMUL. The exception to this is when we know the exact VLEN: in which case, we can still work out the exact subregister and do the LMUL=1 vslidedown on it. This patch handles this case by scaling the index by 1/vscale before computing the subregister, and extending the LMUL=1 path to handle fixed length vectors.
1 parent 85e6e71 commit bb77047

File tree

2 files changed

+181
-90
lines changed

2 files changed

+181
-90
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9727,12 +9727,15 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
97279727
if (OrigIdx == 0)
97289728
return Op;
97299729

9730-
// If the subvector vector is a fixed-length type, we cannot use subregister
9731-
// manipulation to simplify the codegen; we don't know which register of a
9732-
// LMUL group contains the specific subvector as we only know the minimum
9733-
// register size. Therefore we must slide the vector group down the full
9734-
// amount.
9735-
if (SubVecVT.isFixedLengthVector()) {
9730+
const unsigned MinVLen = Subtarget.getRealMinVLen();
9731+
const unsigned MaxVLen = Subtarget.getRealMaxVLen();
9732+
9733+
// If the subvector vector is a fixed-length type and we don't know VLEN
9734+
// exactly, we cannot use subregister manipulation to simplify the codegen; we
9735+
// don't know which register of a LMUL group contains the specific subvector
9736+
// as we only know the minimum register size. Therefore we must slide the
9737+
// vector group down the full amount.
9738+
if (SubVecVT.isFixedLengthVector() && MinVLen != MaxVLen) {
97369739
MVT ContainerVT = VecVT;
97379740
if (VecVT.isFixedLengthVector()) {
97389741
ContainerVT = getContainerForFixedLengthVector(VecVT);
@@ -9764,19 +9767,47 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
97649767
return DAG.getBitcast(Op.getValueType(), Slidedown);
97659768
}
97669769

9770+
if (VecVT.isFixedLengthVector()) {
9771+
VecVT = getContainerForFixedLengthVector(VecVT);
9772+
Vec = convertToScalableVector(VecVT, Vec, DAG, Subtarget);
9773+
}
9774+
9775+
MVT ContainerSubVecVT = SubVecVT;
9776+
if (SubVecVT.isFixedLengthVector())
9777+
ContainerSubVecVT = getContainerForFixedLengthVector(SubVecVT);
9778+
97679779
unsigned SubRegIdx, RemIdx;
9768-
std::tie(SubRegIdx, RemIdx) =
9769-
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
9770-
VecVT, SubVecVT, OrigIdx, TRI);
9780+
// extract_subvector scales the index by vscale is the subvector is scalable,
9781+
// and decomposeSubvectorInsertExtractToSubRegs takes this into account. So if
9782+
// we have a fixed length subvector, we need to adjust the index by 1/vscale.
9783+
if (SubVecVT.isFixedLengthVector()) {
9784+
assert(MinVLen == MaxVLen);
9785+
unsigned Vscale = MinVLen / RISCV::RVVBitsPerBlock;
9786+
std::tie(SubRegIdx, RemIdx) =
9787+
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
9788+
VecVT, ContainerSubVecVT, OrigIdx / Vscale, TRI);
9789+
RemIdx = (RemIdx * Vscale) + (OrigIdx % Vscale);
9790+
} else {
9791+
std::tie(SubRegIdx, RemIdx) =
9792+
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
9793+
VecVT, ContainerSubVecVT, OrigIdx, TRI);
9794+
}
97719795

97729796
// If the Idx has been completely eliminated then this is a subvector extract
97739797
// which naturally aligns to a vector register. These can easily be handled
97749798
// using subregister manipulation.
9775-
if (RemIdx == 0)
9799+
if (RemIdx == 0) {
9800+
if (SubVecVT.isFixedLengthVector()) {
9801+
Vec = DAG.getTargetExtractSubreg(SubRegIdx, DL, ContainerSubVecVT, Vec);
9802+
return convertFromScalableVector(SubVecVT, Vec, DAG, Subtarget);
9803+
}
97769804
return Op;
9805+
}
97779806

9778-
// Else SubVecVT is a fractional LMUL and may need to be slid down.
9779-
assert(RISCVVType::decodeVLMUL(getLMUL(SubVecVT)).second);
9807+
// Else SubVecVT is a fractional LMUL and may need to be slid down: if
9808+
// SubVecVT was > M1 then the index would need to be a multiple of VLMAX, and
9809+
// so would divide exactly.
9810+
assert(RISCVVType::decodeVLMUL(getLMUL(ContainerSubVecVT)).second);
97809811

97819812
// If the vector type is an LMUL-group type, extract a subvector equal to the
97829813
// nearest full vector register type.
@@ -9791,10 +9822,17 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
97919822

97929823
// Slide this vector register down by the desired number of elements in order
97939824
// to place the desired subvector starting at element 0.
9794-
SDValue SlidedownAmt =
9795-
DAG.getVScale(DL, XLenVT, APInt(XLenVT.getSizeInBits(), RemIdx));
9825+
SDValue SlidedownAmt;
9826+
if (SubVecVT.isFixedLengthVector())
9827+
SlidedownAmt = DAG.getConstant(RemIdx, DL, Subtarget.getXLenVT());
9828+
else
9829+
SlidedownAmt =
9830+
DAG.getVScale(DL, XLenVT, APInt(XLenVT.getSizeInBits(), RemIdx));
97969831

97979832
auto [Mask, VL] = getDefaultScalableVLOps(InterSubVT, DL, DAG, Subtarget);
9833+
if (SubVecVT.isFixedLengthVector())
9834+
VL = getVLOp(SubVecVT.getVectorNumElements(), InterSubVT, DL, DAG,
9835+
Subtarget);
97989836
SDValue Slidedown =
97999837
getVSlidedown(DAG, Subtarget, DL, InterSubVT, DAG.getUNDEF(InterSubVT),
98009838
Vec, SlidedownAmt, Mask, VL);

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-extract-subvector.ll

Lines changed: 129 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,8 @@ define void @extract_v1i32_v8i32_4(ptr %x, ptr %y) {
7676
; CHECK-KNOWNVLEN128-LABEL: extract_v1i32_v8i32_4:
7777
; CHECK-KNOWNVLEN128: # %bb.0:
7878
; CHECK-KNOWNVLEN128-NEXT: vl2re32.v v8, (a0)
79-
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 1, e32, m2, ta, ma
80-
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v8, 4
8179
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 1, e32, mf2, ta, ma
82-
; CHECK-KNOWNVLEN128-NEXT: vse32.v v8, (a1)
80+
; CHECK-KNOWNVLEN128-NEXT: vse32.v v9, (a1)
8381
; CHECK-KNOWNVLEN128-NEXT: ret
8482
%a = load <8 x i32>, ptr %x
8583
%c = call <1 x i32> @llvm.vector.extract.v1i32.v8i32(<8 x i32> %a, i64 4)
@@ -101,8 +99,8 @@ define void @extract_v1i32_v8i32_5(ptr %x, ptr %y) {
10199
; CHECK-KNOWNVLEN128-LABEL: extract_v1i32_v8i32_5:
102100
; CHECK-KNOWNVLEN128: # %bb.0:
103101
; CHECK-KNOWNVLEN128-NEXT: vl2re32.v v8, (a0)
104-
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 1, e32, m2, ta, ma
105-
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v8, 5
102+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 1, e32, m1, ta, ma
103+
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v9, 1
106104
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 1, e32, mf2, ta, ma
107105
; CHECK-KNOWNVLEN128-NEXT: vse32.v v8, (a1)
108106
; CHECK-KNOWNVLEN128-NEXT: ret
@@ -172,10 +170,8 @@ define void @extract_v2i32_v8i32_4(ptr %x, ptr %y) {
172170
; CHECK-KNOWNVLEN128-LABEL: extract_v2i32_v8i32_4:
173171
; CHECK-KNOWNVLEN128: # %bb.0:
174172
; CHECK-KNOWNVLEN128-NEXT: vl2re32.v v8, (a0)
175-
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, m2, ta, ma
176-
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v8, 4
177173
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
178-
; CHECK-KNOWNVLEN128-NEXT: vse32.v v8, (a1)
174+
; CHECK-KNOWNVLEN128-NEXT: vse32.v v9, (a1)
179175
; CHECK-KNOWNVLEN128-NEXT: ret
180176
%a = load <8 x i32>, ptr %x
181177
%c = call <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 4)
@@ -197,8 +193,8 @@ define void @extract_v2i32_v8i32_6(ptr %x, ptr %y) {
197193
; CHECK-KNOWNVLEN128-LABEL: extract_v2i32_v8i32_6:
198194
; CHECK-KNOWNVLEN128: # %bb.0:
199195
; CHECK-KNOWNVLEN128-NEXT: vl2re32.v v8, (a0)
200-
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, m2, ta, ma
201-
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v8, 6
196+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, m1, ta, ma
197+
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v9, 2
202198
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
203199
; CHECK-KNOWNVLEN128-NEXT: vse32.v v8, (a1)
204200
; CHECK-KNOWNVLEN128-NEXT: ret
@@ -234,39 +230,59 @@ define void @extract_v2i32_nxv16i32_2(<vscale x 16 x i32> %x, ptr %y) {
234230
}
235231

236232
define void @extract_v2i32_nxv16i32_4(<vscale x 16 x i32> %x, ptr %y) {
237-
; CHECK-LABEL: extract_v2i32_nxv16i32_4:
238-
; CHECK: # %bb.0:
239-
; CHECK-NEXT: vsetivli zero, 2, e32, m2, ta, ma
240-
; CHECK-NEXT: vslidedown.vi v8, v8, 4
241-
; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
242-
; CHECK-NEXT: vse32.v v8, (a0)
243-
; CHECK-NEXT: ret
233+
; CHECK-V-LABEL: extract_v2i32_nxv16i32_4:
234+
; CHECK-V: # %bb.0:
235+
; CHECK-V-NEXT: vsetivli zero, 2, e32, m2, ta, ma
236+
; CHECK-V-NEXT: vslidedown.vi v8, v8, 4
237+
; CHECK-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
238+
; CHECK-V-NEXT: vse32.v v8, (a0)
239+
; CHECK-V-NEXT: ret
240+
;
241+
; CHECK-KNOWNVLEN128-LABEL: extract_v2i32_nxv16i32_4:
242+
; CHECK-KNOWNVLEN128: # %bb.0:
243+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
244+
; CHECK-KNOWNVLEN128-NEXT: vse32.v v9, (a0)
245+
; CHECK-KNOWNVLEN128-NEXT: ret
244246
%c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 4)
245247
store <2 x i32> %c, ptr %y
246248
ret void
247249
}
248250

249251
define void @extract_v2i32_nxv16i32_6(<vscale x 16 x i32> %x, ptr %y) {
250-
; CHECK-LABEL: extract_v2i32_nxv16i32_6:
251-
; CHECK: # %bb.0:
252-
; CHECK-NEXT: vsetivli zero, 2, e32, m2, ta, ma
253-
; CHECK-NEXT: vslidedown.vi v8, v8, 6
254-
; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
255-
; CHECK-NEXT: vse32.v v8, (a0)
256-
; CHECK-NEXT: ret
252+
; CHECK-V-LABEL: extract_v2i32_nxv16i32_6:
253+
; CHECK-V: # %bb.0:
254+
; CHECK-V-NEXT: vsetivli zero, 2, e32, m2, ta, ma
255+
; CHECK-V-NEXT: vslidedown.vi v8, v8, 6
256+
; CHECK-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
257+
; CHECK-V-NEXT: vse32.v v8, (a0)
258+
; CHECK-V-NEXT: ret
259+
;
260+
; CHECK-KNOWNVLEN128-LABEL: extract_v2i32_nxv16i32_6:
261+
; CHECK-KNOWNVLEN128: # %bb.0:
262+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, m1, ta, ma
263+
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v9, 2
264+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
265+
; CHECK-KNOWNVLEN128-NEXT: vse32.v v8, (a0)
266+
; CHECK-KNOWNVLEN128-NEXT: ret
257267
%c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 6)
258268
store <2 x i32> %c, ptr %y
259269
ret void
260270
}
261271

262272
define void @extract_v2i32_nxv16i32_8(<vscale x 16 x i32> %x, ptr %y) {
263-
; CHECK-LABEL: extract_v2i32_nxv16i32_8:
264-
; CHECK: # %bb.0:
265-
; CHECK-NEXT: vsetivli zero, 2, e32, m4, ta, ma
266-
; CHECK-NEXT: vslidedown.vi v8, v8, 8
267-
; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
268-
; CHECK-NEXT: vse32.v v8, (a0)
269-
; CHECK-NEXT: ret
273+
; CHECK-V-LABEL: extract_v2i32_nxv16i32_8:
274+
; CHECK-V: # %bb.0:
275+
; CHECK-V-NEXT: vsetivli zero, 2, e32, m4, ta, ma
276+
; CHECK-V-NEXT: vslidedown.vi v8, v8, 8
277+
; CHECK-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
278+
; CHECK-V-NEXT: vse32.v v8, (a0)
279+
; CHECK-V-NEXT: ret
280+
;
281+
; CHECK-KNOWNVLEN128-LABEL: extract_v2i32_nxv16i32_8:
282+
; CHECK-KNOWNVLEN128: # %bb.0:
283+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
284+
; CHECK-KNOWNVLEN128-NEXT: vse32.v v10, (a0)
285+
; CHECK-KNOWNVLEN128-NEXT: ret
270286
%c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 8)
271287
store <2 x i32> %c, ptr %y
272288
ret void
@@ -333,9 +349,7 @@ define void @extract_v8i32_nxv16i32_8(<vscale x 16 x i32> %x, ptr %y) {
333349
;
334350
; CHECK-KNOWNVLEN128-LABEL: extract_v8i32_nxv16i32_8:
335351
; CHECK-KNOWNVLEN128: # %bb.0:
336-
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 8, e32, m4, ta, ma
337-
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v8, 8
338-
; CHECK-KNOWNVLEN128-NEXT: vs2r.v v8, (a0)
352+
; CHECK-KNOWNVLEN128-NEXT: vs2r.v v10, (a0)
339353
; CHECK-KNOWNVLEN128-NEXT: ret
340354
%c = call <8 x i32> @llvm.vector.extract.v8i32.nxv16i32(<vscale x 16 x i32> %x, i64 8)
341355
store <8 x i32> %c, ptr %y
@@ -611,9 +625,8 @@ define void @extract_v2i1_v64i1_42(ptr %x, ptr %y) {
611625
; CHECK-KNOWNVLEN128-NEXT: vlm.v v0, (a0)
612626
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v8, 0
613627
; CHECK-KNOWNVLEN128-NEXT: vmerge.vim v8, v8, 1, v0
614-
; CHECK-KNOWNVLEN128-NEXT: li a0, 42
615-
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, m4, ta, ma
616-
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vx v8, v8, a0
628+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, m1, ta, ma
629+
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v10, 10
617630
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
618631
; CHECK-KNOWNVLEN128-NEXT: vmsne.vi v0, v8, 0
619632
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v8, 0
@@ -741,51 +754,91 @@ define void @extract_v2i1_nxv64i1_2(<vscale x 64 x i1> %x, ptr %y) {
741754
}
742755

743756
define void @extract_v2i1_nxv64i1_42(<vscale x 64 x i1> %x, ptr %y) {
744-
; CHECK-LABEL: extract_v2i1_nxv64i1_42:
745-
; CHECK: # %bb.0:
746-
; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma
747-
; CHECK-NEXT: vmv.v.i v8, 0
748-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
749-
; CHECK-NEXT: li a1, 42
750-
; CHECK-NEXT: vsetivli zero, 2, e8, m4, ta, ma
751-
; CHECK-NEXT: vslidedown.vx v8, v8, a1
752-
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
753-
; CHECK-NEXT: vmsne.vi v0, v8, 0
754-
; CHECK-NEXT: vmv.v.i v8, 0
755-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
756-
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
757-
; CHECK-NEXT: vmv.v.i v9, 0
758-
; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, ma
759-
; CHECK-NEXT: vmv.v.v v9, v8
760-
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
761-
; CHECK-NEXT: vmsne.vi v8, v9, 0
762-
; CHECK-NEXT: vsm.v v8, (a0)
763-
; CHECK-NEXT: ret
757+
; CHECK-V-LABEL: extract_v2i1_nxv64i1_42:
758+
; CHECK-V: # %bb.0:
759+
; CHECK-V-NEXT: vsetvli a1, zero, e8, m8, ta, ma
760+
; CHECK-V-NEXT: vmv.v.i v8, 0
761+
; CHECK-V-NEXT: vmerge.vim v8, v8, 1, v0
762+
; CHECK-V-NEXT: li a1, 42
763+
; CHECK-V-NEXT: vsetivli zero, 2, e8, m4, ta, ma
764+
; CHECK-V-NEXT: vslidedown.vx v8, v8, a1
765+
; CHECK-V-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
766+
; CHECK-V-NEXT: vmsne.vi v0, v8, 0
767+
; CHECK-V-NEXT: vmv.v.i v8, 0
768+
; CHECK-V-NEXT: vmerge.vim v8, v8, 1, v0
769+
; CHECK-V-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
770+
; CHECK-V-NEXT: vmv.v.i v9, 0
771+
; CHECK-V-NEXT: vsetivli zero, 2, e8, mf2, tu, ma
772+
; CHECK-V-NEXT: vmv.v.v v9, v8
773+
; CHECK-V-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
774+
; CHECK-V-NEXT: vmsne.vi v8, v9, 0
775+
; CHECK-V-NEXT: vsm.v v8, (a0)
776+
; CHECK-V-NEXT: ret
777+
;
778+
; CHECK-KNOWNVLEN128-LABEL: extract_v2i1_nxv64i1_42:
779+
; CHECK-KNOWNVLEN128: # %bb.0:
780+
; CHECK-KNOWNVLEN128-NEXT: vsetvli a1, zero, e8, m8, ta, ma
781+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v8, 0
782+
; CHECK-KNOWNVLEN128-NEXT: vmerge.vim v8, v8, 1, v0
783+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, m1, ta, ma
784+
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v10, 10
785+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
786+
; CHECK-KNOWNVLEN128-NEXT: vmsne.vi v0, v8, 0
787+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v8, 0
788+
; CHECK-KNOWNVLEN128-NEXT: vmerge.vim v8, v8, 1, v0
789+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
790+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v9, 0
791+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, mf2, tu, ma
792+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.v v9, v8
793+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
794+
; CHECK-KNOWNVLEN128-NEXT: vmsne.vi v8, v9, 0
795+
; CHECK-KNOWNVLEN128-NEXT: vsm.v v8, (a0)
796+
; CHECK-KNOWNVLEN128-NEXT: ret
764797
%c = call <2 x i1> @llvm.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 42)
765798
store <2 x i1> %c, ptr %y
766799
ret void
767800
}
768801

769802
define void @extract_v2i1_nxv32i1_26(<vscale x 32 x i1> %x, ptr %y) {
770-
; CHECK-LABEL: extract_v2i1_nxv32i1_26:
771-
; CHECK: # %bb.0:
772-
; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma
773-
; CHECK-NEXT: vmv.v.i v8, 0
774-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
775-
; CHECK-NEXT: vsetivli zero, 2, e8, m2, ta, ma
776-
; CHECK-NEXT: vslidedown.vi v8, v8, 26
777-
; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
778-
; CHECK-NEXT: vmsne.vi v0, v8, 0
779-
; CHECK-NEXT: vmv.v.i v8, 0
780-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
781-
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
782-
; CHECK-NEXT: vmv.v.i v9, 0
783-
; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, ma
784-
; CHECK-NEXT: vmv.v.v v9, v8
785-
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
786-
; CHECK-NEXT: vmsne.vi v8, v9, 0
787-
; CHECK-NEXT: vsm.v v8, (a0)
788-
; CHECK-NEXT: ret
803+
; CHECK-V-LABEL: extract_v2i1_nxv32i1_26:
804+
; CHECK-V: # %bb.0:
805+
; CHECK-V-NEXT: vsetvli a1, zero, e8, m4, ta, ma
806+
; CHECK-V-NEXT: vmv.v.i v8, 0
807+
; CHECK-V-NEXT: vmerge.vim v8, v8, 1, v0
808+
; CHECK-V-NEXT: vsetivli zero, 2, e8, m2, ta, ma
809+
; CHECK-V-NEXT: vslidedown.vi v8, v8, 26
810+
; CHECK-V-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
811+
; CHECK-V-NEXT: vmsne.vi v0, v8, 0
812+
; CHECK-V-NEXT: vmv.v.i v8, 0
813+
; CHECK-V-NEXT: vmerge.vim v8, v8, 1, v0
814+
; CHECK-V-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
815+
; CHECK-V-NEXT: vmv.v.i v9, 0
816+
; CHECK-V-NEXT: vsetivli zero, 2, e8, mf2, tu, ma
817+
; CHECK-V-NEXT: vmv.v.v v9, v8
818+
; CHECK-V-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
819+
; CHECK-V-NEXT: vmsne.vi v8, v9, 0
820+
; CHECK-V-NEXT: vsm.v v8, (a0)
821+
; CHECK-V-NEXT: ret
822+
;
823+
; CHECK-KNOWNVLEN128-LABEL: extract_v2i1_nxv32i1_26:
824+
; CHECK-KNOWNVLEN128: # %bb.0:
825+
; CHECK-KNOWNVLEN128-NEXT: vsetvli a1, zero, e8, m4, ta, ma
826+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v8, 0
827+
; CHECK-KNOWNVLEN128-NEXT: vmerge.vim v8, v8, 1, v0
828+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, m1, ta, ma
829+
; CHECK-KNOWNVLEN128-NEXT: vslidedown.vi v8, v9, 10
830+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
831+
; CHECK-KNOWNVLEN128-NEXT: vmsne.vi v0, v8, 0
832+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v8, 0
833+
; CHECK-KNOWNVLEN128-NEXT: vmerge.vim v8, v8, 1, v0
834+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
835+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.i v9, 0
836+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 2, e8, mf2, tu, ma
837+
; CHECK-KNOWNVLEN128-NEXT: vmv.v.v v9, v8
838+
; CHECK-KNOWNVLEN128-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
839+
; CHECK-KNOWNVLEN128-NEXT: vmsne.vi v8, v9, 0
840+
; CHECK-KNOWNVLEN128-NEXT: vsm.v v8, (a0)
841+
; CHECK-KNOWNVLEN128-NEXT: ret
789842
%c = call <2 x i1> @llvm.vector.extract.v2i1.nxv32i1(<vscale x 32 x i1> %x, i64 26)
790843
store <2 x i1> %c, ptr %y
791844
ret void

0 commit comments

Comments
 (0)