[llvm] fec503d - [SLP][NFC]Add safe createExtractVector and use instead Builder.CreateExtractVector
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 17 11:47:05 PST 2025
Author: Alexey Bataev
Date: 2025-01-17T11:46:46-08:00
New Revision: fec503d1a3f48e600d0a8e108757dedba909f40c
URL: https://github.com/llvm/llvm-project/commit/fec503d1a3f48e600d0a8e108757dedba909f40c
DIFF: https://github.com/llvm/llvm-project/commit/fec503d1a3f48e600d0a8e108757dedba909f40c.diff
LOG: [SLP][NFC]Add safe createExtractVector and use instead Builder.CreateExtractVector
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index b0b8f8249d657b..0bf01a8c680bfd 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -4995,6 +4995,23 @@ static Value *createInsertVector(
return Vec;
}
+/// Correctly creates extract_subvector, checking that the index is multiple of
+/// the subvectors length. Otherwise, generates shuffle using \p Generator or
+/// using default shuffle.
+static Value *createExtractVector(IRBuilderBase &Builder, Value *Vec,
+ unsigned SubVecVF, unsigned Index) {
+ if (Index % SubVecVF == 0) {
+ VectorType *SubVecTy =
+ getWidenedType(Vec->getType()->getScalarType(), SubVecVF);
+ return Builder.CreateExtractVector(SubVecTy, Vec, Builder.getInt64(Index));
+ }
+ // Create shuffle, extract_subvector requires that index is multiple of
+ // the subvector length.
+ SmallVector<int> Mask(SubVecVF, PoisonMaskElem);
+ std::iota(Mask.begin(), Mask.end(), Index);
+ return Builder.CreateShuffleVector(Vec, Mask);
+}
+
BoUpSLP::LoadsState
BoUpSLP::canVectorizeLoads(ArrayRef<Value *> VL, const Value *VL0,
SmallVectorImpl<unsigned> &Order,
@@ -16550,10 +16567,8 @@ BoUpSLP::vectorizeTree(const ExtraValueToDebugLocsMap &ExternallyUsedValues,
// When REVEC is enabled, we need to extract a vector.
// Note: The element size of Scalar may be
diff erent from the
// element size of Vec.
- Ex = Builder.CreateExtractVector(
- FixedVectorType::get(Vec->getType()->getScalarType(),
- VecTyNumElements),
- Vec, Builder.getInt64(ExternalUse.Lane * VecTyNumElements));
+ Ex = createExtractVector(Builder, Vec, VecTyNumElements,
+ ExternalUse.Lane * VecTyNumElements);
} else {
Ex = Builder.CreateExtractElement(Vec, Lane);
}
More information about the llvm-commits
mailing list