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&&)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:720

Parameters

llvm::MemorySSA&&

MemorySSA(llvm::Function&,
          llvm::AliasAnalysis*,
          llvm::DominatorTree*)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:716

Parameters

llvm::Function&
llvm::AliasAnalysis*
llvm::DominatorTree*

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)

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)

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)

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

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

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

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:741

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

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

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

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:739

inline llvm::MemoryAccess* getLiveOnEntryDef()
    const

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:755

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

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:735

Parameters

const llvm::BasicBlock* BB

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*)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:883

Parameters

const llvm::BasicBlock*

llvm::MemorySSAWalker* getSkipSelfWalker()

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:725

llvm::MemorySSAWalker* getWalker()

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:724

CachingWalker<llvm::AliasAnalysis>*
getWalkerImpl()

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:862

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

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:828

Parameters

const llvm::BasicBlock* BB

void insertIntoListsBefore(
    llvm::MemoryAccess*,
    const llvm::BasicBlock*,
    AccessList::iterator)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:850

Parameters

llvm::MemoryAccess*
const llvm::BasicBlock*
AccessList::iterator

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

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

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)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:871

Parameters

llvm::BasicBlock* BB

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)

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*>&)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:876

Parameters

const SmallPtrSetImpl<llvm::BasicBlock*>&

void prepareForMoveTo(llvm::MemoryAccess*,
                      llvm::BasicBlock*)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:865

Parameters

llvm::MemoryAccess*
llvm::BasicBlock*

void print(llvm::raw_ostream&) const

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:742

Parameters

llvm::raw_ostream&

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*)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:846

Parameters

llvm::MemoryAccess*

llvm::MemoryAccess* renameBlock(
    llvm::BasicBlock*,
    llvm::MemoryAccess*,
    bool)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:877

Parameters

llvm::BasicBlock*
llvm::MemoryAccess*
bool

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)

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)

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:878

Parameters

llvm::BasicBlock*
llvm::MemoryAccess*
bool

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

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:818

Parameters

const llvm::Function& F

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

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:816

Parameters

llvm::Function& F
llvm::MemorySSA::VerificationLevel = VerificationLevel::Fast

void verifyPrevDefInPhis(llvm::Function& F) const

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:819

Parameters

llvm::Function& F

void verifyUseInDefs(llvm::MemoryAccess*,
                     llvm::MemoryAccess*) const

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:866

Parameters

llvm::MemoryAccess*
llvm::MemoryAccess*

~MemorySSA()

Declared at: llvm/include/llvm/Analysis/MemorySSA.h:722