LLVM: llvm::MemoryDepChecker Class Reference (original) (raw)

Checks memory dependences among accesses to the same underlying object to determine whether there vectorization is legal or not (and at which vectorization factor). More...

#include "[llvm/Analysis/LoopAccessAnalysis.h](LoopAccessAnalysis%5F8h%5Fsource.html)"

Public Types
enum class VectorizationSafetyStatus { Safe, PossiblySafeWithRtChecks, Unsafe }
Type to keep track of the status of the dependence check. More...
typedef PointerIntPair< Value *, 1, bool > MemAccessInfo
typedef SmallVector< MemAccessInfo, 8 > MemAccessInfoList
typedef EquivalenceClasses< MemAccessInfo > DepCandidates
Set of potential dependent memory accesses.
Public Member Functions
MemoryDepChecker (PredicatedScalarEvolution &PSE, AssumptionCache *AC, DominatorTree *DT, const Loop *L, const DenseMap< Value *, const SCEV * > &SymbolicStrides, unsigned MaxTargetVectorWidthInBits, std::optional< ScalarEvolution::LoopGuards > &LoopGuards)
LLVM_ABI void addAccess (StoreInst *SI)
Register the location (instructions are given increasing numbers) of a write access.
LLVM_ABI void addAccess (LoadInst *LI)
Register the location (instructions are given increasing numbers) of a write access.
LLVM_ABI bool areDepsSafe (const DepCandidates &AccessSets, const MemAccessInfoList &CheckDeps)
Check whether the dependencies between the accesses are safe, and records the dependence information in Dependences if so.
bool isSafeForVectorization () const
No memory dependence was encountered that would inhibit vectorization.
bool isSafeForAnyVectorWidth () const
Return true if the number of elements that are safe to operate on simultaneously is not bounded.
uint64_t getMaxSafeVectorWidthInBits () const
Return the number of elements that are safe to operate on simultaneously, multiplied by the size of the element in bits.
bool isSafeForAnyStoreLoadForwardDistances () const
Return true if there are no store-load forwarding dependencies.
uint64_t getStoreLoadForwardSafeDistanceInBits () const
Return safe power-of-2 number of elements, which do not prevent store-load forwarding, multiplied by the size of the elements in bits.
bool shouldRetryWithRuntimeChecks () const
In same cases when the dependency check fails we can still vectorize the loop with a dynamic array access check.
const SmallVectorImpl< Dependence > * getDependences () const
Returns the memory dependences.
void clearDependences ()
const SmallVectorImpl< Instruction * > & getMemoryInstructions () const
The vector of memory access instructions.
DenseMap< Instruction *, unsigned > generateInstructionOrderMap () const
Generate a mapping between the memory instructions and their indices according to program order.
LLVM_ABI SmallVector< Instruction *, 4 > getInstructionsForAccess (Value *Ptr, bool isWrite) const
Find the set of instructions that read or write via Ptr.
ArrayRef< unsigned > getOrderForAccess (Value *Ptr, bool IsWrite) const
Return the program order indices for the access location (Ptr, IsWrite).
const Loop * getInnermostLoop () const
DenseMap< std::pair< const SCEV *, Type * >, std::pair< const SCEV *, const SCEV * > > & getPointerBounds ()
DominatorTree * getDT () const
AssumptionCache * getAC () const

Checks memory dependences among accesses to the same underlying object to determine whether there vectorization is legal or not (and at which vectorization factor).

Note: This class will compute a conservative dependence for access to different underlying pointers. Clients, such as the loop vectorizer, will sometimes deal these potential dependencies by emitting runtime checks.

We use the ScalarEvolution framework to symbolically evalutate access functions pairs. Since we currently don't restructure the loop we can rely on the program order of memory accesses to determine their safety. At the moment we will only deem accesses as safe for:

Definition at line 91 of file LoopAccessAnalysis.h.

DepCandidates

MemAccessInfo

MemAccessInfoList

VectorizationSafetyStatus

Type to keep track of the status of the dependence check.

The order of the elements is important and has to be from most permissive to least permissive.

Enumerator
Safe
PossiblySafeWithRtChecks
Unsafe

Definition at line 101 of file LoopAccessAnalysis.h.

addAccess() [1/2]

void MemoryDepChecker::addAccess ( LoadInst * LI )

addAccess() [2/2]

void MemoryDepChecker::addAccess ( StoreInst * SI )

areDepsSafe()

Check whether the dependencies between the accesses are safe, and records the dependence information in Dependences if so.

Only checks sets with elements in CheckDeps.

Definition at line 2364 of file LoopAccessAnalysis.cpp.

References A(), assert(), B(), llvm::SmallPtrSetImpl< PtrType >::contains(), llvm::dbgs(), llvm::EquivalenceClasses< ElemTy >::findLeader(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::MemoryDepChecker::Dependence::isSafeForVectorization(), isSafeForVectorization(), LLVM_DEBUG, MaxDependences, llvm::EquivalenceClasses< ElemTy >::member_end(), llvm::MemoryDepChecker::Dependence::NoDep, and std::swap().

clearDependences()

void llvm::MemoryDepChecker::clearDependences ( ) inline

generateInstructionOrderMap()

Generate a mapping between the memory instructions and their indices according to program order.

Definition at line 265 of file LoopAccessAnalysis.h.

References I.

getAC()

getDependences()

Returns the memory dependences.

If null is returned we exceeded the MaxDependences threshold and this information is not available.

Definition at line 251 of file LoopAccessAnalysis.h.

getDT()

getInnermostLoop()

const Loop * llvm::MemoryDepChecker::getInnermostLoop ( ) const inline

getInstructionsForAccess()

getMaxSafeVectorWidthInBits()

uint64_t llvm::MemoryDepChecker::getMaxSafeVectorWidthInBits ( ) const inline

getMemoryInstructions()

getOrderForAccess()

Return the program order indices for the access location (Ptr, IsWrite).

Returns an empty ArrayRef if there are no accesses for the location.

Definition at line 280 of file LoopAccessAnalysis.h.

References I.

getPointerBounds()

getStoreLoadForwardSafeDistanceInBits()

uint64_t llvm::MemoryDepChecker::getStoreLoadForwardSafeDistanceInBits ( ) const inline

isSafeForAnyStoreLoadForwardDistances()

bool llvm::MemoryDepChecker::isSafeForAnyStoreLoadForwardDistances ( ) const inline

isSafeForAnyVectorWidth()

bool llvm::MemoryDepChecker::isSafeForAnyVectorWidth ( ) const inline

isSafeForVectorization()

bool llvm::MemoryDepChecker::isSafeForVectorization ( ) const inline

shouldRetryWithRuntimeChecks()

bool llvm::MemoryDepChecker::shouldRetryWithRuntimeChecks ( ) const inline

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