@@ -4275,8 +4275,7 @@ static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
42754275 DAG.getNode(ISD::BUILD_VECTOR, DL, OneRegVT, OneVRegOfOps);
42764276 SubBV = convertToScalableVector(M1VT, SubBV, DAG, Subtarget);
42774277 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);
42804279 }
42814280 return convertFromScalableVector(VT, Vec, DAG, Subtarget);
42824281 }
@@ -5367,8 +5366,7 @@ static SDValue lowerShuffleViaVRegSplitting(ShuffleVectorSDNode *SVN,
53675366 (NumOfDestRegs <= 2 && NumShuffles >= 4))
53685367 return SDValue();
53695368 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);
53725370 SubVec = convertFromScalableVector(OneRegVT, SubVec, DAG, Subtarget);
53735371 return SubVec;
53745372 };
@@ -5410,8 +5408,7 @@ static SDValue lowerShuffleViaVRegSplitting(ShuffleVectorSDNode *SVN,
54105408
54115409 unsigned InsertIdx = I * NumOpElts;
54125410 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);
54155412 }
54165413 return convertFromScalableVector(VT, Vec, DAG, Subtarget);
54175414}
@@ -5789,17 +5786,15 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
57895786 } else {
57905787 assert(EvenSrc >= 0 && "Undef source?");
57915788 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);
57945790 }
57955791
57965792 if (LaneIsUndef[1]) {
57975793 OddV = DAG.getUNDEF(HalfVT);
57985794 } else {
57995795 assert(OddSrc >= 0 && "Undef source?");
58005796 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);
58035798 }
58045799
58055800 // Prefer vzip2a if available.
@@ -6057,20 +6052,15 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
60576052 // register in the index register group for all registers within the
60586053 // source register group. TODO: This generalizes to m2, and m4.
60596054 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);
60636056 SDValue Gather = DAG.getUNDEF(ContainerVT);
60646057 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);
60696060 SDValue SubVec =
60706061 DAG.getNode(GatherVVOpc, DL, M1VT, SubV1, SubIndex,
60716062 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);
60746064 }
60756065 return convertFromScalableVector(VT, Gather, DAG, Subtarget);
60766066 }
@@ -6083,11 +6073,8 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
60836073 // contains all the output elements.
60846074 if (isLowSourceShuffle(Mask, MinVLMAX) &&
60856075 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);
60916078 SDValue SubVec = DAG.getNode(GatherVVOpc, DL, M1VT, SubV1, SubIndex,
60926079 DAG.getUNDEF(M1VT), InnerTrueMask, InnerVL);
60936080 SDValue Gather = DAG.getUNDEF(ContainerVT);
@@ -6108,8 +6095,7 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
61086095 if (isLowSourceShuffle(Mask, MinVLMAX)) {
61096096 SDValue SlideAmt =
61106097 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);
61136099 SDValue Gather = DAG.getUNDEF(ContainerVT);
61146100 for (int i = 0; i < N; i++) {
61156101 if (i != 0)
@@ -7773,9 +7759,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
77737759 // Don't insert undef subvectors.
77747760 if (SubVec.isUndef())
77757761 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);
77797763 }
77807764 return Vec;
77817765 }
@@ -9641,14 +9625,14 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
96419625 // we're performing the scalar inserts and slideup on a smaller LMUL.
96429626 MVT OrigContainerVT = ContainerVT;
96439627 SDValue OrigVec = Vec;
9644- SDValue AlignedIdx;
9628+ std::optional<unsigned> AlignedIdx;
96459629 if (auto *IdxC = dyn_cast<ConstantSDNode>(Idx)) {
96469630 const unsigned OrigIdx = IdxC->getZExtValue();
96479631 // Do we know an upper bound on LMUL?
96489632 if (auto ShrunkVT = getSmallestVTForIndex(ContainerVT, OrigIdx,
96499633 DL, DAG, Subtarget)) {
96509634 ContainerVT = *ShrunkVT;
9651- AlignedIdx = DAG.getVectorIdxConstant(0, DL) ;
9635+ AlignedIdx = 0 ;
96529636 }
96539637
96549638 // If we're compiling for an exact VLEN value, we can always perform
@@ -9661,16 +9645,13 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
96619645 unsigned ElemsPerVReg = *VLEN / ElemVT.getFixedSizeInBits();
96629646 unsigned RemIdx = OrigIdx % ElemsPerVReg;
96639647 unsigned SubRegIdx = OrigIdx / ElemsPerVReg;
9664- unsigned ExtractIdx =
9665- SubRegIdx * M1VT.getVectorElementCount().getKnownMinValue();
9666- AlignedIdx = DAG.getVectorIdxConstant(ExtractIdx, DL);
9648+ AlignedIdx = SubRegIdx * M1VT.getVectorElementCount().getKnownMinValue();
96679649 Idx = DAG.getVectorIdxConstant(RemIdx, DL);
96689650 ContainerVT = M1VT;
96699651 }
96709652
96719653 if (AlignedIdx)
9672- Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ContainerVT, Vec,
9673- AlignedIdx);
9654+ Vec = DAG.getExtractSubvector(DL, ContainerVT, Vec, *AlignedIdx);
96749655 }
96759656
96769657 bool IsLegalInsert = Subtarget.is64Bit() || Val.getValueType() != MVT::i64;
@@ -9699,8 +9680,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
96999680 Vec = DAG.getNode(Opc, DL, ContainerVT, Vec, Val, VL);
97009681
97019682 if (AlignedIdx)
9702- Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9703- Vec, AlignedIdx);
9683+ Vec = DAG.getInsertSubvector(DL, OrigVec, Vec, *AlignedIdx);
97049684 if (!VecVT.isFixedLengthVector())
97059685 return Vec;
97069686 return convertFromScalableVector(VecVT, Vec, DAG, Subtarget);
@@ -9715,8 +9695,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
97159695 Vec = DAG.getNode(RISCVISD::RI_VINSERT_VL, DL, ContainerVT, Vec, Val, Idx,
97169696 VL, PolicyOp);
97179697 if (AlignedIdx)
9718- Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9719- Vec, AlignedIdx);
9698+ Vec = DAG.getInsertSubvector(DL, OrigVec, Vec, *AlignedIdx);
97209699 if (!VecVT.isFixedLengthVector())
97219700 return Vec;
97229701 return convertFromScalableVector(VecVT, Vec, DAG, Subtarget);
@@ -9751,9 +9730,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
97519730 ValInVec = DAG.getBitcast(ContainerVT, ValInVec);
97529731
97539732 if (AlignedIdx)
9754- ValInVec =
9755- DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9756- ValInVec, AlignedIdx);
9733+ ValInVec = DAG.getInsertSubvector(DL, OrigVec, ValInVec, *AlignedIdx);
97579734 if (!VecVT.isFixedLengthVector())
97589735 return ValInVec;
97599736 return convertFromScalableVector(VecVT, ValInVec, DAG, Subtarget);
@@ -9785,8 +9762,7 @@ SDValue RISCVTargetLowering::lowerINSERT_VECTOR_ELT(SDValue Op,
97859762 Idx, Mask, InsertVL, Policy);
97869763
97879764 if (AlignedIdx)
9788- Slideup = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, OrigContainerVT, OrigVec,
9789- Slideup, AlignedIdx);
9765+ Slideup = DAG.getInsertSubvector(DL, OrigVec, Slideup, *AlignedIdx);
97909766 if (!VecVT.isFixedLengthVector())
97919767 return Slideup;
97929768 return convertFromScalableVector(VecVT, Slideup, DAG, Subtarget);
@@ -9898,9 +9874,8 @@ SDValue RISCVTargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
98989874 unsigned RemIdx = OrigIdx % ElemsPerVReg;
98999875 unsigned SubRegIdx = OrigIdx / ElemsPerVReg;
99009876 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);
99049879 Idx = DAG.getVectorIdxConstant(RemIdx, DL);
99059880 ContainerVT = M1VT;
99069881 }
@@ -11261,8 +11236,7 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
1126111236 InterSubVT = getLMUL1VT(ContainerVecVT);
1126211237 // Extract a subvector equal to the nearest full vector register type. This
1126311238 // 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);
1126611240 }
1126711241
1126811242 SubVec = DAG.getInsertSubvector(DL, DAG.getUNDEF(InterSubVT), SubVec, 0);
@@ -11296,8 +11270,7 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
1129611270 // If required, insert this subvector back into the correct vector register.
1129711271 // This should resolve to an INSERT_SUBREG instruction.
1129811272 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);
1130111274
1130211275 if (VecVT.isFixedLengthVector())
1130311276 SubVec = convertFromScalableVector(VecVT, SubVec, DAG, Subtarget);
@@ -11647,10 +11620,8 @@ SDValue RISCVTargetLowering::lowerVECTOR_DEINTERLEAVE(SDValue Op,
1164711620 OddMask, DAG.getUNDEF(ConcatVT));
1164811621
1164911622 // 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);
1165411625
1165511626 return DAG.getMergeValues({Even, Odd}, DL);
1165611627 }
@@ -11889,11 +11860,9 @@ SDValue RISCVTargetLowering::lowerVECTOR_INTERLEAVE(SDValue Op,
1188911860 }
1189011861
1189111862 // 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());
1189711866
1189811867 return DAG.getMergeValues({Lo, Hi}, DL);
1189911868}
@@ -14474,8 +14443,7 @@ combineBinOpOfExtractToReduceTree(SDNode *N, SelectionDAG &DAG,
1447414443 cast<ConstantSDNode>(LHS.getOperand(1))->getLimitedValue();
1447514444 if (0 == std::min(LHSIdx, RHSIdx) && 1 == std::max(LHSIdx, RHSIdx)) {
1447614445 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);
1447914447 return DAG.getNode(ReduceOpc, DL, VT, Vec, N->getFlags());
1448014448 }
1448114449 }
@@ -14496,8 +14464,7 @@ combineBinOpOfExtractToReduceTree(SDNode *N, SelectionDAG &DAG,
1449614464 // relying on type legalization here to produce something reasonable
1449714465 // and this lowering quality could probably be improved. (TODO)
1449814466 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);
1450114468 return DAG.getNode(ReduceOpc, DL, VT, Vec,
1450214469 ReduceVec->getFlags() & N->getFlags());
1450314470 }
0 commit comments