LLVM 22.0.0git
llvm::InterleaveGroup< InstTy > Class Template Reference

The group of interleaved loads/stores sharing the same stride and close to each other. More...

#include "llvm/Analysis/VectorUtils.h"

Inheritance diagram for llvm::InterleaveGroup< InstTy >:
[legend]

Public Member Functions

 InterleaveGroup (uint32_t Factor, bool Reverse, Align Alignment)
 InterleaveGroup (InstTy *Instr, int32_t Stride, Align Alignment)
bool isReverse () const
uint32_t getFactor () const
Align getAlign () const
uint32_t getNumMembers () const
bool insertMember (InstTy *Instr, int32_t Index, Align NewAlign)
 Try to insert a new member Instr with index Index and alignment NewAlign.
InstTy * getMember (uint32_t Index) const
 Get the member with the given index Index.
uint32_t getIndex (const InstTy *Instr) const
 Get the index for the given member.
InstTy * getInsertPos () const
void setInsertPos (InstTy *Inst)
void addMetadata (InstTy *NewInst) const
 Add metadata (e.g.
bool requiresScalarEpilogue () const
 Returns true if this Group requires a scalar iteration to handle gaps.
bool isFull () const
 Return true if this group is full, i.e. it has no gaps.
void addMetadata (Instruction *NewInst) const

Detailed Description

template<typename InstTy>
class llvm::InterleaveGroup< InstTy >

The group of interleaved loads/stores sharing the same stride and close to each other.

Each member in this group has an index starting from 0, and the largest index should be less than interleaved factor, which is equal to the absolute value of the access's stride.

E.g. An interleaved load group of factor 4: for (unsigned i = 0; i < 1024; i+=4) { a = A[i]; // Member of index 0 b = A[i+1]; // Member of index 1 d = A[i+3]; // Member of index 3 ... }

An interleaved store group of factor 4: for (unsigned i = 0; i < 1024; i+=4) { ... A[i] = a; // Member of index 0 A[i+1] = b; // Member of index 1 A[i+2] = c; // Member of index 2 A[i+3] = d; // Member of index 3 }

Note: the interleaved load group could have gaps (missing members), but the interleaved store group doesn't allow gaps.

Definition at line 524 of file VectorUtils.h.

Constructor & Destructor Documentation

◆ InterleaveGroup() [1/2]

template<typename InstTy>
llvm::InterleaveGroup< InstTy >::InterleaveGroup ( uint32_t Factor,
bool Reverse,
Align Alignment )
inline

Definition at line 526 of file VectorUtils.h.

◆ InterleaveGroup() [2/2]

template<typename InstTy>
llvm::InterleaveGroup< InstTy >::InterleaveGroup ( InstTy * Instr,
int32_t Stride,
Align Alignment )
inline

Definition at line 530 of file VectorUtils.h.

References assert().

Member Function Documentation

◆ addMetadata() [1/2]

void llvm::InterleaveGroup< Instruction >::addMetadata ( Instruction * NewInst) const

Definition at line 1771 of file VectorUtils.cpp.

◆ addMetadata() [2/2]

template<typename InstTy>
void InterleaveGroup::addMetadata ( InstTy * NewInst) const

Add metadata (e.g.

alias info) from the instructions in this group to NewInst.

FIXME: this function currently does not add noalias metadata a'la addNewMedata. To do that we need to compute the intersection of the noalias info from all members.

Definition at line 1765 of file VectorUtils.cpp.

References llvm_unreachable.

Referenced by llvm::VPInterleaveEVLRecipe::execute(), and llvm::VPInterleaveRecipe::execute().

◆ getAlign()

template<typename InstTy>
Align llvm::InterleaveGroup< InstTy >::getAlign ( ) const
inline

◆ getFactor()

◆ getIndex()

template<typename InstTy>
uint32_t llvm::InterleaveGroup< InstTy >::getIndex ( const InstTy * Instr) const
inline

Get the index for the given member.

Unlike the key in the member map, the index starts from 0.

Definition at line 601 of file VectorUtils.h.

References I, and llvm_unreachable.

Referenced by llvm::InterleavedAccessInfo::analyzeInterleaving().

◆ getInsertPos()

template<typename InstTy>
InstTy * llvm::InterleaveGroup< InstTy >::getInsertPos ( ) const
inline

◆ getMember()

◆ getNumMembers()

template<typename InstTy>
uint32_t llvm::InterleaveGroup< InstTy >::getNumMembers ( ) const
inline

◆ insertMember()

template<typename InstTy>
bool llvm::InterleaveGroup< InstTy >::insertMember ( InstTy * Instr,
int32_t Index,
Align NewAlign )
inline

Try to insert a new member Instr with index Index and alignment NewAlign.

The index is related to the leader and it could be negative if it is the new leader.

Returns
false if the instruction doesn't belong to the group.

Definition at line 549 of file VectorUtils.h.

References llvm::checkedAdd(), llvm::checkedSub(), and llvm::InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key.

Referenced by llvm::InterleavedAccessInfo::analyzeInterleaving().

◆ isFull()

template<typename InstTy>
bool llvm::InterleaveGroup< InstTy >::isFull ( ) const
inline

Return true if this group is full, i.e. it has no gaps.

Definition at line 637 of file VectorUtils.h.

References getFactor(), and getNumMembers().

Referenced by llvm::InterleavedAccessInfo::analyzeInterleaving(), and llvm::createBitMaskForGaps().

◆ isReverse()

template<typename InstTy>
bool llvm::InterleaveGroup< InstTy >::isReverse ( ) const
inline

◆ requiresScalarEpilogue()

template<typename InstTy>
bool llvm::InterleaveGroup< InstTy >::requiresScalarEpilogue ( ) const
inline

Returns true if this Group requires a scalar iteration to handle gaps.

Definition at line 622 of file VectorUtils.h.

References assert(), getFactor(), getMember(), and isReverse().

◆ setInsertPos()

template<typename InstTy>
void llvm::InterleaveGroup< InstTy >::setInsertPos ( InstTy * Inst)
inline

Definition at line 611 of file VectorUtils.h.

Referenced by llvm::InterleavedAccessInfo::analyzeInterleaving().


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