15#ifndef LLVM_IR_METADATA_H
16#define LLVM_IR_METADATA_H
44class ModuleSlotTracker;
47template <
typename T>
class StringMapEntry;
48template <
typename ValueTy>
class StringMapEntryStorage;
66 const unsigned char SubclassID;
81#define HANDLE_METADATA_LEAF(CLASS) CLASS##Kind,
82#include "llvm/IR/Metadata.def"
88 static_assert(
sizeof(*this) == 8,
"Metadata fields poorly packed");
125 bool IsForDebug =
false)
const;
127 bool IsForDebug =
false)
const;
139 const Module *M =
nullptr)
const;
148 return reinterpret_cast<Metadata**
>(MDs);
151#define HANDLE_METADATA(CLASS) class CLASS;
152#include "llvm/IR/Metadata.def"
156#define HANDLE_METADATA_LEAF(CLASS) \
157 template <> struct isa_impl<CLASS, Metadata> { \
158 static inline bool doit(const Metadata &MD) { \
159 return MD.getMetadataID() == Metadata::CLASS##Kind; \
162#include "llvm/IR/Metadata.def"
185 void dropUse() { MD =
nullptr; }
196 return V->getValueID() == MetadataAsValueVal;
200 void handleChangedMetadata(
Metadata *MD);
226 retrackDebugValue(
X);
238 retrackDebugValue(
X);
272 void trackDebugValue();
273 void untrackDebugValue();
341 return retrack(&MD, *MD, &New);
377 assert(UseMap.
empty() &&
"Cannot destroy in-use replaceable metadata");
402 void dropRef(
void *
Ref);
403 void moveRef(
void *
Ref,
void *New,
const Metadata &MD);
417 static bool isReplaceable(
const Metadata &MD);
442 assert(V &&
"Expected valid value");
451 return cast<ConstantAsMetadata>(
get(
C));
455 return cast<LocalAsMetadata>(
get(Local));
461 return cast_or_null<ConstantAsMetadata>(
getIfExists(
C));
465 return cast_or_null<LocalAsMetadata>(
getIfExists(Local));
528 assert(!isa<Constant>(Local) &&
"Expected local value");
603 template <
class U,
class V>
608 sizeof(hasDereference<T, Result>(
nullptr)) ==
sizeof(
Yes);
611 static const bool value = std::is_base_of<Constant, V>::value &&
615 static const bool value = std::is_base_of<Constant, V>::value &&
616 std::is_convertible<M, const Metadata &>::value;
625template <
class X,
class Y>
626inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
bool>
628 assert(MD &&
"Null pointer sent into hasa");
629 if (
auto *V = dyn_cast<ConstantAsMetadata>(MD))
630 return isa<X>(V->getValue());
633template <
class X,
class Y>
634inline std::enable_if_t<detail::IsValidReference<X, Y &>::value,
bool>
642template <
class X,
class Y>
643inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
645 return cast<X>(cast<ConstantAsMetadata>(MD)->getValue());
647template <
class X,
class Y>
648inline std::enable_if_t<detail::IsValidReference<X, Y &>::value,
X *>
657template <
class X,
class Y>
658inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
660 if (
auto *V = cast_or_null<ConstantAsMetadata>(MD))
661 return cast<X>(V->getValue());
670template <
class X,
class Y>
671inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
673 if (
auto *V = dyn_cast<ConstantAsMetadata>(MD))
674 return dyn_cast<X>(V->getValue());
683template <
class X,
class Y>
684inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
686 if (
auto *V = dyn_cast_or_null<ConstantAsMetadata>(MD))
687 return dyn_cast<X>(V->getValue());
750 explicit operator bool()
const {
797 Result.Scope =
Scope;
812 Result.Scope =
Scope;
832 nullptr,
nullptr,
nullptr);
837 nullptr,
nullptr,
nullptr);
882 return isa<MDString>(this->
get()) &&
883 cast<MDString>(this->
get())->getString() == Str;
914 assert(
static_cast<void *
>(
this) == &MD &&
"Expected same address");
942 std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses)
958 return isa<ReplaceableMetadataImpl *>(
Ptr);
964 return *cast<LLVMContext *>(
Ptr);
969 return cast<ReplaceableMetadataImpl *>(
Ptr);
986 assert(ReplaceableUses &&
"Expected non-null replaceable uses");
988 "Expected same context");
990 Ptr = ReplaceableUses.release();
998 std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses(
1000 Ptr = &ReplaceableUses->getContext();
1001 return ReplaceableUses;
1009#define HANDLE_MDNODE_LEAF(CLASS) \
1010 using Temp##CLASS = std::unique_ptr<CLASS, TempMDNodeDeleter>;
1011#define HANDLE_MDNODE_BRANCH(CLASS) HANDLE_MDNODE_LEAF(CLASS)
1012#include "llvm/IR/Metadata.def"
1048 struct alignas(alignof(size_t)) Header {
1049 bool IsResizable : 1;
1051 size_t SmallSize : 4;
1052 size_t SmallNumOps : 4;
1053 size_t :
sizeof(size_t) * CHAR_BIT - 10;
1055 unsigned NumUnresolved = 0;
1058 static constexpr size_t NumOpsFitInVector =
1059 sizeof(LargeStorageVector) /
sizeof(
MDOperand);
1061 NumOpsFitInVector *
sizeof(
MDOperand) ==
sizeof(LargeStorageVector),
1062 "sizeof(LargeStorageVector) must be a multiple of sizeof(MDOperand)");
1064 static constexpr size_t MaxSmallSize = 15;
1066 static constexpr size_t getOpSize(
unsigned NumOps) {
1071 static size_t getSmallSize(
size_t NumOps,
bool IsResizable,
bool IsLarge) {
1072 return IsLarge ? NumOpsFitInVector
1073 : std::max(NumOps, NumOpsFitInVector * IsResizable);
1078 getSmallSize(NumOps, isResizable(
Storage), isLarge(NumOps))) +
1084 static bool isLarge(
size_t NumOps) {
return NumOps > MaxSmallSize; }
1087 return getOpSize(SmallSize) +
sizeof(Header);
1089 void *getAllocation() {
1090 return reinterpret_cast<char *
>(
this + 1) -
1094 void *getLargePtr()
const {
1095 static_assert(
alignof(LargeStorageVector) <=
alignof(Header),
1096 "LargeStorageVector too strongly aligned");
1097 return reinterpret_cast<char *
>(
const_cast<Header *
>(
this)) -
1098 sizeof(LargeStorageVector);
1101 void *getSmallPtr();
1103 LargeStorageVector &getLarge() {
1105 return *
reinterpret_cast<LargeStorageVector *
>(getLargePtr());
1108 const LargeStorageVector &getLarge()
const {
1110 return *
reinterpret_cast<const LargeStorageVector *
>(getLargePtr());
1113 void resizeSmall(
size_t NumOps);
1114 void resizeSmallToLarge(
size_t NumOps);
1115 void resize(
size_t NumOps);
1120 MutableArrayRef<MDOperand> operands() {
1124 reinterpret_cast<MDOperand *
>(
this) - SmallSize, SmallNumOps);
1127 ArrayRef<MDOperand> operands()
const {
1130 return ArrayRef(
reinterpret_cast<const MDOperand *
>(
this) - SmallSize,
1134 unsigned getNumOperands()
const {
1137 return getLarge().size();
1141 Header &getHeader() {
return *(
reinterpret_cast<Header *
>(
this) - 1); }
1143 const Header &getHeader()
const {
1144 return *(
reinterpret_cast<const Header *
>(
this) - 1);
1147 ContextAndReplaceableUses Context;
1151 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = std::nullopt);
1155 void operator delete(
void *Mem);
1181 void *
operator new(size_t) =
delete;
1192 TempMDNode
clone()
const;
1229 if (
Context.hasReplaceableUses())
1230 Context.getReplaceableUses()->replaceAllUsesWith(MD);
1249 static std::enable_if_t<std::is_base_of<MDNode, T>::value,
T *>
1251 return cast<T>(
N.release()->replaceWithPermanentImpl());
1261 static std::enable_if_t<std::is_base_of<MDNode, T>::value,
T *>
1263 return cast<T>(
N.release()->replaceWithUniquedImpl());
1271 static std::enable_if_t<std::is_base_of<MDNode, T>::value,
T *>
1273 return cast<T>(
N.release()->replaceWithDistinctImpl());
1285 const Module *M =
nullptr)
const;
1302 MDNode *replaceWithPermanentImpl();
1303 MDNode *replaceWithUniquedImpl();
1304 MDNode *replaceWithDistinctImpl();
1316 template <
class T,
class StoreT>
1325 assert(!
isUniqued() &&
"Resizing is not supported for uniqued nodes");
1327 "Resizing is not supported for this node kind");
1328 getHeader().resize(NumOps);
1332 void handleChangedOperand(
void *
Ref,
Metadata *New);
1335 void dropReplaceableUses();
1338 void decrementUnresolvedOperandCount();
1339 void countUnresolvedOperands();
1352 void makeDistinct();
1354 void deleteAsSubclass();
1356 void eraseFromStore();
1358 template <
class NodeTy>
struct HasCachedHash;
1359 template <
class NodeTy>
1360 static void dispatchRecalculateHash(NodeTy *
N, std::true_type) {
1361 N->recalculateHash();
1363 template <
class NodeTy>
1364 static void dispatchRecalculateHash(NodeTy *, std::false_type) {}
1365 template <
class NodeTy>
1366 static void dispatchResetHash(NodeTy *
N, std::true_type) {
1369 template <
class NodeTy>
1370 static void dispatchResetHash(NodeTy *, std::false_type) {}
1373 static MDNode *mergeDirectCallProfMetadata(MDNode *
A, MDNode *
B,
1374 const Instruction *AInstr,
1375 const Instruction *BInstr);
1393 return getHeader().operands()[
I];
1404#define HANDLE_MDNODE_LEAF(CLASS) \
1407#include "llvm/IR/Metadata.def"
1446 void recalculateHash();
1448 static MDTuple *getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
1451 TempMDTuple cloneImpl()
const {
1487 TempMDTuple
clone()
const {
return cloneImpl(); }
1540 if (
Node->getNumOperands() < 2)
1542 return dyn_cast_or_null<MDNode>(
Node->getOperand(1));
1545 if (
Node->getNumOperands() > 2)
1546 if (
MDString *
N = dyn_cast_or_null<MDString>(
Node->getOperand(2)))
1547 return N->getString();
1600 std::enable_if_t<std::is_convertible<U *, T *>::value> * =
nullptr)
1606 std::enable_if_t<!std::is_convertible<U *, T *>::value> * =
nullptr)
1617 unsigned size()
const {
return N ?
N->getNumOperands() : 0u; }
1618 bool empty()
const {
return N ?
N->getNumOperands() == 0 :
true; }
1628#define HANDLE_METADATA(CLASS) \
1629 using CLASS##Array = MDTupleTypedArrayWrapper<CLASS>;
1630#include "llvm/IR/Metadata.def"
1680 assert(!
Use &&
"Use is still being tracked despite being untracked!");
1697 Module *Parent =
nullptr;
1700 void setParent(
Module *M) { Parent = M; }
1704 template <
class T1,
class T2>
class op_iterator_impl {
1713 using iterator_category = std::bidirectional_iterator_tag;
1714 using value_type = T2;
1715 using difference_type = std::ptrdiff_t;
1716 using pointer = value_type *;
1717 using reference = value_type &;
1719 op_iterator_impl() =
default;
1721 bool operator==(
const op_iterator_impl &o)
const {
return Idx == o.Idx; }
1722 bool operator!=(
const op_iterator_impl &o)
const {
return Idx !=
o.Idx; }
1724 op_iterator_impl &operator++() {
1729 op_iterator_impl operator++(
int) {
1730 op_iterator_impl tmp(*
this);
1741 op_iterator_impl tmp(*
this);
1772 bool IsForDebug =
false)
const;
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
bool operator==(const HTTPRequest &A, const HTTPRequest &B)
mir Rename Register Operands
Machine Check Debug Module
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
This file defines the PointerUnion class, which is a discriminated union of pointer types.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
AliasScopeNode(const MDNode *N)
const MDNode * getNode() const
Get the MDNode for this AliasScopeNode.
const MDNode * getDomain() const
Get the MDNode for this AliasScopeNode's domain.
StringRef getName() const
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This is an important base class in LLVM.
Pointer to the context, with optional RAUW support.
ContextAndReplaceableUses & operator=(const ContextAndReplaceableUses &)=delete
ReplaceableMetadataImpl * getReplaceableUses() const
std::unique_ptr< ReplaceableMetadataImpl > takeReplaceableUses()
Drop RAUW support.
ContextAndReplaceableUses & operator=(ContextAndReplaceableUses &&)=delete
ReplaceableMetadataImpl * getOrCreateReplaceableUses()
Ensure that this has RAUW support, and then return it.
void makeReplaceable(std::unique_ptr< ReplaceableMetadataImpl > ReplaceableUses)
Assign RAUW support to this.
ContextAndReplaceableUses(ContextAndReplaceableUses &&)=delete
ContextAndReplaceableUses(const ContextAndReplaceableUses &)=delete
LLVMContext & getContext() const
~ContextAndReplaceableUses()
bool hasReplaceableUses() const
Whether this contains RAUW support.
ContextAndReplaceableUses()=delete
ContextAndReplaceableUses(LLVMContext &Context)
ContextAndReplaceableUses(std::unique_ptr< ReplaceableMetadataImpl > ReplaceableUses)
Record of a variable value-assignment, aka a non instruction representation of the dbg....
This class represents an Operation in the Expression.
Base class for tracking ValueAsMetadata/DIArgLists with user lookups and Owner callbacks outside of V...
void resetDebugValue(Metadata *DebugValue)
DebugValueUser(const DebugValueUser &X)
DebugValueUser & operator=(DebugValueUser &&X)
bool operator!=(const DebugValueUser &X) const
bool operator==(const DebugValueUser &X) const
void handleChangedValue(Metadata *NewDebugValue)
DebugValueUser & operator=(const DebugValueUser &X)
DebugValueUser(Metadata *DebugValue)
DebugValueUser(DebugValueUser &&X)
Placeholder metadata for operands of distinct MDNodes.
void replaceUseWith(Metadata *MD)
Replace the use of this with MD.
DistinctMDOperandPlaceholder()=delete
~DistinctMDOperandPlaceholder()
DistinctMDOperandPlaceholder(const DistinctMDOperandPlaceholder &)=delete
DistinctMDOperandPlaceholder(unsigned ID)
DistinctMDOperandPlaceholder(DistinctMDOperandPlaceholder &&)=delete
This is an important class for using LLVM in a threaded context.
static MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
void printTree(raw_ostream &OS, const Module *M=nullptr) const
Print in tree shape.
void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
iterator_range< MDOperand * > mutable_op_range
void resolveCycles()
Resolve cycles.
bool isTBAAVtableAccess() const
Check whether MDNode is a vtable access.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
mutable_op_range mutable_operands()
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
static MDNode * concatenate(MDNode *A, MDNode *B)
Methods for metadata merging.
static void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
void resolve()
Resolve a unique, unresolved node.
static MDNode * getMostGenericTBAA(MDNode *A, MDNode *B)
const MDOperand & getOperand(unsigned I) const
void storeDistinctInContext()
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
ArrayRef< MDOperand > operands() const
op_iterator op_end() const
MDNode(const MDNode &)=delete
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithDistinct(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a distinct one.
static MDNode * getMergedProfMetadata(MDNode *A, MDNode *B, const Instruction *AInstr, const Instruction *BInstr)
Merge !prof metadata from two instructions.
static bool classof(const Metadata *MD)
Methods for support type inquiry through isa, cast, and dyn_cast:
static MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
void setNumUnresolved(unsigned N)
void resize(size_t NumOps)
Resize the node to hold NumOps operands.
unsigned getNumOperands() const
Return number of MDNode operands.
MDOperand * mutable_begin()
TempMDNode clone() const
Create a (temporary) clone of this.
static MDNode * getMostGenericRange(MDNode *A, MDNode *B)
bool isReplaceable() const
void setOperand(unsigned I, Metadata *New)
Set an operand.
MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2=std::nullopt)
bool isResolved() const
Check if node is fully resolved.
op_iterator op_begin() const
static MDNode * intersect(MDNode *A, MDNode *B)
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
LLVMContext & getContext() const
MDOperand * mutable_end()
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithPermanent(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a permanent one.
void operator=(const MDNode &)=delete
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithUniqued(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a uniqued one.
void dumpTree() const
User-friendly dump in tree shape.
static MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
unsigned getNumUnresolved() const
Tracking metadata reference owned by Metadata.
bool equalsStr(StringRef Str) const
void reset(Metadata *MD, Metadata *Owner)
Metadata * operator->() const
MDOperand & operator=(const MDOperand &)=delete
Metadata & operator*() const
MDOperand(const MDOperand &)=delete
MDOperand & operator=(MDOperand &&Op)
MDOperand(MDOperand &&Op)
unsigned getLength() const
const unsigned char * bytes_begin() const
MDString(const MDString &)=delete
static MDString * get(LLVMContext &Context, const char *Str)
MDString & operator=(MDString &&)=delete
static bool classof(const Metadata *MD)
Methods for support type inquiry through isa, cast, and dyn_cast.
const unsigned char * bytes_end() const
iterator begin() const
Pointer to the first byte of the string.
MDString & operator=(const MDString &)=delete
StringRef getString() const
iterator end() const
Pointer to one byte past the end of the string.
static MDString * get(LLVMContext &Context, StringRef Str)
Typed, array-like tuple of metadata.
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t<!std::is_convertible< U *, T * >::value > *=nullptr)
MDTupleTypedArrayWrapper()=default
MDTupleTypedArrayWrapper(const MDTuple *N)
T * operator[](unsigned I) const
MDTuple * operator->() const
MDTuple & operator*() const
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t< std::is_convertible< U *, T * >::value > *=nullptr)
TypedMDOperandIterator< T > iterator
TempMDTuple clone() const
Return a (temporary) clone of this.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
static bool classof(const Metadata *MD)
void push_back(Metadata *MD)
Append an element to the tuple. This will resize the node.
unsigned getHash() const
Get the hash, if any.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
void pop_back()
Shrink the operands by 1.
Manage lifetime of a slot tracker for printing IR.
A Module instance is used to store all the information related to an LLVM module.
const_op_iterator op_begin() const
NamedMDNode(const NamedMDNode &)=delete
op_iterator_impl< MDNode *, MDNode > op_iterator
void setOperand(unsigned I, MDNode *New)
StringRef getName() const
void dropAllReferences()
Remove all uses and clear node vector.
void print(raw_ostream &ROS, bool IsForDebug=false) const
void eraseFromParent()
Drop all references and remove the node from parent module.
const_op_iterator op_end() const
iterator_range< const_op_iterator > operands() const
MDNode * getOperand(unsigned i) const
unsigned getNumOperands() const
const Module * getParent() const
void clearOperands()
Drop all references to this node's operands.
iterator_range< op_iterator > operands()
op_iterator_impl< const MDNode *, MDNode > const_op_iterator
Module * getParent()
Get the module that holds this named metadata collection.
void addOperand(MDNode *M)
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMapEntryStorage - Holds the value in a StringMapEntry.
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
StringRef - Represent a constant reference to a string, i.e.
const unsigned char * bytes_end() const
constexpr size_t size() const
size - Get the string size.
const unsigned char * bytes_begin() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
Typed iterator through MDNode operands.
TypedMDOperandIterator operator++(int)
std::ptrdiff_t difference_type
TypedMDOperandIterator()=default
std::input_iterator_tag iterator_category
bool operator==(const TypedMDOperandIterator &X) const
TypedMDOperandIterator & operator++()
TypedMDOperandIterator(MDNode::op_iterator I)
bool operator!=(const TypedMDOperandIterator &X) const
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
struct LLVMOpaqueNamedMDNode * LLVMNamedMDNodeRef
Represents an LLVM Named Metadata Node.
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
This file defines the ilist_node class template, which is a convenient base class for creating classe...
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ArchKind & operator--(ArchKind &Kind)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract_or_null(Y &&MD)
Extract a Value from Metadata, if any, allowing null.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
This is an optimization pass for GlobalISel generic memory operations.
APInt operator*(APInt a, uint64_t RHS)
bool operator!=(uint64_t V1, const APInt &V2)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
@ Ref
The access may reference the value stored in memory.
Attribute unwrap(LLVMAttributeRef Attr)
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::optional< APInt > getAllocSize(const CallBase *CB, const TargetLibraryInfo *TLI, function_ref< const Value *(const Value *)> Mapper=[](const Value *V) { return V;})
Return the size of the requested allocation.
const uint64_t NOMORE_ICP_MAGICNUM
Magic number in the value profile metadata showing a target has been promoted for the instruction and...
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
AAMDNodes concat(const AAMDNodes &Other) const
Determine the best AAMDNodes after concatenating two different locations together.
static MDNode * shiftTBAAStruct(MDNode *M, size_t off)
bool operator!=(const AAMDNodes &A) const
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
MDNode * Scope
The tag for alias scope specification (used with noalias).
static MDNode * extendToTBAA(MDNode *TBAA, ssize_t len)
MDNode * TBAA
The tag for type-based alias analysis.
AAMDNodes shift(size_t Offset) const
Create a new AAMDNode that describes this AAMDNode after applying a constant offset to the start of t...
AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
MDNode * NoAlias
The tag specifying the noalias scope.
AAMDNodes intersect(const AAMDNodes &Other) const
Given two sets of AAMDNodes that apply to the same pointer, give the best AAMDNodes that are compatib...
AAMDNodes(MDNode *T, MDNode *TS, MDNode *S, MDNode *N)
AAMDNodes extendTo(ssize_t Len) const
Create a new AAMDNode that describes this AAMDNode after extending it to apply to a series of bytes o...
bool operator==(const AAMDNodes &A) const
static MDNode * shiftTBAA(MDNode *M, size_t off)
static AAMDNodes getEmptyKey()
static unsigned getHashValue(const AAMDNodes &Val)
static AAMDNodes getTombstoneKey()
static bool isEqual(const AAMDNodes &LHS, const AAMDNodes &RHS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
void operator()(MDNode *Node) const
static No & hasDereference(...)
static Yes & hasDereference(SFINAE< sizeof(static_cast< V >(*make< U >()))> *=0)
static SimpleType getSimplifiedValue(MDOperand &MD)
static SimpleType getSimplifiedValue(const MDOperand &MD)
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...