@@ -4275,8 +4275,7 @@ static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
4275
4275
DAG.getNode(ISD::BUILD_VECTOR, DL, OneRegVT, OneVRegOfOps);
4276
4276
SubBV = convertToScalableVector(M1VT, SubBV, DAG, Subtarget);
4277
4277
unsigned InsertIdx = (i / ElemsPerVReg) * NumOpElts;
4278
- Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, ContainerVT, Vec, SubBV,
4279
- DAG.getVectorIdxConstant(InsertIdx, DL));
4278
+ Vec = DAG.getInsertSubvector(DL, Vec, SubBV, InsertIdx);
4280
4279
}
4281
4280
return convertFromScalableVector(VT, Vec, DAG, Subtarget);
4282
4281
}
@@ -5367,8 +5366,7 @@ static SDValue lowerShuffleViaVRegSplitting(ShuffleVectorSDNode *SVN,
5367
5366
(NumOfDestRegs <= 2 && NumShuffles >= 4))
5368
5367
return SDValue();
5369
5368
auto ExtractValue = [&, &DAG = DAG](SDValue SrcVec, unsigned ExtractIdx) {
5370
- SDValue SubVec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, M1VT, SrcVec,
5371
- DAG.getVectorIdxConstant(ExtractIdx, DL));
5369
+ SDValue SubVec = DAG.getExtractSubvector(DL, M1VT, SrcVec, ExtractIdx);
5372
5370
SubVec = convertFromScalableVector(OneRegVT, SubVec, DAG, Subtarget);
5373
5371
return SubVec;
5374
5372
};
@@ -5410,8 +5408,7 @@ static SDValue lowerShuffleViaVRegSplitting(ShuffleVectorSDNode *SVN,
5410
5408
5411
5409
unsigned InsertIdx = I * NumOpElts;
5412
5410
V = convertToScalableVector(M1VT, V, DAG, Subtarget);
5413
- Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, ContainerVT, Vec, V,
5414
- DAG.getVectorIdxConstant(InsertIdx, DL));
5411
+ Vec = DAG.getInsertSubvector(DL, Vec, V, InsertIdx);
5415
5412
}
5416
5413
return convertFromScalableVector(VT, Vec, DAG, Subtarget);
5417
5414
}
@@ -5789,17 +5786,15 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
5789
5786
} else {
5790
5787
assert(EvenSrc >= 0 && "Undef source?");
5791
5788
EvenV = (EvenSrc / Size) == 0 ? V1 : V2;
5792
- EvenV = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfVT, EvenV,
5793
- DAG.getVectorIdxConstant(EvenSrc % Size, DL));
5789
+ EvenV = DAG.getExtractSubvector(DL, HalfVT, EvenV, EvenSrc % Size);
5794
5790
}
5795
5791
5796
5792
if (LaneIsUndef[1]) {
5797
5793
OddV = DAG.getUNDEF(HalfVT);
5798
5794
} else {
5799
5795
assert(OddSrc >= 0 && "Undef source?");
5800
5796
OddV = (OddSrc / Size) == 0 ? V1 : V2;
5801
- OddV = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfVT, OddV,
5802
- DAG.getVectorIdxConstant(OddSrc % Size, DL));
5797
+ OddV = DAG.getExtractSubvector(DL, HalfVT, OddV, OddSrc % Size);
5803
5798
}
5804
5799
5805
5800
// Prefer vzip2a if available.
@@ -6057,20 +6052,15 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
6057
6052
// register in the index register group for all registers within the
6058
6053
// source register group. TODO: This generalizes to m2, and m4.
6059
6054
if (isLocalRepeatingShuffle(Mask, MinVLMAX)) {
6060
- SDValue SubIndex =
6061
- DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubIndexVT, LHSIndices,
6062
- DAG.getVectorIdxConstant(0, DL));
6055
+ SDValue SubIndex = DAG.getExtractSubvector(DL, SubIndexVT, LHSIndices, 0);
6063
6056
SDValue Gather = DAG.getUNDEF(ContainerVT);
6064
6057
for (int i = 0; i < N; i++) {
6065
- SDValue SubIdx =
6066
- DAG.getVectorIdxConstant(M1VT.getVectorMinNumElements() * i, DL);
6067
- SDValue SubV1 =
6068
- DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, M1VT, V1, SubIdx);
6058
+ unsigned SubIdx = M1VT.getVectorMinNumElements() * i;
6059
+ SDValue SubV1 = DAG.getExtractSubvector(DL, M1VT, V1, SubIdx);
6069
6060
SDValue SubVec =
6070
6061
DAG.getNode(GatherVVOpc, DL, M1VT, SubV1, SubIndex,
6071
6062
DAG.getUNDEF(M1VT), InnerTrueMask, InnerVL);
6072
- Gather = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, ContainerVT, Gather,
6073
- SubVec, SubIdx);
6063
+ Gather = DAG.getInsertSubvector(DL, Gather, SubVec, SubIdx);
6074
6064
}
6075
6065
return convertFromScalableVector(VT, Gather, DAG, Subtarget);
6076
6066
}
@@ -6083,11 +6073,8 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
6083
6073
// contains all the output elements.
6084
6074
if (isLowSourceShuffle(Mask, MinVLMAX) &&
6085
6075
isSpanSplatShuffle(Mask, MinVLMAX)) {
6086
- SDValue SubV1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, M1VT, V1,
6087
- DAG.getVectorIdxConstant(0, DL));
6088
- SDValue SubIndex =
6089
- DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubIndexVT, LHSIndices,
6090
- DAG.getVectorIdxConstant(0, DL));
6076
+ SDValue SubV1 = DAG.getExtractSubvector(DL, M1VT, V1, 0);
6077
+ SDValue SubIndex = DAG.getExtractSubvector(DL, SubIndexVT, LHSIndices, 0);
6091
6078
SDValue SubVec = DAG.getNode(GatherVVOpc, DL, M1VT, SubV1, SubIndex,
6092
6079
DAG.getUNDEF(M1VT), InnerTrueMask, InnerVL);
6093
6080
SDValue Gather = DAG.getUNDEF(ContainerVT);
@@ -6108,8 +6095,7 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
6108
6095
if (isLowSourceShuffle(Mask, MinVLMAX)) {
6109
6096
SDValue SlideAmt =
6110
6097
DAG.getElementCount(DL, XLenVT, M1VT.getVectorElementCount());
6111
- SDValue SubV1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, M1VT, V1,
6112
- DAG.getVectorIdxConstant(0, DL));
6098
+ SDValue SubV1 = DAG.getExtractSubvector(DL, M1VT, V1, 0);
6113
6099
SDValue Gather = DAG.getUNDEF(ContainerVT);
6114
6100
for (int i = 0; i < N; i++) {
6115
6101
if (i != 0)
@@ -7773,9 +7759,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7773
7759
// Don't insert undef subvectors.
7774
7760
if (SubVec.isUndef())
7775
7761
continue;
7776
- Vec =
7777
- DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT, Vec, SubVec,
7778
- DAG.getVectorIdxConstant(OpIdx.index() * NumOpElts, DL));
7762
+ Vec = DAG.getInsertSubvector(DL, Vec, SubVec, OpIdx.index() * NumOpElts);
7779
7763
}
7780
7764
return Vec;
7781
7765
}
@@ -9641,14 +9625,14 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
9641
9625
// we're performing the scalar inserts and slideup on a smaller LMUL.
9642
9626
MVT OrigContainerVT = ContainerVT;
9643
9627
SDValue OrigVec = Vec;
9644
- SDValue AlignedIdx;
9628
+ std::optional<unsigned> AlignedIdx;
9645
9629
if (auto *IdxC = dyn_cast<ConstantSDNode>(Idx)) {
9646
9630
const unsigned OrigIdx = IdxC->getZExtValue();
9647
9631
// Do we know an upper bound on LMUL?
9648
9632
if (auto ShrunkVT = getSmallestVTForIndex(ContainerVT, OrigIdx,
9649
9633
DL, DAG, Subtarget)) {
9650
9634
ContainerVT = *ShrunkVT;
9651
- AlignedIdx = DAG.getVectorIdxConstant(0, DL) ;
9635
+ AlignedIdx = 0 ;
9652
9636
}
9653
9637
9654
9638
// If we're compiling for an exact VLEN value, we can always perform
@@ -9661,16 +9645,13 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
9661
9645
unsigned ElemsPerVReg = *VLEN / ElemVT.getFixedSizeInBits();
9662
9646
unsigned RemIdx = OrigIdx % ElemsPerVReg;
9663
9647
unsigned SubRegIdx = OrigIdx / ElemsPerVReg;
9664
- unsigned ExtractIdx =
9665
- SubRegIdx * M1VT.getVectorElementCount().getKnownMinValue();
9666
- AlignedIdx = DAG.getVectorIdxConstant(ExtractIdx, DL);
9648
+ AlignedIdx = SubRegIdx * M1VT.getVectorElementCount().getKnownMinValue();
9667
9649
Idx = DAG.getVectorIdxConstant(RemIdx, DL);
9668
9650
ContainerVT = M1VT;
9669
9651
}
9670
9652
9671
9653
if (AlignedIdx)
9672
- Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ContainerVT, Vec,
9673
- AlignedIdx);
9654
+ Vec = DAG.getExtractSubvector(DL, ContainerVT, Vec, *AlignedIdx);
9674
9655
}
9675
9656
9676
9657
bool IsLegalInsert = Subtarget.is64Bit() || Val.getValueType() != MVT::i64;
@@ -9699,8 +9680,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
9699
9680
Vec = DAG.getNode(Opc, DL, ContainerVT, Vec, Val, VL);
9700
9681
9701
9682
if (AlignedIdx)
9702
- Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9703
- Vec, AlignedIdx);
9683
+ Vec = DAG.getInsertSubvector(DL, OrigVec, Vec, *AlignedIdx);
9704
9684
if (!VecVT.isFixedLengthVector())
9705
9685
return Vec;
9706
9686
return convertFromScalableVector(VecVT, Vec, DAG, Subtarget);
@@ -9715,8 +9695,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
9715
9695
Vec = DAG.getNode(RISCVISD::RI_VINSERT_VL, DL, ContainerVT, Vec, Val, Idx,
9716
9696
VL, PolicyOp);
9717
9697
if (AlignedIdx)
9718
- Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9719
- Vec, AlignedIdx);
9698
+ Vec = DAG.getInsertSubvector(DL, OrigVec, Vec, *AlignedIdx);
9720
9699
if (!VecVT.isFixedLengthVector())
9721
9700
return Vec;
9722
9701
return convertFromScalableVector(VecVT, Vec, DAG, Subtarget);
@@ -9751,9 +9730,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
9751
9730
ValInVec = DAG.getBitcast(ContainerVT, ValInVec);
9752
9731
9753
9732
if (AlignedIdx)
9754
- ValInVec =
9755
- DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9756
- ValInVec, AlignedIdx);
9733
+ ValInVec = DAG.getInsertSubvector(DL, OrigVec, ValInVec, *AlignedIdx);
9757
9734
if (!VecVT.isFixedLengthVector())
9758
9735
return ValInVec;
9759
9736
return convertFromScalableVector(VecVT, ValInVec, DAG, Subtarget);
@@ -9785,8 +9762,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
9785
9762
Idx, Mask, InsertVL, Policy);
9786
9763
9787
9764
if (AlignedIdx)
9788
- Slideup = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9789
- Slideup, AlignedIdx);
9765
+ Slideup = DAG.getInsertSubvector(DL, OrigVec, Slideup, *AlignedIdx);
9790
9766
if (!VecVT.isFixedLengthVector())
9791
9767
return Slideup;
9792
9768
return convertFromScalableVector(VecVT, Slideup, DAG, Subtarget);
@@ -9898,9 +9874,8 @@ SDValue RISCVTargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
9898
9874
unsigned RemIdx = OrigIdx % ElemsPerVReg;
9899
9875
unsigned SubRegIdx = OrigIdx / ElemsPerVReg;
9900
9876
unsigned ExtractIdx =
9901
- SubRegIdx * M1VT.getVectorElementCount().getKnownMinValue();
9902
- Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, M1VT, Vec,
9903
- DAG.getVectorIdxConstant(ExtractIdx, DL));
9877
+ SubRegIdx * M1VT.getVectorElementCount().getKnownMinValue();
9878
+ Vec = DAG.getExtractSubvector(DL, M1VT, Vec, ExtractIdx);
9904
9879
Idx = DAG.getVectorIdxConstant(RemIdx, DL);
9905
9880
ContainerVT = M1VT;
9906
9881
}
@@ -11261,8 +11236,7 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
11261
11236
InterSubVT = getLMUL1VT(ContainerVecVT);
11262
11237
// Extract a subvector equal to the nearest full vector register type. This
11263
11238
// should resolve to a EXTRACT_SUBREG instruction.
11264
- AlignedExtract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, InterSubVT, Vec,
11265
- DAG.getVectorIdxConstant(AlignedIdx, DL));
11239
+ AlignedExtract = DAG.getExtractSubvector(DL, InterSubVT, Vec, AlignedIdx);
11266
11240
}
11267
11241
11268
11242
SubVec = DAG.getInsertSubvector(DL, DAG.getUNDEF(InterSubVT), SubVec, 0);
@@ -11296,8 +11270,7 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
11296
11270
// If required, insert this subvector back into the correct vector register.
11297
11271
// This should resolve to an INSERT_SUBREG instruction.
11298
11272
if (ContainerVecVT.bitsGT(InterSubVT))
11299
- SubVec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, ContainerVecVT, Vec, SubVec,
11300
- DAG.getVectorIdxConstant(AlignedIdx, DL));
11273
+ SubVec = DAG.getInsertSubvector(DL, Vec, SubVec, AlignedIdx);
11301
11274
11302
11275
if (VecVT.isFixedLengthVector())
11303
11276
SubVec = convertFromScalableVector(VecVT, SubVec, DAG, Subtarget);
@@ -11647,10 +11620,8 @@ SDValue RISCVTargetLowering::lowerVECTOR_DEINTERLEAVE(SDValue Op,
11647
11620
OddMask, DAG.getUNDEF(ConcatVT));
11648
11621
11649
11622
// Extract the result half of the gather for even and odd
11650
- SDValue Even = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VecVT, EvenWide,
11651
- DAG.getVectorIdxConstant(0, DL));
11652
- SDValue Odd = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VecVT, OddWide,
11653
- DAG.getVectorIdxConstant(0, DL));
11623
+ SDValue Even = DAG.getExtractSubvector(DL, VecVT, EvenWide, 0);
11624
+ SDValue Odd = DAG.getExtractSubvector(DL, VecVT, OddWide, 0);
11654
11625
11655
11626
return DAG.getMergeValues({Even, Odd}, DL);
11656
11627
}
@@ -11889,11 +11860,9 @@ SDValue RISCVTargetLowering::lowerVECTOR_INTERLEAVE(SDValue Op,
11889
11860
}
11890
11861
11891
11862
// Extract the two halves from the interleaved result
11892
- SDValue Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VecVT, Interleaved,
11893
- DAG.getVectorIdxConstant(0, DL));
11894
- SDValue Hi = DAG.getNode(
11895
- ISD::EXTRACT_SUBVECTOR, DL, VecVT, Interleaved,
11896
- DAG.getVectorIdxConstant(VecVT.getVectorMinNumElements(), DL));
11863
+ SDValue Lo = DAG.getExtractSubvector(DL, VecVT, Interleaved, 0);
11864
+ SDValue Hi = DAG.getExtractSubvector(DL, VecVT, Interleaved,
11865
+ VecVT.getVectorMinNumElements());
11897
11866
11898
11867
return DAG.getMergeValues({Lo, Hi}, DL);
11899
11868
}
@@ -14474,8 +14443,7 @@ combineBinOpOfExtractToReduceTree(SDNode *N, SelectionDAG &DAG,
14474
14443
cast<ConstantSDNode>(LHS.getOperand(1))->getLimitedValue();
14475
14444
if (0 == std::min(LHSIdx, RHSIdx) && 1 == std::max(LHSIdx, RHSIdx)) {
14476
14445
EVT ReduceVT = EVT::getVectorVT(*DAG.getContext(), VT, 2);
14477
- SDValue Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ReduceVT, SrcVec,
14478
- DAG.getVectorIdxConstant(0, DL));
14446
+ SDValue Vec = DAG.getExtractSubvector(DL, ReduceVT, SrcVec, 0);
14479
14447
return DAG.getNode(ReduceOpc, DL, VT, Vec, N->getFlags());
14480
14448
}
14481
14449
}
@@ -14496,8 +14464,7 @@ combineBinOpOfExtractToReduceTree(SDNode *N, SelectionDAG &DAG,
14496
14464
// relying on type legalization here to produce something reasonable
14497
14465
// and this lowering quality could probably be improved. (TODO)
14498
14466
EVT ReduceVT = EVT::getVectorVT(*DAG.getContext(), VT, RHSIdx + 1);
14499
- SDValue Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ReduceVT, SrcVec,
14500
- DAG.getVectorIdxConstant(0, DL));
14467
+ SDValue Vec = DAG.getExtractSubvector(DL, ReduceVT, SrcVec, 0);
14501
14468
return DAG.getNode(ReduceOpc, DL, VT, Vec,
14502
14469
ReduceVec->getFlags() & N->getFlags());
14503
14470
}
0 commit comments