LLVM 17.0.0git
|
Encapsulates MemorySSA, including all data associated with memory accesses. More...
#include "llvm/Analysis/MemorySSA.h"
Classes | |
class | CachingWalker |
A MemorySSAWalker that does AA walks to disambiguate accesses. More... | |
class | ClobberWalkerBase |
class | 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 | SkipSelfWalker |
Public Types | |
enum class | VerificationLevel { Fast , Full } |
enum | InsertionPlace { Beginning , End , BeforeTerminator } |
Used in various insertion functions to specify whether we are talking about the beginning or end of a block. More... | |
using | AccessList = iplist< MemoryAccess, ilist_tag< MSSAHelpers::AllAccessTag > > |
using | DefsList = simple_ilist< MemoryAccess, ilist_tag< MSSAHelpers::DefsOnlyTag > > |
Public Member Functions | |
MemorySSA (Function &, AliasAnalysis *, DominatorTree *) | |
MemorySSA (MemorySSA &&)=delete | |
~MemorySSA () | |
MemorySSAWalker * | getWalker () |
MemorySSAWalker * | getSkipSelfWalker () |
MemoryUseOrDef * | getMemoryAccess (const Instruction *I) const |
Given a memory Mod/Ref'ing instruction, get the MemorySSA access associated with it. | |
MemoryPhi * | getMemoryAccess (const BasicBlock *BB) const |
DominatorTree & | getDomTree () const |
void | dump () const |
void | print (raw_ostream &) const |
bool | isLiveOnEntryDef (const MemoryAccess *MA) const |
Return true if MA represents the live on entry value. | |
MemoryAccess * | getLiveOnEntryDef () const |
const AccessList * | getBlockAccesses (const BasicBlock *BB) const |
Return the list of MemoryAccess's for a given basic block. | |
const DefsList * | getBlockDefs (const BasicBlock *BB) const |
Return the list of MemoryDef's and MemoryPhi's for a given basic block. | |
bool | locallyDominates (const MemoryAccess *A, const MemoryAccess *B) const |
Given two memory accesses in the same basic block, determine whether MemoryAccess A dominates MemoryAccess B . | |
bool | dominates (const MemoryAccess *A, const MemoryAccess *B) const |
Given two memory accesses in potentially different blocks, determine whether MemoryAccess A dominates MemoryAccess B . | |
bool | dominates (const MemoryAccess *A, const Use &B) const |
Given a MemoryAccess and a Use, determine whether MemoryAccess A dominates Use B . | |
void | verifyMemorySSA (VerificationLevel=VerificationLevel::Fast) const |
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right places). | |
void | ensureOptimizedUses () |
By default, uses are not optimized during MemorySSA construction. | |
AliasAnalysis & | getAA () |
Friends | |
class | MemorySSAPrinterLegacyPass |
class | MemorySSAUpdater |
Encapsulates MemorySSA, including all data associated with memory accesses.
Definition at line 700 of file MemorySSA.h.
Definition at line 750 of file MemorySSA.h.
Definition at line 751 of file MemorySSA.h.
Used in various insertion functions to specify whether we are talking about the beginning or end of a block.
Enumerator | |
---|---|
Beginning | |
End | |
BeforeTerminator |
Definition at line 788 of file MemorySSA.h.
|
strong |
Enumerator | |
---|---|
Fast | |
Full |
Definition at line 781 of file MemorySSA.h.
MemorySSA::MemorySSA | ( | Function & | Func, |
AliasAnalysis * | AA, | ||
DominatorTree * | DT | ||
) |
Definition at line 1235 of file MemorySSA.cpp.
References assert(), and getWalker().
|
delete |
MemorySSA::~MemorySSA | ( | ) |
Definition at line 1253 of file MemorySSA.cpp.
References llvm::User::dropAllReferences().
|
protected |
Definition at line 1692 of file MemorySSA.cpp.
References assert(), I, llvm::MemoryUseOrDef::setDefiningAccess(), and Template.
Referenced by llvm::MemorySSAUpdater::createMemoryAccessAfter(), llvm::MemorySSAUpdater::createMemoryAccessBefore(), and llvm::MemorySSAUpdater::createMemoryAccessInBB().
bool MemorySSA::dominates | ( | const MemoryAccess * | A, |
const MemoryAccess * | B | ||
) | const |
Given two memory accesses in potentially different blocks, determine whether MemoryAccess A
dominates MemoryAccess B
.
Definition at line 2115 of file MemorySSA.cpp.
References llvm::DominatorTree::dominates(), llvm::MemoryAccess::getBlock(), isLiveOnEntryDef(), and locallyDominates().
Referenced by llvm::canSinkOrHoistInst(), checkClobberSanity(), dominates(), verifyOrderingDominationAndDefUses(), and writtenBetween().
bool MemorySSA::dominates | ( | const MemoryAccess * | A, |
const Use & | B | ||
) | const |
Given a MemoryAccess and a Use, determine whether MemoryAccess A
dominates Use B
.
Definition at line 2128 of file MemorySSA.cpp.
References llvm::DominatorTree::dominates(), dominates(), llvm::MemoryAccess::getBlock(), llvm::Use::getUser(), and locallyDominates().
LLVM_DUMP_METHOD void MemorySSA::dump | ( | ) | const |
Definition at line 1859 of file MemorySSA.cpp.
References llvm::dbgs(), and print().
void MemorySSA::ensureOptimizedUses | ( | ) |
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.
Definition at line 2142 of file MemorySSA.cpp.
References llvm::MemorySSA::OptimizeUses::optimizeUses().
Referenced by llvm::GVNHoist::GVNHoist(), llvm::MemorySSAPrinterPass::run(), and llvm::MemorySSAPrinterLegacyPass::runOnFunction().
|
inline |
Definition at line 797 of file MemorySSA.h.
Referenced by llvm::MemorySSAWalker::getClobberingMemoryAccess().
|
inline |
Return the list of MemoryAccess's for a given basic block.
This list is not modifiable by the user.
Definition at line 757 of file MemorySSA.h.
Referenced by llvm::canSinkOrHoistInst(), foreachMemoryAccess(), llvm::MemorySSAUpdater::moveAllAfterSpliceBlocks(), llvm::SinkAndHoistLICMFlags::SinkAndHoistLICMFlags(), verifyDominationNumbers(), and verifyOrderingDominationAndDefUses().
|
inline |
Return the list of MemoryDef's and MemoryPhi's for a given basic block.
This list is not modifiable by the user.
Definition at line 765 of file MemorySSA.h.
Referenced by getNewDefiningAccessForClone(), llvm::MemorySSAUpdater::insertUse(), pointerInvalidatedByBlock(), unswitchAllTrivialConditions(), verifyOrderingDominationAndDefUses(), and verifyPrevDefInPhis().
|
inline |
Definition at line 725 of file MemorySSA.h.
Referenced by checkClobberSanity(), and llvm::MemorySSA::ClobberWalkerBase::getClobberingMemoryAccessBase().
|
inline |
Definition at line 741 of file MemorySSA.h.
Referenced by llvm::MemorySSA::ClobberWalkerBase::getClobberingMemoryAccessBase(), llvm::MemorySSAUpdater::insertDef(), and llvm::MemorySSA::OptimizeUses::optimizeUses().
|
inline |
Definition at line 721 of file MemorySSA.h.
|
inline |
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.
Definition at line 717 of file MemorySSA.h.
References I.
Referenced by buildPartialInvariantUnswitchConditionalBranch(), llvm::canSinkOrHoistInst(), llvm::MemorySSAUpdater::changeToUnreachable(), cloneInstructionInExitBlock(), llvm::MemorySSAWalker::getClobberingMemoryAccess(), llvm::MemorySSA::ClobberWalkerBase::getClobberingMemoryAccessBase(), getNewDefiningAccessForClone(), llvm::hasPartialIVCondition(), llvm::MemorySSAUpdater::insertDef(), llvm::Loop::makeLoopInvariant(), llvm::MergeBlockIntoPredecessor(), llvm::MemorySSAUpdater::moveAllAfterMergeBlocks(), llvm::MemorySSAUpdater::moveAllAfterSpliceBlocks(), moveInstructionBefore(), llvm::MemorySSAUpdater::moveToPlace(), llvm::MemorySSAUpdater::removeBlocks(), llvm::MemorySSAUpdater::removeDuplicatePhiEdgesBetween(), llvm::MemorySSAUpdater::removeEdge(), llvm::MemorySSAUpdater::removeMemoryAccess(), simplifyLoopInst(), sinkInstruction(), turnGuardIntoBranch(), llvm::MemorySSAUpdater::updateForClonedBlockIntoPred(), llvm::MemorySSAUpdater::updateForClonedLoop(), llvm::MemorySSAUpdater::updatePhisWhenInsertingUniqueBackedgeBlock(), verifyOrderingDominationAndDefUses(), verifyPrevDefInPhis(), and llvm::MemorySSAUpdater::wireOldPredecessorsToNewImmediatePredecessor().
MemorySSAWalker * MemorySSA::getSkipSelfWalker | ( | ) |
Definition at line 1570 of file MemorySSA.cpp.
Referenced by llvm::canSinkOrHoistInst(), and pointerInvalidatedByLoop().
MemorySSAWalker * MemorySSA::getWalker | ( | ) |
Definition at line 1557 of file MemorySSA.cpp.
Referenced by llvm::AMDGPU::isClobberedInFunction(), MemorySSA(), removeFromLookups(), and writtenBetween().
|
inlineprotected |
Definition at line 810 of file MemorySSA.h.
Referenced by insertIntoListsBefore(), llvm::MemorySSAUpdater::removeBlocks(), llvm::MemorySSAUpdater::updateForClonedLoop(), and llvm::MemorySSAUpdater::wireOldPredecessorsToNewImmediatePredecessor().
|
inlineprotected |
Definition at line 816 of file MemorySSA.h.
References llvm::simple_ilist< T, Options >::end().
Referenced by llvm::MemorySSAUpdater::insertDef(), and llvm::MemorySSAUpdater::insertUse().
|
protected |
Definition at line 1617 of file MemorySSA.cpp.
References getWritableBlockAccesses().
Referenced by llvm::MemorySSAUpdater::createMemoryAccessAfter(), llvm::MemorySSAUpdater::createMemoryAccessBefore(), and moveTo().
|
protected |
Definition at line 1585 of file MemorySSA.cpp.
References Beginning, and llvm::find_if_not().
Referenced by llvm::MemorySSAUpdater::createMemoryAccessInBB(), and moveTo().
|
inline |
Return true if 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.
Definition at line 737 of file MemorySSA.h.
Referenced by llvm::canSinkOrHoistInst(), checkClobberSanity(), dominates(), llvm::MemorySSA::ClobberWalkerBase::getClobberingMemoryAccessBase(), getNewDefiningAccessForClone(), hasUndefContents(), llvm::AMDGPU::isClobberedInFunction(), locallyDominates(), pointerInvalidatedByLoop(), llvm::MemorySSAUpdater::removeMemoryAccess(), and llvm::MemorySSAUpdater::updateForClonedLoop().
bool MemorySSA::locallyDominates | ( | const MemoryAccess * | Dominator, |
const MemoryAccess * | Dominatee | ||
) | const |
Given two memory accesses in the same basic block, determine whether MemoryAccess A
dominates MemoryAccess B
.
Determine, for two memory accesses in the same block, whether Dominator
dominates Dominatee
.
Dominator
dominates Dominatee
. Definition at line 2084 of file MemorySSA.cpp.
References assert(), llvm::MemoryAccess::getBlock(), and isLiveOnEntryDef().
Referenced by dominates(), and pointerInvalidatedByBlock().
|
protected |
Definition at line 1667 of file MemorySSA.cpp.
References assert(), Beginning, llvm::MemoryAccess::getBlock(), and insertIntoListsForBlock().
|
protected |
Definition at line 1661 of file MemorySSA.cpp.
References insertIntoListsBefore().
Referenced by llvm::MemorySSAUpdater::wireOldPredecessorsToNewImmediatePredecessor().
void MemorySSA::print | ( | raw_ostream & | OS | ) | const |
Definition at line 1853 of file MemorySSA.cpp.
Referenced by llvm::MemoryAccess::dump(), dump(), llvm::MemoryAccess::print(), llvm::MemorySSAWrapperPass::print(), llvm::MemorySSAPrinterPass::run(), and llvm::MemorySSAPrinterLegacyPass::runOnFunction().
|
protected |
Properly remove MA
from all of MemorySSA's lists.
Because of the way the intrusive list and use lists work, it is important to do removal in the right order. ShouldDelete defaults to true, and will cause the memory access to also be deleted, not just removed.
Definition at line 1826 of file MemorySSA.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::erase(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), and llvm::MemoryAccess::getBlock().
Referenced by llvm::MemorySSAUpdater::removeBlocks(), and llvm::MemorySSAUpdater::removeMemoryAccess().
|
protected |
Properly remove MA
from all of MemorySSA's lookup tables.
Definition at line 1799 of file MemorySSA.cpp.
References assert(), llvm::MemoryAccess::getBlock(), llvm::MemoryUseOrDef::getMemoryInst(), getWalker(), llvm::MemorySSAWalker::invalidateInfo(), llvm::MemoryUseOrDef::setDefiningAccess(), and llvm::Value::use_empty().
Referenced by llvm::MemorySSAUpdater::removeBlocks(), and llvm::MemorySSAUpdater::removeMemoryAccess().
|
inlineprotected |
Definition at line 829 of file MemorySSA.h.
Referenced by llvm::MemorySSAUpdater::insertDef(), and llvm::MemorySSAUpdater::insertUse().
Verify that all of the blocks we believe to have valid domination numbers actually have valid domination numbers.
Definition at line 1921 of file MemorySSA.cpp.
References assert(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::SmallPtrSetImplBase::empty(), llvm::SmallPtrSetImpl< PtrType >::erase(), F, and getBlockAccesses().
Referenced by verifyMemorySSA().
void MemorySSA::verifyMemorySSA | ( | VerificationLevel | VL = VerificationLevel::Fast | ) | const |
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right places).
This is used by unit tests.
Definition at line 1862 of file MemorySSA.cpp.
References F, Full, verifyDominationNumbers(), verifyOrderingDominationAndDefUses(), and verifyPrevDefInPhis().
Referenced by llvm::deleteDeadLoop(), llvm::hoistRegion(), injectPendingInvariantConditions(), mergeBlocksIntoPredecessors(), llvm::promoteLoopAccessesToScalars(), llvm::FunctionToLoopPassAdaptor::run(), llvm::LoopInstSimplifyPass::run(), llvm::LoopRotatePass::run(), llvm::SimpleLoopUnswitchPass::run(), llvm::LoopFlattenPass::run(), llvm::MemCpyOptPass::runImpl(), llvm::MemorySSAPrinterLegacyPass::runOnFunction(), simplifyLoopInst(), simplifyOneLoop(), llvm::sinkRegion(), llvm::splitBlockBefore(), turnGuardIntoBranch(), unswitchNontrivialInvariants(), unswitchTrivialBranch(), unswitchTrivialSwitch(), and llvm::MemorySSAWrapperPass::verifyAnalysis().
|
protected |
Verify ordering: the order and existence of MemoryAccesses matches the order and existence of memory affecting instructions.
Verify domination: each definition dominates all of its uses. Verify def-uses: the immediate use information - walk all the memory accesses and verifying that, for each use, it appears in the appropriate def's use list
Definition at line 1962 of file MemorySSA.cpp.
References assert(), B, llvm::SmallVectorTemplateCommon< T, typename >::begin(), llvm::MachineBasicBlock::begin(), llvm::SmallVectorImpl< T >::clear(), DL, dominates(), E, llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::MachineBasicBlock::end(), F, Full, getBlockAccesses(), getBlockDefs(), llvm::MemoryUseOrDef::getDefiningAccess(), llvm::MemoryPhi::getIncomingBlock(), llvm::MemoryPhi::getIncomingValue(), getMemoryAccess(), llvm::MemoryPhi::getNumIncomingValues(), llvm::User::getNumOperands(), I, llvm::is_contained(), llvm::pred_begin(), llvm::pred_end(), llvm::predecessors(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorBase< Size_T >::size(), llvm::MachineBasicBlock::size(), and llvm::Value::uses().
Referenced by verifyMemorySSA().
|
protected |
Definition at line 1885 of file MemorySSA.cpp.
References assert(), E, F, getBlockDefs(), llvm::MemoryPhi::getIncomingBlock(), llvm::MemoryPhi::getIncomingValue(), getMemoryAccess(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::MemoryPhi::getNumIncomingValues(), and I.
Referenced by verifyMemorySSA().
|
friend |
Definition at line 801 of file MemorySSA.h.
|
friend |
Definition at line 802 of file MemorySSA.h.