[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