class MemorySSA
Declaration
class MemorySSA { /* full declaration omitted */ };
Description
Encapsulates MemorySSA, including all data associated with memory accesses.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:714
Member Variables
- private llvm::AliasAnalysis* AA = nullptr
- private llvm::DominatorTree* DT
- private llvm::Function& F
- private DenseMap<const llvm::Value*, llvm::MemoryAccess*> ValueToMemoryAccess
- private llvm::MemorySSA::AccessMap PerBlockAccesses
- private llvm::MemorySSA::DefsMap PerBlockDefs
- private std::unique_ptr<MemoryAccess, ValueDeleter> LiveOnEntryDef
- private SmallPtrSet<const llvm::BasicBlock*, 16> BlockNumberingValid
- private DenseMap<const llvm::MemoryAccess*, unsigned long> BlockNumbering
- private std::unique_ptr<ClobberWalkerBase<AliasAnalysis>> WalkerBase
- private std::unique_ptr<CachingWalker<AliasAnalysis>> Walker
- private std::unique_ptr<SkipSelfWalker<AliasAnalysis>> SkipWalker
- private unsigned int NextID = 0
- private bool IsOptimized = false
Method Overview
- public MemorySSA(llvm::MemorySSA &&)
- public MemorySSA(llvm::Function &, llvm::AliasAnalysis *, llvm::DominatorTree *)
- private void buildMemorySSA(llvm::BatchAAResults & BAA)
- protected llvm::MemoryUseOrDef * createDefinedAccess(llvm::Instruction *, llvm::MemoryAccess *, const llvm::MemoryUseOrDef * Template = nullptr, bool CreationMustSucceed = true)
- private llvm::MemoryPhi * createMemoryPhi(llvm::BasicBlock * BB)
- private template <typename AliasAnalysisType>llvm::MemoryUseOrDef * createNewAccess(llvm::Instruction *, AliasAnalysisType *, const llvm::MemoryUseOrDef * Template = nullptr)
- public bool dominates(const llvm::MemoryAccess * A, const llvm::MemoryAccess * B) const
- public bool dominates(const llvm::MemoryAccess * A, const llvm::Use & B) const
- public void dump() const
- public void ensureOptimizedUses()
- public const llvm::MemorySSA::AccessList * getBlockAccesses(const llvm::BasicBlock * BB) const
- public const llvm::MemorySSA::DefsList * getBlockDefs(const llvm::BasicBlock * BB) const
- public llvm::DominatorTree & getDomTree() const
- public inline llvm::MemoryAccess * getLiveOnEntryDef() const
- public llvm::MemoryUseOrDef * getMemoryAccess(const llvm::Instruction * I) const
- public llvm::MemoryPhi * getMemoryAccess(const llvm::BasicBlock * BB) const
- private llvm::MemorySSA::AccessList * getOrCreateAccessList(const llvm::BasicBlock *)
- private llvm::MemorySSA::DefsList * getOrCreateDefsList(const llvm::BasicBlock *)
- public llvm::MemorySSAWalker * getSkipSelfWalker()
- public llvm::MemorySSAWalker * getWalker()
- private CachingWalker<llvm::AliasAnalysis> * getWalkerImpl()
- protected llvm::MemorySSA::AccessList * getWritableBlockAccesses(const llvm::BasicBlock * BB) const
- protected llvm::MemorySSA::DefsList * getWritableBlockDefs(const llvm::BasicBlock * BB) const
- protected void insertIntoListsBefore(llvm::MemoryAccess *, const llvm::BasicBlock *, AccessList::iterator)
- protected void insertIntoListsForBlock(llvm::MemoryAccess *, const llvm::BasicBlock *, llvm::MemorySSA::InsertionPlace)
- public inline bool isLiveOnEntryDef(const llvm::MemoryAccess * MA) const
- public bool locallyDominates(const llvm::MemoryAccess * A, const llvm::MemoryAccess * B) const
- private void markUnreachableAsLiveOnEntry(llvm::BasicBlock * BB)
- protected void moveTo(llvm::MemoryUseOrDef * What, llvm::BasicBlock * BB, AccessList::iterator Where)
- protected void moveTo(llvm::MemoryAccess * What, llvm::BasicBlock * BB, llvm::MemorySSA::InsertionPlace Point)
- private void placePHINodes(const SmallPtrSetImpl<llvm::BasicBlock *> &)
- private void prepareForMoveTo(llvm::MemoryAccess *, llvm::BasicBlock *)
- public void print(llvm::raw_ostream &) const
- protected void removeFromLists(llvm::MemoryAccess *, bool ShouldDelete = true)
- protected void removeFromLookups(llvm::MemoryAccess *)
- private llvm::MemoryAccess * renameBlock(llvm::BasicBlock *, llvm::MemoryAccess *, bool)
- private void renamePass(llvm::DomTreeNode *, llvm::MemoryAccess * IncomingVal, SmallPtrSetImpl<llvm::BasicBlock *> & Visited, bool SkipVisited = false, bool RenameAllUses = false)
- protected void renamePass(llvm::BasicBlock * BB, llvm::MemoryAccess * IncomingVal, SmallPtrSetImpl<llvm::BasicBlock *> & Visited)
- private void renameSuccessorPhis(llvm::BasicBlock *, llvm::MemoryAccess *, bool)
- private void renumberBlock(const llvm::BasicBlock *) const
- protected void verifyDominationNumbers(const llvm::Function & F) const
- public void verifyMemorySSA(llvm::MemorySSA::VerificationLevel = VerificationLevel::Fast) const
- protected void verifyOrderingDominationAndDefUses(llvm::Function & F, llvm::MemorySSA::VerificationLevel = VerificationLevel::Fast) const
- protected void verifyPrevDefInPhis(llvm::Function & F) const
- private void verifyUseInDefs(llvm::MemoryAccess *, llvm::MemoryAccess *) const
- public ~MemorySSA()
Methods
¶MemorySSA(llvm::MemorySSA&&)
MemorySSA(llvm::MemorySSA&&)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:720
Parameters
¶MemorySSA(llvm::Function&,
llvm::AliasAnalysis*,
llvm::DominatorTree*)
MemorySSA(llvm::Function&,
llvm::AliasAnalysis*,
llvm::DominatorTree*)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:716
Parameters
¶void buildMemorySSA(llvm::BatchAAResults& BAA)
void buildMemorySSA(llvm::BatchAAResults& BAA)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:863
Parameters
- llvm::BatchAAResults& BAA
¶llvm::MemoryUseOrDef* createDefinedAccess(
llvm::Instruction*,
llvm::MemoryAccess*,
const llvm::MemoryUseOrDef* Template =
nullptr,
bool CreationMustSucceed = true)
llvm::MemoryUseOrDef* createDefinedAccess(
llvm::Instruction*,
llvm::MemoryAccess*,
const llvm::MemoryUseOrDef* Template =
nullptr,
bool CreationMustSucceed = true)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:852
Parameters
- llvm::Instruction*
- llvm::MemoryAccess*
- const llvm::MemoryUseOrDef* Template = nullptr
- bool CreationMustSucceed = true
¶llvm::MemoryPhi* createMemoryPhi(
llvm::BasicBlock* BB)
llvm::MemoryPhi* createMemoryPhi(
llvm::BasicBlock* BB)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:872
Parameters
- llvm::BasicBlock* BB
¶template <typename AliasAnalysisType>
llvm::MemoryUseOrDef* createNewAccess(
llvm::Instruction*,
AliasAnalysisType*,
const llvm::MemoryUseOrDef* Template =
nullptr)
template <typename AliasAnalysisType>
llvm::MemoryUseOrDef* createNewAccess(
llvm::Instruction*,
AliasAnalysisType*,
const llvm::MemoryUseOrDef* Template =
nullptr)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:874
Templates
- AliasAnalysisType
Parameters
- llvm::Instruction*
- AliasAnalysisType*
- const llvm::MemoryUseOrDef* Template = nullptr
¶bool dominates(const llvm::MemoryAccess* A,
const llvm::MemoryAccess* B) const
bool dominates(const llvm::MemoryAccess* A,
const llvm::MemoryAccess* B) const
Description
Given two memory accesses in potentially different blocks, determine whether MemoryAccess \p A dominates MemoryAccess \p B.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:789
Parameters
- const llvm::MemoryAccess* A
- const llvm::MemoryAccess* B
¶bool dominates(const llvm::MemoryAccess* A,
const llvm::Use& B) const
bool dominates(const llvm::MemoryAccess* A,
const llvm::Use& B) const
Description
Given a MemoryAccess and a Use, determine whether MemoryAccess \p A dominates Use \p B.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:793
Parameters
- const llvm::MemoryAccess* A
- const llvm::Use& B
¶void dump() const
void dump() const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:741
¶void ensureOptimizedUses()
void ensureOptimizedUses()
Description
By default, uses are *not* optimized during MemorySSA construction. Calling this method will attempt to optimize all MemoryUses, if this has not happened yet for this MemorySSA instance. This should be done if you plan to query the clobbering access for most uses, or if you walk the def-use chain of uses.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:809
¶const llvm::MemorySSA::AccessList*
getBlockAccesses(const llvm::BasicBlock* BB) const
const llvm::MemorySSA::AccessList*
getBlockAccesses(const llvm::BasicBlock* BB) const
Description
Return the list of MemoryAccess's for a given basic block. This list is not modifiable by the user.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:771
Parameters
- const llvm::BasicBlock* BB
¶const llvm::MemorySSA::DefsList* getBlockDefs(
const llvm::BasicBlock* BB) const
const llvm::MemorySSA::DefsList* getBlockDefs(
const llvm::BasicBlock* BB) const
Description
Return the list of MemoryDef's and MemoryPhi's for a given basic block. This list is not modifiable by the user.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:779
Parameters
- const llvm::BasicBlock* BB
¶llvm::DominatorTree& getDomTree() const
llvm::DominatorTree& getDomTree() const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:739
¶inline llvm::MemoryAccess* getLiveOnEntryDef()
const
inline llvm::MemoryAccess* getLiveOnEntryDef()
const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:755
¶llvm::MemoryUseOrDef* getMemoryAccess(
const llvm::Instruction* I) const
llvm::MemoryUseOrDef* getMemoryAccess(
const llvm::Instruction* I) const
Description
Given a memory Mod/Ref'ing instruction, get the MemorySSA access associated with it. If passed a basic block gets the memory phi node that exists for that block, if there is one. Otherwise, this will get a MemoryUseOrDef.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:731
Parameters
- const llvm::Instruction* I
¶llvm::MemoryPhi* getMemoryAccess(
const llvm::BasicBlock* BB) const
llvm::MemoryPhi* getMemoryAccess(
const llvm::BasicBlock* BB) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:735
Parameters
- const llvm::BasicBlock* BB
¶llvm::MemorySSA::AccessList*
getOrCreateAccessList(const llvm::BasicBlock*)
llvm::MemorySSA::AccessList*
getOrCreateAccessList(const llvm::BasicBlock*)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:882
Parameters
- const llvm::BasicBlock*
¶llvm::MemorySSA::DefsList* getOrCreateDefsList(
const llvm::BasicBlock*)
llvm::MemorySSA::DefsList* getOrCreateDefsList(
const llvm::BasicBlock*)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:883
Parameters
- const llvm::BasicBlock*
¶llvm::MemorySSAWalker* getSkipSelfWalker()
llvm::MemorySSAWalker* getSkipSelfWalker()
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:725
¶llvm::MemorySSAWalker* getWalker()
llvm::MemorySSAWalker* getWalker()
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:724
¶CachingWalker<llvm::AliasAnalysis>*
getWalkerImpl()
CachingWalker<llvm::AliasAnalysis>*
getWalkerImpl()
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:862
¶llvm::MemorySSA::AccessList*
getWritableBlockAccesses(
const llvm::BasicBlock* BB) const
llvm::MemorySSA::AccessList*
getWritableBlockAccesses(
const llvm::BasicBlock* BB) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:822
Parameters
- const llvm::BasicBlock* BB
¶llvm::MemorySSA::DefsList* getWritableBlockDefs(
const llvm::BasicBlock* BB) const
llvm::MemorySSA::DefsList* getWritableBlockDefs(
const llvm::BasicBlock* BB) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:828
Parameters
- const llvm::BasicBlock* BB
¶void insertIntoListsBefore(
llvm::MemoryAccess*,
const llvm::BasicBlock*,
AccessList::iterator)
void insertIntoListsBefore(
llvm::MemoryAccess*,
const llvm::BasicBlock*,
AccessList::iterator)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:850
Parameters
¶void insertIntoListsForBlock(
llvm::MemoryAccess*,
const llvm::BasicBlock*,
llvm::MemorySSA::InsertionPlace)
void insertIntoListsForBlock(
llvm::MemoryAccess*,
const llvm::BasicBlock*,
llvm::MemorySSA::InsertionPlace)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:848
Parameters
- llvm::MemoryAccess*
- const llvm::BasicBlock*
- llvm::MemorySSA::InsertionPlace
¶inline bool isLiveOnEntryDef(
const llvm::MemoryAccess* MA) const
inline bool isLiveOnEntryDef(
const llvm::MemoryAccess* MA) const
Description
Return true if \p MA represents the live on entry value Loads and stores from pointer arguments and other global values may be defined by memory operations that do not occur in the current function, so they may be live on entry to the function. MemorySSA represents such memory state by the live on entry definition, which is guaranteed to occur before any other memory access in the function.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:751
Parameters
- const llvm::MemoryAccess* MA
¶bool locallyDominates(
const llvm::MemoryAccess* A,
const llvm::MemoryAccess* B) const
bool locallyDominates(
const llvm::MemoryAccess* A,
const llvm::MemoryAccess* B) const
Description
Given two memory accesses in the same basic block, determine whether MemoryAccess \p A dominates MemoryAccess \p B.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:785
Parameters
- const llvm::MemoryAccess* A
- const llvm::MemoryAccess* B
¶void markUnreachableAsLiveOnEntry(
llvm::BasicBlock* BB)
void markUnreachableAsLiveOnEntry(
llvm::BasicBlock* BB)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:871
Parameters
- llvm::BasicBlock* BB
¶void moveTo(llvm::MemoryUseOrDef* What,
llvm::BasicBlock* BB,
AccessList::iterator Where)
void moveTo(llvm::MemoryUseOrDef* What,
llvm::BasicBlock* BB,
AccessList::iterator Where)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:837
Parameters
- llvm::MemoryUseOrDef* What
- llvm::BasicBlock* BB
- AccessList::iterator Where
¶void moveTo(llvm::MemoryAccess* What,
llvm::BasicBlock* BB,
llvm::MemorySSA::InsertionPlace Point)
void moveTo(llvm::MemoryAccess* What,
llvm::BasicBlock* BB,
llvm::MemorySSA::InsertionPlace Point)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:838
Parameters
- llvm::MemoryAccess* What
- llvm::BasicBlock* BB
- llvm::MemorySSA::InsertionPlace Point
¶void placePHINodes(
const SmallPtrSetImpl<llvm::BasicBlock*>&)
void placePHINodes(
const SmallPtrSetImpl<llvm::BasicBlock*>&)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:876
Parameters
- const SmallPtrSetImpl<llvm::BasicBlock*>&
¶void prepareForMoveTo(llvm::MemoryAccess*,
llvm::BasicBlock*)
void prepareForMoveTo(llvm::MemoryAccess*,
llvm::BasicBlock*)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:865
Parameters
¶void print(llvm::raw_ostream&) const
void print(llvm::raw_ostream&) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:742
Parameters
¶void removeFromLists(llvm::MemoryAccess*,
bool ShouldDelete = true)
void removeFromLists(llvm::MemoryAccess*,
bool ShouldDelete = true)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:847
Parameters
- llvm::MemoryAccess*
- bool ShouldDelete = true
¶void removeFromLookups(llvm::MemoryAccess*)
void removeFromLookups(llvm::MemoryAccess*)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:846
Parameters
¶llvm::MemoryAccess* renameBlock(
llvm::BasicBlock*,
llvm::MemoryAccess*,
bool)
llvm::MemoryAccess* renameBlock(
llvm::BasicBlock*,
llvm::MemoryAccess*,
bool)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:877
Parameters
¶void renamePass(
llvm::DomTreeNode*,
llvm::MemoryAccess* IncomingVal,
SmallPtrSetImpl<llvm::BasicBlock*>& Visited,
bool SkipVisited = false,
bool RenameAllUses = false)
void renamePass(
llvm::DomTreeNode*,
llvm::MemoryAccess* IncomingVal,
SmallPtrSetImpl<llvm::BasicBlock*>& Visited,
bool SkipVisited = false,
bool RenameAllUses = false)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:879
Parameters
- llvm::DomTreeNode*
- llvm::MemoryAccess* IncomingVal
- SmallPtrSetImpl<llvm::BasicBlock*>& Visited
- bool SkipVisited = false
- bool RenameAllUses = false
¶void renamePass(
llvm::BasicBlock* BB,
llvm::MemoryAccess* IncomingVal,
SmallPtrSetImpl<llvm::BasicBlock*>& Visited)
void renamePass(
llvm::BasicBlock* BB,
llvm::MemoryAccess* IncomingVal,
SmallPtrSetImpl<llvm::BasicBlock*>& Visited)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:841
Parameters
- llvm::BasicBlock* BB
- llvm::MemoryAccess* IncomingVal
- SmallPtrSetImpl<llvm::BasicBlock*>& Visited
¶void renameSuccessorPhis(llvm::BasicBlock*,
llvm::MemoryAccess*,
bool)
void renameSuccessorPhis(llvm::BasicBlock*,
llvm::MemoryAccess*,
bool)
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:878
Parameters
¶void renumberBlock(const llvm::BasicBlock*) const
void renumberBlock(const llvm::BasicBlock*) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:884
Parameters
- const llvm::BasicBlock*
¶void verifyDominationNumbers(
const llvm::Function& F) const
void verifyDominationNumbers(
const llvm::Function& F) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:818
Parameters
- const llvm::Function& F
¶void verifyMemorySSA(
llvm::MemorySSA::VerificationLevel =
VerificationLevel::Fast) const
void verifyMemorySSA(
llvm::MemorySSA::VerificationLevel =
VerificationLevel::Fast) const
Description
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right places). This is used by unit tests.
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:798
Parameters
- llvm::MemorySSA::VerificationLevel = VerificationLevel::Fast
¶void verifyOrderingDominationAndDefUses(
llvm::Function& F,
llvm::MemorySSA::VerificationLevel =
VerificationLevel::Fast) const
void verifyOrderingDominationAndDefUses(
llvm::Function& F,
llvm::MemorySSA::VerificationLevel =
VerificationLevel::Fast) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:816
Parameters
- llvm::Function& F
- llvm::MemorySSA::VerificationLevel = VerificationLevel::Fast
¶void verifyPrevDefInPhis(llvm::Function& F) const
void verifyPrevDefInPhis(llvm::Function& F) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:819
Parameters
¶void verifyUseInDefs(llvm::MemoryAccess*,
llvm::MemoryAccess*) const
void verifyUseInDefs(llvm::MemoryAccess*,
llvm::MemoryAccess*) const
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:866
Parameters
¶~MemorySSA()
~MemorySSA()
Declared at: llvm/include/llvm/Analysis/MemorySSA.h:722