[llvm] 131e310 - [SLP][modularisation][NFC] Move createInsertVector, createExtractVector (#221785)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 7 21:19:31 PDT 2026
Author: Madhur Amilkanthwar
Date: 2026-09-08T09:49:26+05:30
New Revision: 131e31016ff94c8782d726baa3ed0160a480f3f3
URL: https://github.com/llvm/llvm-project/commit/131e31016ff94c8782d726baa3ed0160a480f3f3
DIFF: https://github.com/llvm/llvm-project/commit/131e31016ff94c8782d726baa3ed0160a480f3f3.diff
LOG: [SLP][modularisation][NFC] Move createInsertVector, createExtractVector (#221785)
Move the following BoUpSLP-independent shuffle helpers out of
SLPVectorizer.cpp into SLPVectorizer/SLPUtils.{h,cpp}:
createInsertVector
createExtractVector
They sit with the existing shuffle helpers. Behavior is unchanged.
Part of the SLPVectorizer.cpp modularization effort:
https://discourse.llvm.org/t/modularizing-slpvectorizer-cpp/90922
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 323442be1c8a7..e67581f7b11dc 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -5837,45 +5837,6 @@ static const SCEV *calculateRtStride(ArrayRef<Value *> PointerOps, Type *ElemTy,
return Stride;
}
-/// Creates subvector insert. Generates shuffle using \p Generator or
-/// using default shuffle.
-static Value *createInsertVector(
- IRBuilderBase &Builder, Value *Vec, Value *V, unsigned Index,
- function_ref<Value *(Value *, Value *, ArrayRef<int>)> Generator = {}) {
- if (isa<PoisonValue>(Vec) && isa<PoisonValue>(V))
- return Vec;
- const unsigned SubVecVF = getNumElements(V->getType());
- // Create shuffle, insertvector requires that index is multiple of
- // the subvector length.
- const unsigned VecVF = getNumElements(Vec->getType());
- SmallVector<int> Mask(VecVF, PoisonMaskElem);
- if (isa<PoisonValue>(Vec)) {
- auto *Begin = std::next(Mask.begin(), Index);
- std::iota(Begin, std::next(Begin, SubVecVF), 0);
- Vec = Builder.CreateShuffleVector(V, Mask);
- return Vec;
- }
- std::iota(Mask.begin(), Mask.end(), 0);
- std::iota(std::next(Mask.begin(), Index),
- std::next(Mask.begin(), Index + SubVecVF), VecVF);
- if (Generator)
- return Generator(Vec, V, Mask);
- // 1. Resize V to the size of Vec.
- SmallVector<int> ResizeMask(VecVF, PoisonMaskElem);
- std::iota(ResizeMask.begin(), std::next(ResizeMask.begin(), SubVecVF), 0);
- V = Builder.CreateShuffleVector(V, ResizeMask);
- // 2. Insert V into Vec.
- return Builder.CreateShuffleVector(Vec, V, Mask);
-}
-
-/// Generates subvector extract using \p Generator or using default shuffle.
-static Value *createExtractVector(IRBuilderBase &Builder, Value *Vec,
- unsigned SubVecVF, unsigned Index) {
- SmallVector<int> Mask(SubVecVF, PoisonMaskElem);
- std::iota(Mask.begin(), Mask.end(), Index);
- return Builder.CreateShuffleVector(Vec, Mask);
-}
-
/// Builds compress-like mask for shuffles for the given \p PointerOps, ordered
/// with \p Order.
/// \return true if the mask represents strided access, false - otherwise.
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
index d57e5f1af911b..e7d5498c757e4 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
@@ -17,6 +17,7 @@
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
+#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/PatternMatch.h"
@@ -672,6 +673,42 @@ isFixedVectorShuffle(ArrayRef<Value *> VL, SmallVectorImpl<int> &Mask,
: TargetTransformInfo::SK_PermuteSingleSrc;
}
+Value *createInsertVector(
+ IRBuilderBase &Builder, Value *Vec, Value *V, unsigned Index,
+ function_ref<Value *(Value *, Value *, ArrayRef<int>)> Generator) {
+ if (isa<PoisonValue>(Vec) && isa<PoisonValue>(V))
+ return Vec;
+ const unsigned SubVecVF = getNumElements(V->getType());
+ // Create shuffle, insertvector requires that index is multiple of
+ // the subvector length.
+ const unsigned VecVF = getNumElements(Vec->getType());
+ SmallVector<int> Mask(VecVF, PoisonMaskElem);
+ if (isa<PoisonValue>(Vec)) {
+ auto *Begin = std::next(Mask.begin(), Index);
+ std::iota(Begin, std::next(Begin, SubVecVF), 0);
+ Vec = Builder.CreateShuffleVector(V, Mask);
+ return Vec;
+ }
+ std::iota(Mask.begin(), Mask.end(), 0);
+ std::iota(std::next(Mask.begin(), Index),
+ std::next(Mask.begin(), Index + SubVecVF), VecVF);
+ if (Generator)
+ return Generator(Vec, V, Mask);
+ // 1. Resize V to the size of Vec.
+ SmallVector<int> ResizeMask(VecVF, PoisonMaskElem);
+ std::iota(ResizeMask.begin(), std::next(ResizeMask.begin(), SubVecVF), 0);
+ V = Builder.CreateShuffleVector(V, ResizeMask);
+ // 2. Insert V into Vec.
+ return Builder.CreateShuffleVector(Vec, V, Mask);
+}
+
+Value *createExtractVector(IRBuilderBase &Builder, Value *Vec,
+ unsigned SubVecVF, unsigned Index) {
+ SmallVector<int> Mask(SubVecVF, PoisonMaskElem);
+ std::iota(Mask.begin(), Mask.end(), Index);
+ return Builder.CreateShuffleVector(Vec, Mask);
+}
+
SmallBitVector buildUseMask(int VF, ArrayRef<int> Mask, UseMask MaskArg) {
SmallBitVector UseMask(VF, true);
for (auto [Idx, Value] : enumerate(Mask)) {
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
index 0fff68e052106..7819a97e125c4 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
@@ -18,6 +18,7 @@
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/MemoryLocation.h"
@@ -32,6 +33,7 @@ class AssumptionCache;
class Constant;
class DataLayout;
class Instruction;
+class IRBuilderBase;
class TargetLibraryInfo;
class Type;
class Value;
@@ -270,6 +272,16 @@ std::optional<TargetTransformInfo::ShuffleKind>
isFixedVectorShuffle(ArrayRef<Value *> VL, SmallVectorImpl<int> &Mask,
AssumptionCache *AC);
+/// Creates subvector insert. Generates shuffle using \p Generator or
+/// using default shuffle.
+Value *createInsertVector(
+ IRBuilderBase &Builder, Value *Vec, Value *V, unsigned Index,
+ function_ref<Value *(Value *, Value *, ArrayRef<int>)> Generator = {});
+
+/// Generates subvector extract using \p Generator or using default shuffle.
+Value *createExtractVector(IRBuilderBase &Builder, Value *Vec,
+ unsigned SubVecVF, unsigned Index);
+
/// Specifies the way the mask should be analyzed for undefs/poisonous elements
/// in the shuffle mask.
enum class UseMask {
More information about the llvm-commits
mailing list