[llvm] [RISCV][TTI] Recognize CONCAT_VECTORS if a shufflevector mask is multiple insert subvector. (PR #111459)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 7 21:45:22 PDT 2024
================
@@ -343,6 +343,50 @@ RISCVTTIImpl::getConstantPoolLoadCost(Type *Ty, TTI::TargetCostKind CostKind) {
/*AddressSpace=*/0, CostKind);
}
+InstructionCost
+RISCVTTIImpl::isMultipleInsertSubvector(VectorType *Tp, ArrayRef<int> Mask,
+ TTI::TargetCostKind CostKind) {
+ if (!isa<FixedVectorType>(Tp))
+ return InstructionCost::getInvalid();
+ std::pair<InstructionCost, MVT> LT = getTypeLegalizationCost(Tp);
+ if (LT.second.getScalarSizeInBits() == 1)
+ return InstructionCost::getInvalid();
+ unsigned Size = Mask.size();
+ if (!isPowerOf2_32(Size))
+ return InstructionCost::getInvalid();
+ // Try to guess subvector size.
+ unsigned SubVecSize;
+ for (unsigned I = 0; I != Size; ++I) {
+ if (static_cast<unsigned>(Mask[I]) == I)
+ continue;
+ if (Mask[I] == 0) {
+ SubVecSize = I;
+ break;
+ }
+ return InstructionCost::getInvalid();
+ }
+ for (unsigned I = 0; I != Size; ++I)
+ if (static_cast<unsigned>(Mask[I]) != I % SubVecSize)
+ return InstructionCost::getInvalid();
+ InstructionCost Cost = 0;
+ unsigned NumSlides = Log2_32(Size / SubVecSize);
+ // The cost of extraction from a subvector is 0 if the index is 0.
+ for (unsigned I = 0; I != NumSlides; ++I) {
+ unsigned InsertIndex = SubVecSize * (1 << I);
+ FixedVectorType *SubTp =
+ FixedVectorType::get(Tp->getElementType(), InsertIndex);
+ FixedVectorType *DesTp =
+ FixedVectorType::getDoubleElementsVectorType(SubTp);
----------------
topperc wrote:
Nevermind. I was misreading how SubTp was calculated.
https://github.com/llvm/llvm-project/pull/111459
More information about the llvm-commits
mailing list