diff options
author | Craig Topper <craig.topper@sifive.com> | 2024-09-24 09:49:32 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:49:32 -0700 |
commit | e64673d3174af941eb3c9f1ad822792154aa1d31 (patch) | |
tree | 7a3fb7d5ad420266766e5be76fc6249206f5fd0b | |
parent | 406a2128f57b1e86748cd6de6d3eab6b1e2db2ad (diff) | |
download | llvm-e64673d3174af941eb3c9f1ad822792154aa1d31.zip llvm-e64673d3174af941eb3c9f1ad822792154aa1d31.tar.gz llvm-e64673d3174af941eb3c9f1ad822792154aa1d31.tar.bz2 |
[RISCV] Treat insert_subvector into undef with index==0 as legal. (#109745)
Regardless of fixed and scalable type. We can always use subreg ops.
We don't need to do any container conversion.
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index b998a1e..bf822eb 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -10152,13 +10152,15 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op, unsigned OrigIdx = Op.getConstantOperandVal(2); const RISCVRegisterInfo *TRI = Subtarget.getRegisterInfo(); + if (OrigIdx == 0 && Vec.isUndef()) + return Op; + // We don't have the ability to slide mask vectors up indexed by their i1 // elements; the smallest we can do is i8. Often we are able to bitcast to // equivalent i8 vectors. Note that when inserting a fixed-length vector // into a scalable one, we might not necessarily have enough scalable // elements to safely divide by 8: nxv1i1 = insert nxv1i1, v4i1 is valid. - if (SubVecVT.getVectorElementType() == MVT::i1 && - (OrigIdx != 0 || !Vec.isUndef())) { + if (SubVecVT.getVectorElementType() == MVT::i1) { if (VecVT.getVectorMinNumElements() >= 8 && SubVecVT.getVectorMinNumElements() >= 8) { assert(OrigIdx % 8 == 0 && "Invalid index"); @@ -10196,8 +10198,6 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op, // vector group up the full amount. const auto VLen = Subtarget.getRealVLen(); if (SubVecVT.isFixedLengthVector() && !VLen) { - if (OrigIdx == 0 && Vec.isUndef() && !VecVT.isFixedLengthVector()) - return Op; MVT ContainerVT = VecVT; if (VecVT.isFixedLengthVector()) { ContainerVT = getContainerForFixedLengthVector(VecVT); @@ -10208,11 +10208,6 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op, DAG.getUNDEF(ContainerVT), SubVec, DAG.getVectorIdxConstant(0, DL)); - if (OrigIdx == 0 && Vec.isUndef() && VecVT.isFixedLengthVector()) { - SubVec = convertFromScalableVector(VecVT, SubVec, DAG, Subtarget); - return DAG.getBitcast(Op.getValueType(), SubVec); - } - SDValue Mask = getDefaultVLOps(VecVT, ContainerVT, DL, DAG, Subtarget).first; // Set the vector length to only the number of elements we care about. Note |