Represents a read-write access to memory, whether it is a must-alias, or a may-alias.
More...
|
| | DECLARE_TRANSPARENT_OPERAND_ACCESSORS (MemoryAccess) |
| | MemoryDef (LLVMContext &C, MemoryAccess *DMA, Instruction *MI, BasicBlock *BB, unsigned Ver) |
| void * | operator new (size_t S) |
| void | operator delete (void *Ptr) |
| void | setOptimized (MemoryAccess *MA) |
| MemoryAccess * | getOptimized () const |
| bool | isOptimized () const |
| void | resetOptimized () |
| LLVM_ABI void | print (raw_ostream &OS) const |
| unsigned | getID () const |
| void * | operator new (size_t)=delete |
| | DECLARE_TRANSPARENT_OPERAND_ACCESSORS (MemoryAccess) |
| Instruction * | getMemoryInst () const |
| | Get the instruction that this MemoryUse represents.
|
| MemoryAccess * | getDefiningAccess () const |
| | Get the access that produces the memory state used by this Use.
|
| bool | isOptimized () const |
| | Do we have an optimized use?
|
| MemoryAccess * | getOptimized () const |
| | Return the MemoryAccess associated with the optimized use, or nullptr.
|
| void | setOptimized (MemoryAccess *) |
| | Sets the optimized use for a MemoryDef.
|
| void | resetOptimized () |
| | Reset the ID of what this MemoryUse was optimized to, causing it to be rewalked by the walker if necessary.
|
| | MemoryAccess (const MemoryAccess &)=delete |
| MemoryAccess & | operator= (const MemoryAccess &)=delete |
| void * | operator new (size_t)=delete |
| BasicBlock * | getBlock () const |
| LLVM_ABI void | print (raw_ostream &OS) const |
| LLVM_ABI void | dump () const |
| memoryaccess_def_iterator | defs_begin () |
| | This iterator walks over all of the defs in a given MemoryAccess.
|
| const_memoryaccess_def_iterator | defs_begin () const |
| memoryaccess_def_iterator | defs_end () |
| const_memoryaccess_def_iterator | defs_end () const |
| AllAccessType::self_iterator | getIterator () |
| | Get the iterators for the all access list and the defs only list We default to the all access list.
|
| AllAccessType::const_self_iterator | getIterator () const |
| AllAccessType::reverse_self_iterator | getReverseIterator () |
| AllAccessType::const_reverse_self_iterator | getReverseIterator () const |
| DefsOnlyType::self_iterator | getDefsIterator () |
| DefsOnlyType::const_self_iterator | getDefsIterator () const |
| DefsOnlyType::reverse_self_iterator | getReverseDefsIterator () |
| DefsOnlyType::const_reverse_self_iterator | getReverseDefsIterator () const |
| | DerivedUser (Type *Ty, unsigned VK, AllocInfo AllocInfo, DeleteValueTy DeleteValue) |
| | User (const User &)=delete |
| LLVM_ABI void | operator delete (void *Usr) |
| | Free memory allocated for User and Use objects.
|
| void | operator delete (void *Usr, HungOffOperandsAllocMarker) |
| | Placement delete - required by std, called if the ctor throws.
|
| void | operator delete (void *Usr, IntrusiveOperandsAllocMarker) |
| | Placement delete - required by std, called if the ctor throws.
|
| void | operator delete (void *Usr, IntrusiveOperandsAndDescriptorAllocMarker) |
| | Placement delete - required by std, called if the ctor throws.
|
| const Use * | getOperandList () const |
| Use * | getOperandList () |
| Value * | getOperand (unsigned i) const |
| void | setOperand (unsigned i, Value *Val) |
| const Use & | getOperandUse (unsigned i) const |
| Use & | getOperandUse (unsigned i) |
| unsigned | getNumOperands () const |
| LLVM_ABI ArrayRef< const uint8_t > | getDescriptor () const |
| | Returns the descriptor co-allocated with this User instance.
|
| LLVM_ABI MutableArrayRef< uint8_t > | getDescriptor () |
| | Returns the descriptor co-allocated with this User instance.
|
| void | setNumHungOffUseOperands (unsigned NumOps) |
| | Subclasses with hung off uses need to manage the operand count themselves.
|
| LLVM_ABI bool | isDroppable () const |
| | A droppable user is a user for which uses can be dropped without affecting correctness and should be dropped rather than preventing a transformation from happening.
|
| op_iterator | op_begin () |
| const_op_iterator | op_begin () const |
| op_iterator | op_end () |
| const_op_iterator | op_end () const |
| op_range | operands () |
| const_op_range | operands () const |
| value_op_iterator | value_op_begin () |
| value_op_iterator | value_op_end () |
| iterator_range< value_op_iterator > | operand_values () |
| const_value_op_iterator | value_op_begin () const |
| const_value_op_iterator | value_op_end () const |
| iterator_range< const_value_op_iterator > | operand_values () const |
| void | dropAllReferences () |
| | Drop all references to operands.
|
| LLVM_ABI bool | replaceUsesOfWith (Value *From, Value *To) |
| | Replace uses of one Value with another.
|
| | Value (const Value &)=delete |
| Value & | operator= (const Value &)=delete |
| LLVM_ABI void | deleteValue () |
| | Delete a pointer to a generic Value.
|
| LLVM_ABI void | dump () const |
| | Support for debugging, callable in GDB: V->dump()
|
| Type * | getType () const |
| | All values are typed, get the type of this value.
|
| LLVM_ABI LLVMContext & | getContext () const |
| | All values hold a context through their type.
|
| bool | hasName () const |
| LLVM_ABI ValueName * | getValueName () const |
| LLVM_ABI void | setValueName (ValueName *VN) |
| LLVM_ABI StringRef | getName () const |
| | Return a constant reference to the value's name.
|
| LLVM_ABI void | setName (const Twine &Name) |
| | Change the name of the value.
|
| LLVM_ABI void | takeName (Value *V) |
| | Transfer the name from V to this value.
|
| LLVM_ABI std::string | getNameOrAsOperand () const |
| LLVM_ABI void | replaceAllUsesWith (Value *V) |
| | Change all uses of this to point to a new Value.
|
| LLVM_ABI void | replaceNonMetadataUsesWith (Value *V) |
| | Change non-metadata uses of this to point to a new Value.
|
| LLVM_ABI void | replaceUsesWithIf (Value *New, llvm::function_ref< bool(Use &U)> ShouldReplace) |
| | Go through the uses list for this definition and make each use point to "V" if the callback ShouldReplace returns true for the given Use.
|
| LLVM_ABI void | replaceUsesOutsideBlock (Value *V, BasicBlock *BB) |
| | replaceUsesOutsideBlock - Go through the uses list for this definition and make each use point to "V" instead of "this" when the use is outside the block.
|
| LLVM_ABI void | assertModuleIsMaterializedImpl () const |
| void | assertModuleIsMaterialized () const |
| bool | hasUseList () const |
| | Check if this Value has a use-list.
|
| bool | use_empty () const |
| bool | materialized_use_empty () const |
| use_iterator | materialized_use_begin () |
| const_use_iterator | materialized_use_begin () const |
| use_iterator | use_begin () |
| const_use_iterator | use_begin () const |
| use_iterator | use_end () |
| const_use_iterator | use_end () const |
| iterator_range< use_iterator > | materialized_uses () |
| iterator_range< const_use_iterator > | materialized_uses () const |
| iterator_range< use_iterator > | uses () |
| iterator_range< const_use_iterator > | uses () const |
| bool | user_empty () const |
| user_iterator | materialized_user_begin () |
| const_user_iterator | materialized_user_begin () const |
| user_iterator | user_begin () |
| const_user_iterator | user_begin () const |
| user_iterator | user_end () |
| const_user_iterator | user_end () const |
| User * | user_back () |
| const User * | user_back () const |
| iterator_range< user_iterator > | materialized_users () |
| iterator_range< const_user_iterator > | materialized_users () const |
| iterator_range< user_iterator > | users () |
| iterator_range< const_user_iterator > | users () const |
| bool | hasOneUse () const |
| | Return true if there is exactly one use of this value.
|
| LLVM_ABI bool | hasNUses (unsigned N) const |
| | Return true if this Value has exactly N uses.
|
| LLVM_ABI bool | hasNUsesOrMore (unsigned N) const |
| | Return true if this value has N uses or more.
|
| LLVM_ABI bool | hasOneUser () const |
| | Return true if there is exactly one user of this value.
|
| LLVM_ABI Use * | getSingleUndroppableUse () |
| | Return true if there is exactly one use of this value that cannot be dropped.
|
| const Use * | getSingleUndroppableUse () const |
| LLVM_ABI User * | getUniqueUndroppableUser () |
| | Return true if there is exactly one unique user of this value that cannot be dropped (that user can have multiple uses of this value).
|
| const User * | getUniqueUndroppableUser () const |
| LLVM_ABI bool | hasNUndroppableUses (unsigned N) const |
| | Return true if there this value.
|
| LLVM_ABI bool | hasNUndroppableUsesOrMore (unsigned N) const |
| | Return true if this value has N uses or more.
|
| LLVM_ABI void | dropDroppableUses (llvm::function_ref< bool(const Use *)> ShouldDrop=[](const Use *) { return true;}) |
| | Remove every uses that can safely be removed.
|
| LLVM_ABI void | dropDroppableUsesIn (User &Usr) |
| | Remove every use of this value in User that can safely be removed.
|
| LLVM_ABI bool | isUsedInBasicBlock (const BasicBlock *BB) const |
| | Check if this value is used in the specified basic block.
|
| LLVM_ABI unsigned | getNumUses () const |
| | This method computes the number of uses of this Value.
|
| void | addUse (Use &U) |
| | This method should only be used by the Use class.
|
| unsigned | getValueID () const |
| | Return an ID for the concrete type of this object.
|
| unsigned | getRawSubclassOptionalData () const |
| | Return the raw optional flags value contained in this value.
|
| void | clearSubclassOptionalData () |
| | Clear the optional flags contained in this value.
|
| bool | hasSameSubclassOptionalData (const Value *V) const |
| | Check the optional flags for equality.
|
| bool | hasValueHandle () const |
| | Return true if there is a value handle associated with this value.
|
| bool | isUsedByMetadata () const |
| | Return true if there is metadata referencing this value.
|
| LLVM_ABI bool | isSwiftError () const |
| | Return true if this value is a swifterror value.
|
| LLVM_ABI const Value * | stripPointerCasts () const |
| | Strip off pointer casts, all-zero GEPs and address space casts.
|
| Value * | stripPointerCasts () |
| LLVM_ABI const Value * | stripPointerCastsAndAliases () const |
| | Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
|
| Value * | stripPointerCastsAndAliases () |
| LLVM_ABI const Value * | stripPointerCastsSameRepresentation () const |
| | Strip off pointer casts, all-zero GEPs and address space casts but ensures the representation of the result stays the same.
|
| Value * | stripPointerCastsSameRepresentation () |
| LLVM_ABI const Value * | stripPointerCastsForAliasAnalysis () const |
| | Strip off pointer casts, all-zero GEPs, single-argument phi nodes and invariant group info.
|
| Value * | stripPointerCastsForAliasAnalysis () |
| LLVM_ABI const Value * | stripInBoundsConstantOffsets () const |
| | Strip off pointer casts and all-constant inbounds GEPs.
|
| Value * | stripInBoundsConstantOffsets () |
| LLVM_ABI const Value * | stripAndAccumulateConstantOffsets (const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const |
| | Accumulate the constant offset this value has compared to a base pointer.
|
| Value * | stripAndAccumulateConstantOffsets (const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) |
| const Value * | stripAndAccumulateInBoundsConstantOffsets (const DataLayout &DL, APInt &Offset) const |
| | This is a wrapper around stripAndAccumulateConstantOffsets with the in-bounds requirement set to false.
|
| Value * | stripAndAccumulateInBoundsConstantOffsets (const DataLayout &DL, APInt &Offset) |
| LLVM_ABI const Value * | stripInBoundsOffsets (function_ref< void(const Value *)> Func=[](const Value *) {}) const |
| | Strip off pointer casts and inbounds GEPs.
|
| Value * | stripInBoundsOffsets (function_ref< void(const Value *)> Func=[](const Value *) {}) |
| LLVM_ABI std::optional< int64_t > | getPointerOffsetFrom (const Value *Other, const DataLayout &DL) const |
| | If this ptr is provably equal to Other plus a constant offset, return that offset in bytes.
|
| LLVM_ABI bool | canBeFreed () const |
| | Return true if the memory object referred to by V can by freed in the scope for which the SSA value defining the allocation is statically defined.
|
| LLVM_ABI uint64_t | getPointerDereferenceableBytes (const DataLayout &DL, bool &CanBeNull, bool &CanBeFreed) const |
| | Returns the number of bytes known to be dereferenceable for the pointer value.
|
| LLVM_ABI Align | getPointerAlignment (const DataLayout &DL) const |
| | Returns an alignment of the pointer value.
|
| LLVM_ABI const Value * | DoPHITranslation (const BasicBlock *CurBB, const BasicBlock *PredBB) const |
| | Translate PHI node to its predecessor from the given basic block.
|
| Value * | DoPHITranslation (const BasicBlock *CurBB, const BasicBlock *PredBB) |
| void | mutateType (Type *Ty) |
| | Mutate the type of this Value to be of the specified type.
|
| template<class Compare> |
| void | sortUseList (Compare Cmp) |
| | Sort the use-list.
|
| LLVM_ABI void | reverseUseList () |
| | Reverse the use-list.
|
| LLVM_ABI void | print (raw_ostream &O, bool IsForDebug=false) const |
| | Implement operator<< on Value.
|
| LLVM_ABI void | print (raw_ostream &O, ModuleSlotTracker &MST, bool IsForDebug=false) const |
| LLVM_ABI void | printAsOperand (raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const |
| | Print the name of this Value out to the specified raw_ostream.
|
| LLVM_ABI void | printAsOperand (raw_ostream &O, bool PrintType, ModuleSlotTracker &MST) const |
| self_iterator | getIterator () |
| const_self_iterator | getIterator () const |
| reverse_self_iterator | getReverseIterator () |
| const_reverse_self_iterator | getReverseIterator () const |
| template<typename T = OptionsT> |
| std::enable_if_t< T::is_sentinel_tracking_explicit, bool > | isSentinel () const |
| | Check whether this is the sentinel node.
|
| const OptionsT::parent_ty * | getParent () const |
| void | setParent (OptionsT::parent_ty *Parent) |
|
| using | AllAccessType |
| using | DefsOnlyType |
| using | iterator = user_iterator |
| | The user iterators for a memory access.
|
| using | const_iterator = const_user_iterator |
| using | op_iterator = Use* |
| using | const_op_iterator = const Use* |
| using | op_range = iterator_range<op_iterator> |
| using | const_op_range = iterator_range<const_op_iterator> |
| enum | ValueTy |
| | Concrete subclass of this. More...
|
| using | use_iterator = use_iterator_impl<Use> |
| using | const_use_iterator = use_iterator_impl<const Use> |
| using | user_iterator = user_iterator_impl<User> |
| using | const_user_iterator = user_iterator_impl<const User> |
| static constexpr unsigned | MaxAlignmentExponent = 32 |
| | The maximum alignment for instructions.
|
| static constexpr uint64_t | MaximumAlignment = 1ULL << MaxAlignmentExponent |
| using | DeleteValueTy = void (*)(DerivedUser *) |
| enum | : unsigned { NumUserOperandsBits = 27
} |
| | The number of operands in the subclass. More...
|
| using | self_iterator = ilist_select_iterator_type<OptionsT, false, false> |
| using | const_self_iterator = ilist_select_iterator_type<OptionsT, false, true> |
| using | reverse_self_iterator |
| using | const_reverse_self_iterator |
| | MemoryUseOrDef (LLVMContext &C, MemoryAccess *DMA, unsigned Vty, DeleteValueTy DeleteValue, Instruction *MI, BasicBlock *BB, AllocInfo AllocInfo) |
| | ~MemoryUseOrDef ()=default |
| void | setDefiningAccess (MemoryAccess *DMA, bool Optimized=false) |
| void | setBlock (BasicBlock *BB) |
| | Used by MemorySSA to change the block of a MemoryAccess when it is moved.
|
| unsigned | getID () const |
| | Used for debugging and tracking things about MemoryAccesses.
|
| | MemoryAccess (LLVMContext &C, unsigned Vty, DeleteValueTy DeleteValue, BasicBlock *BB, AllocInfo AllocInfo) |
| | ~MemoryAccess ()=default |
| void * | operator new (size_t Size)=delete |
| LLVM_ABI void * | operator new (size_t Size, HungOffOperandsAllocMarker) |
| | Allocate a User with an operand pointer co-allocated.
|
| LLVM_ABI void * | operator new (size_t Size, IntrusiveOperandsAllocMarker allocTrait) |
| | Allocate a User with the operands co-allocated.
|
| LLVM_ABI void * | operator new (size_t Size, IntrusiveOperandsAndDescriptorAllocMarker allocTrait) |
| | Allocate a User with the operands co-allocated.
|
| | User (Type *ty, unsigned vty, AllocInfo AllocInfo) |
| LLVM_ABI void | allocHungoffUses (unsigned N, bool IsPhi=false) |
| | Allocate the array of Uses, followed by a pointer (with bottom bit set) to the User.
|
| LLVM_ABI void | growHungoffUses (unsigned N, bool IsPhi=false) |
| | Grow the number of hung off uses.
|
| | ~User ()=default |
| template<int Idx> |
| Use & | Op () |
| template<int Idx> |
| const Use & | Op () const |
| LLVM_ABI | Value (Type *Ty, unsigned scid) |
| LLVM_ABI | ~Value () |
| | Value's destructor should be virtual by design, but that would require that Value and all of its subclasses have a vtable that effectively duplicates the information in the value ID.
|
| LLVM_ABI void | getAllMetadata (SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const |
| | Appends all metadata attached to this value to MDs, sorting by KindID.
|
| bool | hasMetadata () const |
| | Return true if this value has any metadata attached to it.
|
| LLVM_ABI bool | eraseMetadata (unsigned KindID) |
| | Erase all metadata attachments with the given kind.
|
| LLVM_ABI void | eraseMetadataIf (function_ref< bool(unsigned, MDNode *)> Pred) |
| | Erase all metadata attachments matching the given predicate.
|
| LLVM_ABI void | clearMetadata () |
| | Erase all metadata attached to this Value.
|
| LLVM_ABI MDNode * | getMetadataImpl (unsigned KindID) const |
| | Get metadata for the given kind, if any.
|
| unsigned short | getSubclassDataFromValue () const |
| void | setValueSubclassData (unsigned short D) |
| MDNode * | getMetadata (unsigned KindID) const |
| | Get the current metadata attachments for the given kind, if any.
|
| LLVM_ABI MDNode * | getMetadata (StringRef Kind) const |
| LLVM_ABI void | getMetadata (unsigned KindID, SmallVectorImpl< MDNode * > &MDs) const |
| | Appends all attachments with the given ID to MDs in insertion order.
|
| LLVM_ABI void | getMetadata (StringRef Kind, SmallVectorImpl< MDNode * > &MDs) const |
| bool | hasMetadata (unsigned KindID) const |
| | Return true if this value has the given type of metadata attached.
|
| bool | hasMetadata (StringRef Kind) const |
| LLVM_ABI void | setMetadata (unsigned KindID, MDNode *Node) |
| | Set a particular kind of metadata attachment.
|
| LLVM_ABI void | setMetadata (StringRef Kind, MDNode *Node) |
| LLVM_ABI void | addMetadata (unsigned KindID, MDNode &MD) |
| | Add a metadata attachment.
|
| LLVM_ABI void | addMetadata (StringRef Kind, MDNode &MD) |
| | ilist_node_impl ()=default |
| template<int Idx, typename U> |
| static Use & | OpFrom (const U *that) |
| unsigned char | SubclassOptionalData: 7 |
| | Hold subclass data that can be dropped.
|
| unsigned | NumUserOperands: NumUserOperandsBits |
| unsigned | IsUsedByMD: 1 |
| unsigned | HasName: 1 |
| unsigned | HasMetadata: 1 |
| unsigned | HasHungOffUses: 1 |
| unsigned | HasDescriptor: 1 |
Represents a read-write access to memory, whether it is a must-alias, or a may-alias.
In particular, the set of Instructions that will be represented by MemoryDef's is exactly the set of Instructions for which AliasAnalysis::getModRefInfo returns "Mod" or "ModRef". Note that, in order to provide def-def chains, all defs also have a use associated with them. This use points to the nearest reaching MemoryDef/MemoryPhi.
Definition at line 371 of file MemorySSA.h.