class MemoryDependenceResults

Declaration

class MemoryDependenceResults { /* full declaration omitted */ };

Description

Provides a lazy, caching interface for making common memory aliasing information queries, backed by LLVM's alias analysis passes. The dependency information returned is somewhat unusual, but is pragmatic. If queried about a store or call that might modify memory, the analysis will return the instruction[s] that may either load from that memory or store to it. If queried with a load or call that can never modify memory, the analysis will return calls and stores that might modify the pointer, but generally does not return loads unless a) they are volatile, or b) they load from *must-aliased* pointers. Returning a dependence on must-alias'd pointers instead of all pointers interacts well with the internal caching mechanism.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:276

Method Overview

  • public MemoryDependenceResults(llvm::AliasAnalysis & AA, llvm::AssumptionCache & AC, const llvm::TargetLibraryInfo & TLI, llvm::DominatorTree & DT, llvm::PhiValues & PV, unsigned int DefaultBlockScanLimit)
  • public unsigned int getDefaultBlockScanLimit() const
  • public llvm::MemDepResult getDependency(llvm::Instruction * QueryInst, llvm::OrderedBasicBlock * OBB = nullptr)
  • public llvm::MemDepResult getInvariantGroupPointerDependency(llvm::LoadInst * LI, llvm::BasicBlock * BB)
  • public static unsigned int getLoadLoadClobberFullWidthSize(const llvm::Value * MemLocBase, int64_t MemLocOffs, unsigned int MemLocSize, const llvm::LoadInst * LI)
  • public const llvm::MemoryDependenceResults::NonLocalDepInfo & getNonLocalCallDependency(llvm::CallBase * QueryCall)
  • public void getNonLocalPointerDependency(llvm::Instruction * QueryInst, SmallVectorImpl<llvm::NonLocalDepResult> & Result)
  • public llvm::MemDepResult getPointerDependencyFrom(const llvm::MemoryLocation & Loc, bool isLoad, BasicBlock::iterator ScanIt, llvm::BasicBlock * BB, llvm::Instruction * QueryInst = nullptr, unsigned int * Limit = nullptr, llvm::OrderedBasicBlock * OBB = nullptr)
  • public llvm::MemDepResult getSimplePointerDependencyFrom(const llvm::MemoryLocation & MemLoc, bool isLoad, BasicBlock::iterator ScanIt, llvm::BasicBlock * BB, llvm::Instruction * QueryInst, unsigned int * Limit, llvm::OrderedBasicBlock * OBB)
  • public bool invalidate(llvm::Function & F, const llvm::PreservedAnalyses & PA, FunctionAnalysisManager::Invalidator & Inv)
  • public void invalidateCachedPointerInfo(llvm::Value * Ptr)
  • public void invalidateCachedPredecessors()
  • public void releaseMemory()
  • public void removeInstruction(llvm::Instruction * InstToRemove)

Methods

MemoryDependenceResults(
    llvm::AliasAnalysis& AA,
    llvm::AssumptionCache& AC,
    const llvm::TargetLibraryInfo& TLI,
    llvm::DominatorTree& DT,
    llvm::PhiValues& PV,
    unsigned int DefaultBlockScanLimit)

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:368

Parameters

llvm::AliasAnalysis& AA
llvm::AssumptionCache& AC
const llvm::TargetLibraryInfo& TLI
llvm::DominatorTree& DT
llvm::PhiValues& PV
unsigned int DefaultBlockScanLimit

unsigned int getDefaultBlockScanLimit() const

Description

Some methods limit the number of instructions they will examine. The return value of this method is the default limit that will be used if no limit is explicitly passed in.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:381

llvm::MemDepResult getDependency(
    llvm::Instruction* QueryInst,
    llvm::OrderedBasicBlock* OBB = nullptr)

Description

Returns the instruction on which a memory operation depends. See the class comment for more details. It is illegal to call this on non-memory instructions.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:387

Parameters

llvm::Instruction* QueryInst
llvm::OrderedBasicBlock* OBB = nullptr

llvm::MemDepResult
getInvariantGroupPointerDependency(
    llvm::LoadInst* LI,
    llvm::BasicBlock* BB)

Description

This analysis looks for other loads and stores with invariant.group metadata and the same pointer operand. Returns Unknown if it does not find anything, and Def if it can be assumed that 2 instructions load or store the same value and NonLocal which indicate that non-local Def was found, which can be retrieved by calling getNonLocalPointerDependency with the same queried instruction.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:469

Parameters

llvm::LoadInst* LI
llvm::BasicBlock* BB

static unsigned int
getLoadLoadClobberFullWidthSize(
    const llvm::Value* MemLocBase,
    int64_t MemLocOffs,
    unsigned int MemLocSize,
    const llvm::LoadInst* LI)

Description

Looks at a memory location for a load (specified by MemLocBase, Offs, and Size) and compares it against a load. If the specified load could be safely widened to a larger integer load that is 1) still efficient, 2) safe for the target, and 3) would provide the specified memory location value, then this function returns the size in bytes of the load width to use. If not, this returns zero.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:478

Parameters

const llvm::Value* MemLocBase
int64_t MemLocOffs
unsigned int MemLocSize
const llvm::LoadInst* LI

const llvm::MemoryDependenceResults::
    NonLocalDepInfo&
    getNonLocalCallDependency(
        llvm::CallBase* QueryCall)

Description

Perform a full dependency query for the specified call, returning the set of blocks that the value is potentially live across. The returned set of results will include a "NonLocal" result for all blocks where the value is live across. This method assumes the instruction returns a "NonLocal" dependency within its own block. This returns a reference to an internal data structure that may be invalidated on the next non-local query or when an instruction is removed. Clients must copy this data if they want it around longer than that.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:403

Parameters

llvm::CallBase* QueryCall

void getNonLocalPointerDependency(
    llvm::Instruction* QueryInst,
    SmallVectorImpl<llvm::NonLocalDepResult>&
        Result)

Description

Perform a full dependency query for an access to the QueryInst's specified memory location, returning the set of instructions that either define or clobber the value. Warning: For a volatile query instruction, the dependencies will be accurate, and thus usable for reordering, but it is never legal to remove the query instruction. This method assumes the pointer has a "NonLocal" dependency within QueryInst's parent basic block.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:415

Parameters

llvm::Instruction* QueryInst
SmallVectorImpl<llvm::NonLocalDepResult>& Result

llvm::MemDepResult getPointerDependencyFrom(
    const llvm::MemoryLocation& Loc,
    bool isLoad,
    BasicBlock::iterator ScanIt,
    llvm::BasicBlock* BB,
    llvm::Instruction* QueryInst = nullptr,
    unsigned int* Limit = nullptr,
    llvm::OrderedBasicBlock* OBB = nullptr)

Description

Returns the instruction on which a memory location depends. If isLoad is true, this routine ignores may-aliases with read-only operations. If isLoad is false, this routine ignores may-aliases with reads from read-only locations. If possible, pass the query instruction as well; this function may take advantage of the metadata annotated to the query instruction to refine the result. \p Limit can be used to set the maximum number of instructions that will be examined to find the pointer dependency. On return, it will be set to the number of instructions left to examine. If a null pointer is passed in, the limit will default to the value of -memdep-block-scan-limit. Note that this is an uncached query, and thus may be inefficient.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:450

Parameters

const llvm::MemoryLocation& Loc
bool isLoad
BasicBlock::iterator ScanIt
llvm::BasicBlock* BB
llvm::Instruction* QueryInst = nullptr
unsigned int* Limit = nullptr
llvm::OrderedBasicBlock* OBB = nullptr

llvm::MemDepResult getSimplePointerDependencyFrom(
    const llvm::MemoryLocation& MemLoc,
    bool isLoad,
    BasicBlock::iterator ScanIt,
    llvm::BasicBlock* BB,
    llvm::Instruction* QueryInst,
    unsigned int* Limit,
    llvm::OrderedBasicBlock* OBB)

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:458

Parameters

const llvm::MemoryLocation& MemLoc
bool isLoad
BasicBlock::iterator ScanIt
llvm::BasicBlock* BB
llvm::Instruction* QueryInst
unsigned int* Limit
llvm::OrderedBasicBlock* OBB

bool invalidate(
    llvm::Function& F,
    const llvm::PreservedAnalyses& PA,
    FunctionAnalysisManager::Invalidator& Inv)

Description

Handle invalidation in the new PM.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:375

Parameters

llvm::Function& F
const llvm::PreservedAnalyses& PA
FunctionAnalysisManager::Invalidator& Inv

void invalidateCachedPointerInfo(llvm::Value* Ptr)

Description

Invalidates cached information about the specified pointer, because it may be too conservative in memdep. This is an optional call that can be used when the client detects an equivalence between the pointer and some other value and replaces the other value with ptr. This can make Ptr available in more places that cached info does not necessarily keep.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:429

Parameters

llvm::Value* Ptr

void invalidateCachedPredecessors()

Description

Clears the PredIteratorCache info. This needs to be done when the CFG changes, e.g., due to splitting critical edges.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:435

void releaseMemory()

Description

Release memory in caches.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:484

void removeInstruction(
    llvm::Instruction* InstToRemove)

Description

Removes an instruction from the dependence analysis, updating the dependence of instructions that previously depended on it.

Declared at: llvm/include/llvm/Analysis/MemoryDependenceAnalysis.h:420

Parameters

llvm::Instruction* InstToRemove