LLVM 19.0.0git
Classes | Public Member Functions | List of all members
llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder Class Referencefinal

Merges shuffle masks and emits final shuffle instruction, if required. More...

Inheritance diagram for llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder:
Inheritance graph
[legend]

Public Member Functions

 ShuffleInstructionBuilder (IRBuilderBase &Builder, BoUpSLP &R)
 
ValueadjustExtracts (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 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.
 
Valuegather (ArrayRef< Value * > VL, unsigned MaskVF=0, Value *Root=nullptr)
 
ValuecreateFreeze (Value *V)
 
Valuefinalize (ArrayRef< int > ExtMask, unsigned VF=0, function_ref< void(Value *&, SmallVectorImpl< int > &)> Action={})
 Finalize emission of the shuffles.
 
 ~ShuffleInstructionBuilder ()
 

Detailed Description

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

%s1 = shufflevector <2 x ty> %0, poison, <1, 0>
%s2 = shufflevector <2 x ty> %1, poison, <1, 0>

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

%res = shufflevector <2 x ty> %0, %1, <0, 1, 2, 3>

instead. If 2 operands are of different size, the smallest one will be resized and the mask recalculated properly. For example, given the code

%s1 = shufflevector <2 x ty> %0, poison, <1, 0, 1, 0>
%s2 = shufflevector <2 x ty> %1, poison, <1, 0, 1, 0>

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

%res = shufflevector <2 x ty> %0, %1, <0, 1, 2, 3>

instead.

Definition at line 10182 of file SLPVectorizer.cpp.

Constructor & Destructor Documentation

◆ ShuffleInstructionBuilder()

llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::ShuffleInstructionBuilder ( IRBuilderBase Builder,
BoUpSLP R 
)
inline

Definition at line 10285 of file SLPVectorizer.cpp.

◆ ~ShuffleInstructionBuilder()

llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::~ShuffleInstructionBuilder ( )
inline

Definition at line 10579 of file SLPVectorizer.cpp.

References assert(), and llvm::SmallVectorBase< Size_T >::empty().

Member Function Documentation

◆ add() [1/4]

void llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::add ( const TreeEntry &  E1,
ArrayRef< int >  Mask 
)
inline

Adds single input vector (in form of tree entry) and the mask for its shuffling.

Definition at line 10429 of file SLPVectorizer.cpp.

◆ add() [2/4]

void llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::add ( const TreeEntry &  E1,
const TreeEntry &  E2,
ArrayRef< int >  Mask 
)
inline

Adds 2 input vectors (in form of tree entries) and the mask for their shuffling.

Definition at line 10424 of file SLPVectorizer.cpp.

Referenced by llvm::slpvectorizer::BoUpSLP::vectorizeTree().

◆ add() [3/4]

void llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::add ( Value V1,
ArrayRef< int >  Mask,
bool  = false 
)
inline

◆ add() [4/4]

void llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::add ( Value V1,
Value V2,
ArrayRef< int >  Mask 
)
inline

◆ addOrdered()

void llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::addOrdered ( Value V1,
ArrayRef< unsigned Order 
)
inline

Adds another one input vector and the mask for the shuffling.

Definition at line 10518 of file SLPVectorizer.cpp.

References llvm::inversePermutation().

◆ adjustExtracts()

Value * llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::adjustExtracts ( const TreeEntry *  E,
MutableArrayRef< int >  Mask,
ArrayRef< std::optional< TTI::ShuffleKind > >  ShuffleKinds,
unsigned  NumParts,
bool UseVecBaseAsInput 
)
inline

Adjusts extractelements after reusing them.

Definition at line 10289 of file SLPVectorizer.cpp.

References llvm::any_of(), assert(), llvm::count(), E, I, Idx, llvm::SmallPtrSetImpl< PtrType >::insert(), and llvm::PoisonMaskElem.

◆ createFreeze()

Value * llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::createFreeze ( Value V)
inline

Definition at line 10527 of file SLPVectorizer.cpp.

References llvm::IRBuilderBase::CreateFreeze().

◆ finalize()

Value * llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::finalize ( ArrayRef< int >  ExtMask,
unsigned  VF = 0,
function_ref< void(Value *&, SmallVectorImpl< int > &)>  Action = {} 
)
inline

Finalize emission of the shuffles.

Parameters
Actionthe action (if any) to be performed before final applying of the ExtMask mask.

Definition at line 10532 of file SLPVectorizer.cpp.

Referenced by llvm::slpvectorizer::BoUpSLP::vectorizeTree().

◆ gather()

Value * llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::gather ( ArrayRef< Value * >  VL,
unsigned  MaskVF = 0,
Value Root = nullptr 
)
inline

Definition at line 10523 of file SLPVectorizer.cpp.

◆ needToDelay()

std::optional< Value * > llvm::slpvectorizer::BoUpSLP::ShuffleInstructionBuilder::needToDelay ( const TreeEntry *  E,
ArrayRef< SmallVector< const TreeEntry * > >  Deps 
) const
inline

Checks if the specified entry E needs to be delayed because of its dependency nodes.

Definition at line 10406 of file SLPVectorizer.cpp.

References llvm::all_of(), llvm::IRBuilderBase::CreateAlignedLoad(), E, llvm::FixedVectorType::get(), llvm::PoisonValue::get(), llvm::Type::getContext(), and llvm::PointerType::getUnqual().


The documentation for this class was generated from the following file: