LLVM  14.0.0git
Public Member Functions | List of all members
llvm::MemorySSAUpdater Class Reference

#include "llvm/Analysis/MemorySSAUpdater.h"

Public Member Functions

 MemorySSAUpdater (MemorySSA *MSSA)
 
void insertDef (MemoryDef *Def, bool RenameUses=false)
 Insert a definition into the MemorySSA IR. More...
 
void insertUse (MemoryUse *Use, bool RenameUses=false)
 
void removeEdge (BasicBlock *From, BasicBlock *To)
 Update the MemoryPhi in To following an edge deletion between From and To. More...
 
void removeDuplicatePhiEdgesBetween (const BasicBlock *From, const BasicBlock *To)
 Update the MemoryPhi in To to have a single incoming edge from From, following a CFG change that replaced multiple edges (switch) with a direct branch. More...
 
void updatePhisWhenInsertingUniqueBackedgeBlock (BasicBlock *LoopHeader, BasicBlock *LoopPreheader, BasicBlock *BackedgeBlock)
 Update MemorySSA when inserting a unique backedge block for a loop. More...
 
void updateForClonedLoop (const LoopBlocksRPO &LoopBlocks, ArrayRef< BasicBlock * > ExitBlocks, const ValueToValueMapTy &VM, bool IgnoreIncomingWithNoClones=false)
 Update MemorySSA after a loop was cloned, given the blocks in RPO order, the exit blocks and a 1:1 mapping of all blocks and instructions cloned. More...
 
void updateForClonedBlockIntoPred (BasicBlock *BB, BasicBlock *P1, const ValueToValueMapTy &VM)
 
void updateExitBlocksForClonedLoop (ArrayRef< BasicBlock * > ExitBlocks, const ValueToValueMapTy &VMap, DominatorTree &DT)
 Update phi nodes in exit block successors following cloning. More...
 
void updateExitBlocksForClonedLoop (ArrayRef< BasicBlock * > ExitBlocks, ArrayRef< std::unique_ptr< ValueToValueMapTy >> VMaps, DominatorTree &DT)
 
void applyUpdates (ArrayRef< CFGUpdate > Updates, DominatorTree &DT, bool UpdateDTFirst=false)
 Apply CFG updates, analogous with the DT edge updates. More...
 
void applyInsertUpdates (ArrayRef< CFGUpdate > Updates, DominatorTree &DT)
 Apply CFG insert updates, analogous with the DT edge updates. More...
 
void moveBefore (MemoryUseOrDef *What, MemoryUseOrDef *Where)
 
void moveAfter (MemoryUseOrDef *What, MemoryUseOrDef *Where)
 
void moveToPlace (MemoryUseOrDef *What, BasicBlock *BB, MemorySSA::InsertionPlace Where)
 
void moveAllAfterSpliceBlocks (BasicBlock *From, BasicBlock *To, Instruction *Start)
 From block was spliced into From and To. More...
 
void moveAllAfterMergeBlocks (BasicBlock *From, BasicBlock *To, Instruction *Start)
 From block was merged into To. More...
 
void wireOldPredecessorsToNewImmediatePredecessor (BasicBlock *Old, BasicBlock *New, ArrayRef< BasicBlock * > Preds, bool IdenticalEdgesWereMerged=true)
 A new empty BasicBlock (New) now branches directly to Old. More...
 
MemoryAccesscreateMemoryAccessInBB (Instruction *I, MemoryAccess *Definition, const BasicBlock *BB, MemorySSA::InsertionPlace Point)
 Create a MemoryAccess in MemorySSA at a specified point in a block, with a specified clobbering definition. More...
 
MemoryUseOrDefcreateMemoryAccessBefore (Instruction *I, MemoryAccess *Definition, MemoryUseOrDef *InsertPt)
 Create a MemoryAccess in MemorySSA before or after an existing MemoryAccess. More...
 
MemoryUseOrDefcreateMemoryAccessAfter (Instruction *I, MemoryAccess *Definition, MemoryAccess *InsertPt)
 
void removeMemoryAccess (MemoryAccess *, bool OptimizePhis=false)
 Remove a MemoryAccess from MemorySSA, including updating all definitions and uses. More...
 
void removeMemoryAccess (const Instruction *I, bool OptimizePhis=false)
 Remove MemoryAccess for a given instruction, if a MemoryAccess exists. More...
 
void removeBlocks (const SmallSetVector< BasicBlock *, 8 > &DeadBlocks)
 Remove all MemoryAcceses in a set of BasicBlocks about to be deleted. More...
 
void changeToUnreachable (const Instruction *I)
 Instruction I will be changed to an unreachable. More...
 
MemorySSAgetMemorySSA () const
 Get handle on MemorySSA. More...
 

Detailed Description

Definition at line 56 of file MemorySSAUpdater.h.

Constructor & Destructor Documentation

◆ MemorySSAUpdater()

llvm::MemorySSAUpdater::MemorySSAUpdater ( MemorySSA MSSA)
inline

Definition at line 68 of file MemorySSAUpdater.h.

Member Function Documentation

◆ applyInsertUpdates()

void MemorySSAUpdater::applyInsertUpdates ( ArrayRef< CFGUpdate Updates,
DominatorTree DT 
)

Apply CFG insert updates, analogous with the DT edge updates.

Definition at line 860 of file MemorySSAUpdater.cpp.

Referenced by applyUpdates(), and unswitchTrivialBranch().

◆ applyUpdates()

void MemorySSAUpdater::applyUpdates ( ArrayRef< CFGUpdate Updates,
DominatorTree DT,
bool  UpdateDTFirst = false 
)

Apply CFG updates, analogous with the DT edge updates.

By default, the DT is assumed to be already up to date. If UpdateDTFirst is true, first update the DT with the same updates.

Definition at line 809 of file MemorySSAUpdater.cpp.

References applyInsertUpdates(), llvm::DominatorTreeBase< NodeT, IsPostDom >::applyUpdates(), llvm::DominatorTreeBase< NodeT, IsPostDom >::Delete, llvm::pdb::Empty, llvm::DominatorTreeBase< NodeT, IsPostDom >::Insert, and removeEdge().

Referenced by llvm::splitBlockBefore(), and unswitchTrivialSwitch().

◆ changeToUnreachable()

void MemorySSAUpdater::changeToUnreachable ( const Instruction I)

Instruction I will be changed to an unreachable.

Remove all accesses in I's block that follow I (inclusive), and update the Phis in the blocks' successors.

Definition at line 1412 of file MemorySSAUpdater.cpp.

References BB, llvm::MemorySSA::getMemoryAccess(), I, removeDuplicatePhiEdgesBetween(), removeMemoryAccess(), llvm::Successor, and llvm::successors().

Referenced by llvm::changeToUnreachable().

◆ createMemoryAccessAfter()

MemoryUseOrDef * MemorySSAUpdater::createMemoryAccessAfter ( Instruction I,
MemoryAccess Definition,
MemoryAccess InsertPt 
)

◆ createMemoryAccessBefore()

MemoryUseOrDef * MemorySSAUpdater::createMemoryAccessBefore ( Instruction I,
MemoryAccess Definition,
MemoryUseOrDef InsertPt 
)

Create a MemoryAccess in MemorySSA before or after an existing MemoryAccess.

Returns the new MemoryAccess. This should be called when a memory instruction is created that is being used to replace an existing memory instruction. It will not create PHI nodes, or verify the clobbering definition.

Note: If a MemoryAccess already exists for I, this function will make it inaccessible and it must have removeMemoryAccess called on it.

Definition at line 1441 of file MemorySSAUpdater.cpp.

References assert(), llvm::MemorySSA::createDefinedAccess(), llvm::MemoryAccess::getBlock(), llvm::MemoryAccess::getIterator(), I, and llvm::MemorySSA::insertIntoListsBefore().

◆ createMemoryAccessInBB()

MemoryAccess * MemorySSAUpdater::createMemoryAccessInBB ( Instruction I,
MemoryAccess Definition,
const BasicBlock BB,
MemorySSA::InsertionPlace  Point 
)

Create a MemoryAccess in MemorySSA at a specified point in a block, with a specified clobbering definition.

Returns the new MemoryAccess. This should be called when a memory instruction is created that is being used to replace an existing memory instruction. It will not create PHI nodes, or verify the clobbering definition. The insertion place is used solely to determine where in the memoryssa access lists the instruction will be placed. The caller is expected to keep ordering the same as instructions. It will return the new MemoryAccess. Note: If a MemoryAccess already exists for I, this function will make it inaccessible and it must have removeMemoryAccess called on it.

Definition at line 1433 of file MemorySSAUpdater.cpp.

References BB, llvm::MemorySSA::createDefinedAccess(), I, and llvm::MemorySSA::insertIntoListsForBlock().

Referenced by buildPartialInvariantUnswitchConditionalBranch(), cloneInstructionInExitBlock(), llvm::promoteLoopAccessesToScalars(), and sinkInstruction().

◆ getMemorySSA()

MemorySSA* llvm::MemorySSAUpdater::getMemorySSA ( ) const
inline

◆ insertDef()

void MemorySSAUpdater::insertDef ( MemoryDef Def,
bool  RenameUses = false 
)

Insert a definition into the MemorySSA IR.

RenameUses will rename any use below the new def block (and any inserted phis). RenameUses should be set to true if the definition may cause new aliases for loads below it. This is not the case for hoisting or sinking or other forms of code movement. It is the case for straight code insertion. For example: store a if (foo) { } load a

Moving the store into the if block, and calling insertDef, does not require RenameUses. However, changing it to: store a if (foo) { store b } load a Where a mayalias b, does require RenameUses be set to true.

Definition at line 314 of file MemorySSAUpdater.cpp.

References llvm::SmallVectorImpl< T >::append(), llvm::simple_ilist< T, Options >::begin(), llvm::IDFCalculatorBase< NodeTy, IsPostDom >::calculate(), llvm::SmallVectorImpl< T >::clear(), llvm::MemoryAccess::getBlock(), llvm::MemoryUseOrDef::getDefiningAccess(), llvm::MemorySSA::getDomTree(), llvm::MemorySSA::getMemoryAccess(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::Use::getUser(), llvm::MemorySSA::getWritableBlockDefs(), llvm::SmallSet< T, N, C >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::is_contained(), llvm::predecessors(), llvm::MemorySSA::renamePass(), llvm::Value::replaceUsesWithIf(), llvm::MemoryUseOrDef::setDefiningAccess(), llvm::IDFCalculatorBase< NodeTy, IsPostDom >::setDefiningBlocks(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::size().

Referenced by cloneInstructionInExitBlock(), and sinkInstruction().

◆ insertUse()

void MemorySSAUpdater::insertUse ( MemoryUse Use,
bool  RenameUses = false 
)

◆ moveAfter()

void MemorySSAUpdater::moveAfter ( MemoryUseOrDef What,
MemoryUseOrDef Where 
)

◆ moveAllAfterMergeBlocks()

void MemorySSAUpdater::moveAllAfterMergeBlocks ( BasicBlock From,
BasicBlock To,
Instruction Start 
)

From block was merged into To.

There is a CFG edge from To to From.To still branches to From, but all instructions were moved and From is now an empty block; From is about to be deleted. Move all accesses from From to To starting at instruction Start. To may have multiple successors, From has a single predecessor. From may have successors with MPhi nodes, replace their incoming block with To. |---—| |---—|

To To
=>

\/ | | |---—| | | <- Start | From | | | |---—| |---—|

Definition at line 1262 of file MemorySSAUpdater.cpp.

◆ moveAllAfterSpliceBlocks()

void MemorySSAUpdater::moveAllAfterSpliceBlocks ( BasicBlock From,
BasicBlock To,
Instruction Start 
)

From block was spliced into From and To.

There is a CFG edge from From to To. Move all accesses from From to To starting at instruction Start. To is newly created BB, so empty of MemorySSA::MemoryAccesses. Edges are already updated, so successors of To with MPhi nodes need to update incoming block. |---—| |---—|

From From

| | => \/ | | |---—| <- Start | | | To | |---—| |---—|

Definition at line 1251 of file MemorySSAUpdater.cpp.

Referenced by SplitBlockImpl(), and turnGuardIntoBranch().

◆ moveBefore()

void MemorySSAUpdater::moveBefore ( MemoryUseOrDef What,
MemoryUseOrDef Where 
)

◆ moveToPlace()

void MemorySSAUpdater::moveToPlace ( MemoryUseOrDef What,
BasicBlock BB,
MemorySSA::InsertionPlace  Where 
)

◆ removeBlocks()

void MemorySSAUpdater::removeBlocks ( const SmallSetVector< BasicBlock *, 8 > &  DeadBlocks)

Remove all MemoryAcceses in a set of BasicBlocks about to be deleted.

Assumption we make here: all uses of deleted defs and phi must either occur in blocks about to be deleted (thus will be deleted as well), or they occur in phis that will simply lose an incoming value. Deleted blocks still have successor info, but their predecessor edges and Phi nodes may already be updated. Instructions in DeadBlocks should be deleted after this call.

Definition at line 1376 of file MemorySSAUpdater.cpp.

References assert(), BB, llvm::User::dropAllReferences(), llvm::MemorySSA::getMemoryAccess(), llvm::MemorySSA::getWritableBlockAccesses(), llvm::make_early_inc_range(), llvm::MemorySSA::removeFromLists(), llvm::MemorySSA::removeFromLookups(), and llvm::successors().

Referenced by deleteDeadBlocksFromLoop(), deleteDeadClonedBlocks(), and llvm::removeUnreachableBlocks().

◆ removeDuplicatePhiEdgesBetween()

void MemorySSAUpdater::removeDuplicatePhiEdgesBetween ( const BasicBlock From,
const BasicBlock To 
)

Update the MemoryPhi in To to have a single incoming edge from From, following a CFG change that replaced multiple edges (switch) with a direct branch.

Definition at line 538 of file MemorySSAUpdater.cpp.

References B, From, and llvm::MemorySSA::getMemoryAccess().

Referenced by changeToUnreachable(), and unswitchNontrivialInvariants().

◆ removeEdge()

void MemorySSAUpdater::removeEdge ( BasicBlock From,
BasicBlock To 
)

Update the MemoryPhi in To following an edge deletion between From and To.

If To becomes unreachable, a call to removeBlocks should be made.

Definition at line 531 of file MemorySSAUpdater.cpp.

References From, and llvm::MemorySSA::getMemoryAccess().

Referenced by applyUpdates(), unswitchNontrivialInvariants(), and unswitchTrivialBranch().

◆ removeMemoryAccess() [1/2]

void llvm::MemorySSAUpdater::removeMemoryAccess ( const Instruction I,
bool  OptimizePhis = false 
)
inline

Remove MemoryAccess for a given instruction, if a MemoryAccess exists.

This should be called when an instruction (load/store) is deleted from the program.

Definition at line 224 of file MemorySSAUpdater.h.

References llvm::MemorySSA::getMemoryAccess(), I, and removeMemoryAccess().

◆ removeMemoryAccess() [2/2]

void MemorySSAUpdater::removeMemoryAccess ( MemoryAccess MA,
bool  OptimizePhis = false 
)

◆ updateExitBlocksForClonedLoop() [1/2]

void MemorySSAUpdater::updateExitBlocksForClonedLoop ( ArrayRef< BasicBlock * >  ExitBlocks,
ArrayRef< std::unique_ptr< ValueToValueMapTy >>  VMaps,
DominatorTree DT 
)

Definition at line 795 of file MemorySSAUpdater.cpp.

References I.

◆ updateExitBlocksForClonedLoop() [2/2]

void MemorySSAUpdater::updateExitBlocksForClonedLoop ( ArrayRef< BasicBlock * >  ExitBlocks,
const ValueToValueMapTy VMap,
DominatorTree DT 
)

Update phi nodes in exit block successors following cloning.

Exit blocks that were not cloned don't have additional predecessors added.

Definition at line 787 of file MemorySSAUpdater.cpp.

References llvm::sys::path::begin(), and llvm::sys::path::end().

Referenced by unswitchNontrivialInvariants().

◆ updateForClonedBlockIntoPred()

void MemorySSAUpdater::updateForClonedBlockIntoPred ( BasicBlock BB,
BasicBlock P1,
const ValueToValueMapTy VM 
)

Definition at line 756 of file MemorySSAUpdater.cpp.

References BB, and llvm::MemorySSA::getMemoryAccess().

◆ updateForClonedLoop()

void MemorySSAUpdater::updateForClonedLoop ( const LoopBlocksRPO LoopBlocks,
ArrayRef< BasicBlock * >  ExitBlocks,
const ValueToValueMapTy VM,
bool  IgnoreIncomingWithNoClones = false 
)

Update MemorySSA after a loop was cloned, given the blocks in RPO order, the exit blocks and a 1:1 mapping of all blocks and instructions cloned.

This involves duplicating all defs and uses in the cloned blocks Updating phi nodes in exit block successors is done separately.

Definition at line 676 of file MemorySSAUpdater.cpp.

References assert(), BB, llvm::SmallPtrSetImpl< PtrType >::count(), E, llvm::MemoryPhi::getIncomingBlock(), llvm::MemoryPhi::getIncomingValue(), llvm::MemorySSA::getMemoryAccess(), llvm::MemoryPhi::getNumIncomingValues(), llvm::MemorySSA::getWritableBlockAccesses(), llvm::MemorySSA::isLiveOnEntryDef(), llvm::ValueMap< KeyT, ValueT, Config >::lookup(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::lookup(), onlySingleValue(), llvm::pred_begin(), llvm::pred_end(), ProcessBlock(), and removeMemoryAccess().

Referenced by unswitchNontrivialInvariants().

◆ updatePhisWhenInsertingUniqueBackedgeBlock()

void MemorySSAUpdater::updatePhisWhenInsertingUniqueBackedgeBlock ( BasicBlock LoopHeader,
BasicBlock LoopPreheader,
BasicBlock BackedgeBlock 
)

Update MemorySSA when inserting a unique backedge block for a loop.

Definition at line 637 of file MemorySSAUpdater.cpp.

References E, llvm::MemorySSA::getMemoryAccess(), and I.

Referenced by insertUniqueBackedgeBlock().

◆ wireOldPredecessorsToNewImmediatePredecessor()

void MemorySSAUpdater::wireOldPredecessorsToNewImmediatePredecessor ( BasicBlock Old,
BasicBlock New,
ArrayRef< BasicBlock * >  Preds,
bool  IdenticalEdgesWereMerged = true 
)

A new empty BasicBlock (New) now branches directly to Old.

Some of Old's predecessors (Preds) are now branching to New instead of Old. If New is the only predecessor, move Old's Phi, if present, to New. Otherwise, add a new Phi in New with appropriate incoming values, and update the incoming values in Old's Phi node too, if present.

Definition at line 1272 of file MemorySSAUpdater.cpp.

References llvm::MemoryPhi::addIncoming(), assert(), B, llvm::ArrayRef< T >::begin(), llvm::MemorySSA::Beginning, llvm::SmallPtrSetImpl< PtrType >::count(), llvm::ArrayRef< T >::empty(), llvm::ArrayRef< T >::end(), llvm::MemorySSA::getMemoryAccess(), llvm::MemorySSA::getWritableBlockAccesses(), llvm::BasicBlock::hasNPredecessors(), llvm::MemorySSA::moveTo(), llvm::pred_size(), llvm::SmallPtrSetImplBase::size(), llvm::ArrayRef< T >::size(), and llvm::MemoryPhi::unorderedDeleteIncomingIf().

Referenced by UpdateAnalysisInformation().


The documentation for this class was generated from the following files: