138static bool isNewFormatTypeNode(
const MDNode *
N) {
139 if (
N->getNumOperands() < 3)
150template<
typename MDNodeTy>
152 MDNodeTy *Node =
nullptr;
155 TBAANodeImpl() =
default;
156 explicit TBAANodeImpl(MDNodeTy *
N) : Node(
N) {}
159 MDNodeTy *
getNode()
const {
return Node; }
163 bool isNewFormat()
const {
return isNewFormatTypeNode(Node); }
166 TBAANodeImpl<MDNodeTy>
getParent()
const {
170 if (Node->getNumOperands() < 2)
171 return TBAANodeImpl<MDNodeTy>();
174 return TBAANodeImpl<MDNodeTy>();
176 return TBAANodeImpl<MDNodeTy>(
P);
182 bool isTypeImmutable()
const {
183 if (Node->getNumOperands() < 3)
195using TBAANode = TBAANodeImpl<const MDNode>;
196using MutableTBAANode = TBAANodeImpl<MDNode>;
202template<
typename MDNodeTy>
203class TBAAStructTagNodeImpl {
208 explicit TBAAStructTagNodeImpl(MDNodeTy *
N) : Node(
N) {}
211 MDNodeTy *
getNode()
const {
return Node; }
215 bool isNewFormat()
const {
216 if (Node->getNumOperands() < 4)
219 if (!TBAANodeImpl<MDNodeTy>(AccessType).isNewFormat())
245 bool isTypeImmutable()
const {
246 unsigned OpNo = isNewFormat() ? 4 : 3;
247 if (Node->getNumOperands() < OpNo + 1)
259using TBAAStructTagNode = TBAAStructTagNodeImpl<const MDNode>;
260using MutableTBAAStructTagNode = TBAAStructTagNodeImpl<MDNode>;
266class TBAAStructTypeNode {
268 const MDNode *Node =
nullptr;
271 TBAAStructTypeNode() =
default;
272 explicit TBAAStructTypeNode(
const MDNode *
N) : Node(
N) {}
275 const MDNode *
getNode()
const {
return Node; }
279 bool isNewFormat()
const {
return isNewFormatTypeNode(Node); }
287 return Node->getOperand(isNewFormat() ? 2 : 0);
290 unsigned getNumFields()
const {
291 unsigned FirstFieldOpNo = isNewFormat() ? 3 : 1;
292 unsigned NumOpsPerField = isNewFormat() ? 3 : 2;
293 return (
getNode()->getNumOperands() - FirstFieldOpNo) / NumOpsPerField;
296 TBAAStructTypeNode getFieldType(
unsigned FieldIndex)
const {
297 unsigned FirstFieldOpNo = isNewFormat() ? 3 : 1;
298 unsigned NumOpsPerField = isNewFormat() ? 3 : 2;
299 unsigned OpIndex = FirstFieldOpNo + FieldIndex * NumOpsPerField;
301 return TBAAStructTypeNode(TypeNode);
306 TBAAStructTypeNode getField(uint64_t &
Offset)
const {
307 bool NewFormat = isNewFormat();
309 const unsigned NumOperands = Operands.
size();
314 return TBAAStructTypeNode();
318 return TBAAStructTypeNode();
322 if (NumOperands <= 3) {
330 return TBAAStructTypeNode();
331 return TBAAStructTypeNode(
P);
337 unsigned FirstFieldOpNo = NewFormat ? 3 : 1;
338 unsigned NumOpsPerField = NewFormat ? 3 : 2;
341 for (
unsigned Idx = FirstFieldOpNo; Idx < NumOperands;
342 Idx += NumOpsPerField) {
346 assert(Idx >= FirstFieldOpNo + NumOpsPerField &&
347 "TBAAStructTypeNode::getField should have an offset match!");
348 TheIdx = Idx - NumOpsPerField;
354 TheIdx = NumOperands - NumOpsPerField;
360 return TBAAStructTypeNode();
361 return TBAAStructTypeNode(
P);
379 if (!shouldUseTBAA())
391 if (!shouldUseTBAA())
394 const auto *
N =
Loc.AATags.TBAA;
400 const auto *ErrnoTBAAMD = M->getNamedMetadata(
"llvm.errno.tbaa");
401 if (!ErrnoTBAAMD ||
any_of(ErrnoTBAAMD->operands(), [&](
const auto *
Node) {
402 return Aliases(N, Node);
411 if (!shouldUseTBAA())
429 if (!shouldUseTBAA())
433 if (
const MDNode *M =
Call->getMetadata(LLVMContext::MD_tbaa))
449 if (!shouldUseTBAA())
453 if (
const MDNode *M =
Call->getMetadata(LLVMContext::MD_tbaa))
463 if (!shouldUseTBAA())
468 if (!Aliases(
M1, M2))
479 if (Tag1->getString() ==
"vtable pointer")
486 TBAAStructTagNode
Tag(
this);
487 TBAAStructTypeNode AccessType(
Tag.getAccessType());
489 if (Id->getString() ==
"vtable pointer")
495 const MDNode **GenericTag =
nullptr);
500 return const_cast<MDNode*
>(GenericTag);
512 while (TA.getNode()) {
513 if (!PathA.
insert(TA.getNode()))
520 while (TB.getNode()) {
521 if (!PathB.
insert(TB.getNode()))
526 int IA = PathA.
size() - 1;
527 int IB = PathB.
size() - 1;
529 const MDNode *Ret =
nullptr;
530 while (IA >= 0 && IB >= 0) {
531 if (PathA[IA] == PathB[IB])
545 Result.TBAAStruct =
nullptr;
555 Result.TBAA = Result.TBAAStruct =
nullptr;
572 if (TBAAStructTypeNode(AccessType).isNewFormat()) {
579 const_cast<MDNode*
>(AccessType),
580 OffsetNode, SizeNode};
585 const_cast<MDNode*
>(AccessType),
591 TBAAStructTypeNode FieldType) {
592 for (
unsigned I = 0,
E =
BaseType.getNumFields();
I !=
E; ++
I) {
593 TBAAStructTypeNode
T =
BaseType.getFieldType(
I);
608 TBAAStructTagNode SubobjectTag,
610 const MDNode **GenericTag,
614 if (BaseTag.getAccessType() == BaseTag.getBaseType() &&
615 BaseTag.getAccessType() == CommonType) {
627 bool NewFormat = BaseTag.isNewFormat();
628 TBAAStructTypeNode
BaseType(BaseTag.getBaseType());
629 uint64_t OffsetInBase = BaseTag.getOffset();
635 assert(!NewFormat &&
"Did not see access type in access path!");
639 if (
BaseType.getNode() == SubobjectTag.getBaseType()) {
640 MayAlias = OffsetInBase == SubobjectTag.getOffset() ||
641 BaseType.getNode() == BaseTag.getAccessType() ||
642 SubobjectTag.getBaseType() == SubobjectTag.getAccessType();
651 if (NewFormat &&
BaseType.getNode() == BaseTag.getAccessType())
664 TBAAStructTypeNode FieldType(SubobjectTag.getBaseType());
680 const MDNode **GenericTag) {
690 *GenericTag =
nullptr;
699 TBAAStructTagNode TagA(
A), TagB(
B);
701 TagB.getAccessType());
707 *GenericTag =
nullptr;
715 CommonType, GenericTag, MayAlias) ||
717 CommonType, GenericTag, MayAlias))
728bool TypeBasedAAResult::Aliases(
const MDNode *
A,
const MDNode *
B)
const {
732bool TypeBasedAAResult::shouldUseTBAA()
const {
807 ConstantInt::get(InnerOffset->
getType(), NewOffset)));
809 ConstantInt::get(InnerSize->
getType(), NewSize)));
825 TBAAStructTagNode
Tag(MD);
828 if (!
Tag.isNewFormat())
851 MDNode *M = New.TBAAStruct;
852 if (!New.TBAA && M && M->getNumOperands() >= 3 && M->getOperand(0) &&
861 New.TBAAStruct =
nullptr;
868 if (!
DL.typeSizeEqualsStoreSize(AccessTy))
871 if (
Size.isScalable())
874 return New.adjustForAccess(
Size.getKnownMinValue());
879 return New.adjustForAccess(AccessSize);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static const Function * getParent(const Value *V)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static MemAccessTy getAccessType(const TargetTransformInfo &TTI, Instruction *Inst, Value *OperandVal)
Return the type of the memory being accessed.
This file provides utility analysis objects describing memory locations.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static enum BaseType getBaseType(const Value *Val)
Return the baseType for Val which states whether Val is exclusively derived from constant/null,...
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file implements a set that has insertion order iteration characteristics.
static bool matchAccessTags(const MDNode *A, const MDNode *B, const MDNode **GenericTag=nullptr)
matchTags - Return true if the given couple of accesses are allowed to overlap.
static cl::opt< bool > EnableTBAA("enable-tbaa", cl::init(true), cl::Hidden)
static bool isStructPathTBAA(const MDNode *MD)
Check the first operand of the tbaa tag node, if it is a MDNode, we treat it as struct-path aware TBA...
static bool mayBeAccessToSubobjectOf(TBAAStructTagNode BaseTag, TBAAStructTagNode SubobjectTag, const MDNode *CommonType, const MDNode **GenericTag, bool &MayAlias)
Return true if for two given accesses, one of the accessed objects may be a subobject of the other.
static bool hasField(TBAAStructTypeNode BaseType, TBAAStructTypeNode FieldType)
static const MDNode * createAccessTag(const MDNode *AccessType)
static const MDNode * getLeastCommonType(const MDNode *A, const MDNode *B)
This is the interface for a metadata-based TBAA.
static unsigned getSize(unsigned Kind)
This class stores info we want to provide to or retain within an alias query.
The possible results of an alias query.
@ MayAlias
The two locations may or may not alias.
@ NoAlias
The two locations do not alias at all.
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This is the shared class of boolean and integer constants.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
bool equalsInt(uint64_t V) const
A helper method that can be used to determine if the constant contained within is equal to a constant...
const APInt & getValue() const
Return the constant as an APInt value reference.
A parsed version of the target data layout string in and methods for querying it.
ImmutablePass class - This class is used to provide information that does not need to be run.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
static LLVM_ABI MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
LLVM_ABI bool isTBAAVtableAccess() const
Check whether MDNode is a vtable access.
static LLVM_ABI MDNode * getMostGenericTBAA(MDNode *A, MDNode *B)
const MDOperand & getOperand(unsigned I) const
static LLVM_ABI MDNode * getMostGenericNoaliasAddrspace(MDNode *A, MDNode *B)
ArrayRef< MDOperand > operands() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
LLVM_ABI MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
static LLVM_ABI MDNode * intersect(MDNode *A, MDNode *B)
LLVMContext & getContext() const
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
Representation for a specific memory location.
AAMDNodes AATags
The metadata nodes which describes the aliasing of the location (each member is null if that kind of ...
A Module instance is used to store all the information related to an LLVM module.
size_type size() const
Determine the number of elements in the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
A SetVector that performs no allocations if smaller than a certain size.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A simple AA result that uses TBAA metadata to answer queries.
LLVM_ABI AliasResult aliasErrno(const MemoryLocation &Loc, const Module *M)
LLVM_ABI AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI, const Instruction *CtxI)
LLVM_ABI ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool IgnoreLocals)
LLVM_ABI ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI)
LLVM_ABI MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI)
Legacy wrapper pass to provide the TypeBasedAAResult object.
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
bool doInitialization(Module &M) override
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
LLVM_ABI TypeBasedAAResult run(Function &F, FunctionAnalysisManager &AM)
The instances of the Type class are immutable: once they are created, they are never changed.
Type * getType() const
All values are typed, get the type of this value.
initializer< Ty > init(const Ty &Val)
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 * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
This is an optimization pass for GlobalISel generic memory operations.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
unsigned M1(unsigned Val)
auto dyn_cast_or_null(const Y &Val)
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
@ Sub
Subtraction of integers.
LLVM_ABI ImmutablePass * createTypeBasedAAWrapperPass()
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI AAMDNodes concat(const AAMDNodes &Other) const
Determine the best AAMDNodes after concatenating two different locations together.
static LLVM_ABI MDNode * shiftTBAAStruct(MDNode *M, size_t off)
MDNode * NoAliasAddrSpace
The tag specifying the noalias address spaces.
MDNode * Scope
The tag for alias scope specification (used with noalias).
static LLVM_ABI 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...
LLVM_ABI 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.
LLVM_ABI AAMDNodes adjustForAccess(unsigned AccessSize)
Create a new AAMDNode for accessing AccessSize bytes of this AAMDNode.
static LLVM_ABI MDNode * shiftTBAA(MDNode *M, size_t off)
A special type used by analysis passes to provide an address that identifies that particular analysis...