LLVM: lib/Analysis/MemorySSA.cpp File Reference (original) (raw)

Go to the source code of this file.

Classes
struct llvm::DenseMapInfo< MemoryLocOrCall >
class llvm::MemorySSA::ClobberWalkerBase
class llvm::MemorySSA::CachingWalker
A MemorySSAWalker that does AA walks to disambiguate accesses. More...
class llvm::MemorySSA::SkipSelfWalker
class llvm::MemorySSA::OptimizeUses
This class is a batch walker of all MemoryUse's in the program, and points their defining access at the thing that actually clobbers them. More...
class DOTFuncMSSAInfo
struct llvm::GraphTraits< DOTFuncMSSAInfo * >
struct llvm::DOTGraphTraits< DOTFuncMSSAInfo * >
Namespaces
namespace llvm
This is an optimization pass for GlobalISel generic memory operations.
Functions
INITIALIZE_PASS_BEGIN (MemorySSAWrapperPass, "memoryssa", "Memory SSA", false, true) INITIALIZE_PASS_END(MemorySSAWrapperPass
Memory static true cl::opt< unsigned > MaxCheckLimit ("memssa-check-limit", cl::Hidden, cl::init(100), cl::desc("The maximum number of stores/phis MemorySSA" "will consider trying to walk past (default = 100)"))
static bool areLoadsReorderable (const LoadInst *Use, const LoadInst *MayClobber)
This does one-way checks to see if Use could theoretically be hoisted above MayClobber.
template
static bool instructionClobbersQuery (const MemoryDef *MD, const MemoryLocation &UseLoc, const Instruction *UseInst, AliasAnalysisType &AA)
template
static bool instructionClobbersQuery (MemoryDef *MD, const MemoryUseOrDef *MU, const MemoryLocOrCall &UseMLOC, AliasAnalysisType &AA)
template
static bool isUseTriviallyOptimizableToLiveOnEntry (AliasAnalysisType &AA, const Instruction *I)
static LLVM_ATTRIBUTE_UNUSED void checkClobberSanity (const MemoryAccess *Start, MemoryAccess *ClobberAt, const MemoryLocation &StartLoc, const MemorySSA &MSSA, const UpwardsMemoryQuery &Query, BatchAAResults &AA, bool AllowImpreciseClobber=false)
Verifies that Start is clobbered by ClobberAt, and that nothing inbetween Start and ClobberAt can clobbers Start.
static bool isOrdered (const Instruction *I)
static const Instruction * getInvariantGroupClobberingInstruction (Instruction &I, DominatorTree &DT)
Variables
static cl::opt< std::string > DotCFGMSSA ("dot-cfg-mssa", cl::value_desc("file name for generated dot file"), cl::desc("file name for generated dot file"), cl::init(""))
memoryssa
Memory SSA
Memory false
static cl::opt< bool, true > VerifyMemorySSAX ("verify-memoryssa", cl::location(VerifyMemorySSA), cl::Hidden, cl::desc("Enable verification of MemorySSA."))
static const char LiveOnEntryStr [] = "liveOnEntry"

DEBUG_TYPE

#define DEBUG_TYPE "memoryssa"

areLoadsReorderable()

checkClobberSanity()

Verifies that Start is clobbered by ClobberAt, and that nothing inbetween Start and ClobberAt can clobbers Start.

This is meant to be as simple and self-contained as possible. Because it uses no cache, etc., it can be relatively expensive.

Parameters

Start The MemoryAccess that we want to walk from.
ClobberAt A clobber for Start.
StartLoc The MemoryLocation for Start.
MSSA The MemorySSA instance that Start and ClobberAt belong to.
Query The UpwardsMemoryQuery we used for our search.
AA The AliasAnalysis we used for our search.
AllowImpreciseClobber Always false, unless we do relaxed verify.

Definition at line 397 of file MemorySSA.cpp.

References assert(), llvm::def_chain(), llvm::MemorySSA::dominates(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::SmallVectorBase< Size_T >::empty(), llvm::MemorySSA::getDomTree(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), instructionClobbersQuery(), llvm::MemorySSA::isLiveOnEntryDef(), llvm::DominatorTree::isReachableFromEntry(), MAP, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::upward_defs_begin(), and llvm::upward_defs_end().

getInvariantGroupClobberingInstruction()

INITIALIZE_PASS_BEGIN()

instructionClobbersQuery() [1/2]

template

instructionClobbersQuery() [2/2]

template

isOrdered()

isUseTriviallyOptimizableToLiveOnEntry()

template

static bool isUseTriviallyOptimizableToLiveOnEntry ( AliasAnalysisType & AA, const Instruction * I ) static

MaxCheckLimit()

Memory static true cl::opt< unsigned > MaxCheckLimit ( "memssa-check-limit" , cl::Hidden , cl::init(100) , cl::desc("The maximum number of stores/phis MemorySSA" "will consider trying to walk past (default = 100)") ) static

DotCFGMSSA

false

LiveOnEntryStr

SSA

VerifyMemorySSAX

cl::opt< bool, true > VerifyMemorySSAX("verify-memoryssa", cl::location(VerifyMemorySSA), cl::Hidden, cl::desc("Enable verification of MemorySSA.")) ( "verify-memoryssa" , cl::location(VerifyMemorySSA) , cl::Hidden , cl::desc("Enable verification of MemorySSA.") ) static