|
LLVM 24.0.0git
|
Merges shuffle masks and emits final shuffle instruction, if required. More...
Public Member Functions | |
| ShuffleInstructionBuilder (Type *ScalarTy, IRBuilderBase &Builder, BoUpSLP &R) | |
| Value * | adjustExtracts (const TreeEntry *E, MutableArrayRef< int > Mask, ArrayRef< std::optional< TTI::ShuffleKind > > ShuffleKinds, unsigned NumParts, bool &UseVecBaseAsInput) |
| Adjusts extractelements after reusing them. | |
| std::optional< Value * > | needToDelay (const TreeEntry *E, ArrayRef< SmallVector< const TreeEntry * > > Deps) const |
Checks if the specified entry E needs to be delayed because of its dependency nodes. | |
| void | resetForSameNode () |
| Reset the builder to handle perfect diamond match. | |
| void | add (const TreeEntry &E1, const TreeEntry &E2, ArrayRef< int > Mask) |
| Adds 2 input vectors (in form of tree entries) and the mask for their shuffling. | |
| void | add (const TreeEntry &E1, ArrayRef< int > Mask) |
| Adds single input vector (in form of tree entry) and the mask for its shuffling. | |
| void | add (Value *V1, Value *V2, ArrayRef< int > Mask) |
| Adds 2 input vectors and the mask for their shuffling. | |
| void | add (Value *V1, ArrayRef< int > Mask, bool=false) |
| Adds another one input vector and the mask for the shuffling. | |
| void | addOrdered (Value *V1, ArrayRef< unsigned > Order) |
| Adds another one input vector and the mask for the shuffling. | |
| Value * | gather (ArrayRef< Value * > VL, unsigned MaskVF=0, Value *Root=nullptr) |
| Value * | createFreeze (Value *V) |
| Value * | finalize (ArrayRef< int > ExtMask, ArrayRef< std::pair< const TreeEntry *, unsigned > > SubVectors, ArrayRef< int > SubVectorsMask, unsigned VF=0, function_ref< void(Value *&, SmallVectorImpl< int > &, function_ref< Value *(Value *, Value *, ArrayRef< int >)>)> Action={}) |
| Finalize emission of the shuffles. | |
| ~ShuffleInstructionBuilder () | |
Additional Inherited Members | |
| Protected Member Functions inherited from llvm::slpvectorizer::BaseShuffleAnalysis | |
| BaseShuffleAnalysis (Type *ScalarTy) | |
| unsigned | getVF (Value *V) const |
| V is expected to be a vectorized value. | |
| Static Protected Member Functions inherited from llvm::slpvectorizer::BaseShuffleAnalysis | |
| static bool | isIdentityMask (ArrayRef< int > Mask, const FixedVectorType *VecTy, bool IsStrict) |
| Checks if the mask is an identity mask. | |
| static void | combineMasks (unsigned LocalVF, SmallVectorImpl< int > &Mask, ArrayRef< int > ExtMask) |
| Tries to combine 2 different masks into single one. | |
| static bool | peekThroughShuffles (Value *&V, SmallVectorImpl< int > &Mask, bool SinglePermute) |
| Looks through shuffles trying to reduce final number of shuffles in the code. | |
| template<typename T, typename ShuffleBuilderTy, typename... Args> | |
| static T | createShuffle (Value *V1, Value *V2, ArrayRef< int > Mask, ShuffleBuilderTy &Builder, Type *ScalarTy, bool ReVec, Args... Arguments) |
| Smart shuffle instruction emission, walks through shuffles trees and tries to find the best matching vector for the actual shuffle instruction. | |
| static void | transformMaskAfterShuffle (MutableArrayRef< int > CommonMask, ArrayRef< int > Mask) |
Transforms mask CommonMask per given Mask to make proper set after shuffle emission. | |
| Protected Attributes inherited from llvm::slpvectorizer::BaseShuffleAnalysis | |
| Type * | ScalarTy = nullptr |
Merges shuffle masks and emits final shuffle instruction, if required.
It supports shuffling of 2 input vectors. It implements lazy shuffles emission, when the actual shuffle instruction is generated only if this is actually required. Otherwise, the shuffle instruction emission is delayed till the end of the process, to reduce the number of emitted instructions and further analysis/transformations. The class also will look through the previously emitted shuffle instructions and properly mark indices in mask as undef. For example, given the code
and if need to emit shuffle of s1 and s2 with mask <1, 0, 3, 2>, it will look through s1 and s2 and emit
instead. If 2 operands are of different size, the smallest one will be resized and the mask recalculated properly. For example, given the code
and if need to emit shuffle of s1 and s2 with mask <1, 0, 5, 4>, it will look through s1 and s2 and emit
instead.
Definition at line 21856 of file SLPVectorizer.cpp.
|
inline |
Definition at line 21993 of file SLPVectorizer.cpp.
References llvm::slpvectorizer::BaseShuffleAnalysis::BaseShuffleAnalysis(), slpvectorizer::BoUpSLP::BoUpSLP(), and llvm::slpvectorizer::BaseShuffleAnalysis::ScalarTy.
|
inline |
Definition at line 22387 of file SLPVectorizer.cpp.
References assert().
|
inline |
Adds single input vector (in form of tree entry) and the mask for its shuffling.
Definition at line 22174 of file SLPVectorizer.cpp.
|
inline |
Adds 2 input vectors (in form of tree entries) and the mask for their shuffling.
Definition at line 22167 of file SLPVectorizer.cpp.
References add(), and llvm::V1.
Referenced by add(), add(), and addOrdered().
|
inline |
Adds another one input vector and the mask for the shuffling.
Definition at line 22213 of file SLPVectorizer.cpp.
References assert(), llvm::cast(), llvm::find(), llvm::slpvectorizer::BaseShuffleAnalysis::getVF(), llvm::isa(), llvm::PoisonMaskElem, llvm::slpvectorizer::BaseShuffleAnalysis::transformMaskAfterShuffle(), and llvm::V1.
|
inline |
Adds 2 input vectors and the mask for their shuffling.
Definition at line 22179 of file SLPVectorizer.cpp.
References assert(), llvm::cast(), llvm::Value::getType(), llvm::slpvectorizer::BaseShuffleAnalysis::getVF(), llvm::isa(), llvm::PoisonMaskElem, llvm::slpvectorizer::BaseShuffleAnalysis::transformMaskAfterShuffle(), and llvm::V1.
|
inline |
Adds another one input vector and the mask for the shuffling.
Definition at line 22266 of file SLPVectorizer.cpp.
References add(), llvm::slpvectorizer::inversePermutation(), and llvm::V1.
|
inline |
Adjusts extractelements after reusing them.
Definition at line 21997 of file SLPVectorizer.cpp.
References llvm::any_of(), assert(), llvm::cast(), llvm::count(), llvm::count_if(), llvm::ArrayRef< T >::empty(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isa(), llvm::PoisonMaskElem, and llvm::slpvectorizer::reorderScalars().
Definition at line 22278 of file SLPVectorizer.cpp.
|
inline |
Finalize emission of the shuffles.
| Action | the action (if any) to be performed before final applying of the ExtMask mask. |
Definition at line 22282 of file SLPVectorizer.cpp.
|
inline |
Definition at line 22271 of file SLPVectorizer.cpp.
References llvm::slpvectorizer::BaseShuffleAnalysis::ScalarTy, and llvm::V1.
|
inline |
Checks if the specified entry E needs to be delayed because of its dependency nodes.
Definition at line 22143 of file SLPVectorizer.cpp.
References llvm::all_of(), llvm::PoisonValue::get(), llvm::PointerType::getUnqual(), llvm::slpvectorizer::getWidenedType(), and llvm::slpvectorizer::BaseShuffleAnalysis::ScalarTy.
|
inline |
Reset the builder to handle perfect diamond match.
Definition at line 22160 of file SLPVectorizer.cpp.