137static bool isNewFormatTypeNode(
const MDNode *
N) {
138 if (
N->getNumOperands() < 3)
141 if (!isa<MDNode>(
N->getOperand(0)))
149template<
typename MDNodeTy>
151 MDNodeTy *
Node =
nullptr;
154 TBAANodeImpl() =
default;
155 explicit TBAANodeImpl(MDNodeTy *
N) :
Node(
N) {}
162 bool isNewFormat()
const {
return isNewFormatTypeNode(
Node); }
165 TBAANodeImpl<MDNodeTy>
getParent()
const {
167 return TBAANodeImpl(cast<MDNodeTy>(
Node->getOperand(0)));
169 if (
Node->getNumOperands() < 2)
170 return TBAANodeImpl<MDNodeTy>();
171 MDNodeTy *
P = dyn_cast_or_null<MDNodeTy>(
Node->getOperand(1));
173 return TBAANodeImpl<MDNodeTy>();
175 return TBAANodeImpl<MDNodeTy>(
P);
181 bool isTypeImmutable()
const {
182 if (
Node->getNumOperands() < 3)
184 ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(
Node->getOperand(2));
194using TBAANode = TBAANodeImpl<const MDNode>;
195using MutableTBAANode = TBAANodeImpl<MDNode>;
201template<
typename MDNodeTy>
202class TBAAStructTagNodeImpl {
207 explicit TBAAStructTagNodeImpl(MDNodeTy *
N) :
Node(
N) {}
214 bool isNewFormat()
const {
215 if (
Node->getNumOperands() < 4)
218 if (!TBAANodeImpl<MDNodeTy>(AccessType).isNewFormat())
224 return dyn_cast_or_null<MDNode>(
Node->getOperand(0));
228 return dyn_cast_or_null<MDNode>(
Node->getOperand(1));
232 return mdconst::extract<ConstantInt>(
Node->getOperand(2))->getZExtValue();
238 return mdconst::extract<ConstantInt>(
Node->getOperand(3))->getZExtValue();
244 bool isTypeImmutable()
const {
245 unsigned OpNo = isNewFormat() ? 4 : 3;
246 if (
Node->getNumOperands() < OpNo + 1)
248 ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(
Node->getOperand(OpNo));
258using TBAAStructTagNode = TBAAStructTagNodeImpl<const MDNode>;
259using MutableTBAAStructTagNode = TBAAStructTagNodeImpl<MDNode>;
265class TBAAStructTypeNode {
270 TBAAStructTypeNode() =
default;
271 explicit TBAAStructTypeNode(
const MDNode *
N) :
Node(
N) {}
278 bool isNewFormat()
const {
return isNewFormatTypeNode(
Node); }
286 return Node->getOperand(isNewFormat() ? 2 : 0);
289 unsigned getNumFields()
const {
290 unsigned FirstFieldOpNo = isNewFormat() ? 3 : 1;
291 unsigned NumOpsPerField = isNewFormat() ? 3 : 2;
292 return (
getNode()->getNumOperands() - FirstFieldOpNo) / NumOpsPerField;
295 TBAAStructTypeNode getFieldType(
unsigned FieldIndex)
const {
296 unsigned FirstFieldOpNo = isNewFormat() ? 3 : 1;
297 unsigned NumOpsPerField = isNewFormat() ? 3 : 2;
298 unsigned OpIndex = FirstFieldOpNo + FieldIndex * NumOpsPerField;
300 return TBAAStructTypeNode(TypeNode);
306 bool NewFormat = isNewFormat();
308 const unsigned NumOperands =
Operands.size();
313 return TBAAStructTypeNode();
317 return TBAAStructTypeNode();
321 if (NumOperands <= 3) {
325 : mdconst::extract<ConstantInt>(
Operands[2])->getZExtValue();
329 return TBAAStructTypeNode();
330 return TBAAStructTypeNode(
P);
336 unsigned FirstFieldOpNo = NewFormat ? 3 : 1;
337 unsigned NumOpsPerField = NewFormat ? 3 : 2;
340 for (
unsigned Idx = FirstFieldOpNo;
Idx < NumOperands;
341 Idx += NumOpsPerField) {
343 mdconst::extract<ConstantInt>(
Operands[
Idx + 1])->getZExtValue();
345 assert(
Idx >= FirstFieldOpNo + NumOpsPerField &&
346 "TBAAStructTypeNode::getField should have an offset match!");
347 TheIdx =
Idx - NumOpsPerField;
353 TheIdx = NumOperands - NumOpsPerField;
355 mdconst::extract<ConstantInt>(
Operands[TheIdx + 1])->getZExtValue();
359 return TBAAStructTypeNode();
360 return TBAAStructTypeNode(
P);
378 if (!shouldUseTBAA())
391 if (!shouldUseTBAA())
409 if (!shouldUseTBAA())
413 if (
const MDNode *M = Call->getMetadata(LLVMContext::MD_tbaa))
429 if (!shouldUseTBAA())
433 if (
const MDNode *M = Call->getMetadata(LLVMContext::MD_tbaa))
443 if (!shouldUseTBAA())
448 if (!Aliases(
M1, M2))
459 if (Tag1->getString() ==
"vtable pointer")
466 TBAAStructTagNode
Tag(
this);
467 TBAAStructTypeNode AccessType(
Tag.getAccessType());
468 if(
auto *Id = dyn_cast<MDString>(AccessType.getId()))
469 if (Id->getString() ==
"vtable pointer")
475 const MDNode **GenericTag =
nullptr);
480 return const_cast<MDNode*
>(GenericTag);
492 while (TA.getNode()) {
493 if (!PathA.
insert(TA.getNode()))
500 while (TB.getNode()) {
501 if (!PathB.
insert(TB.getNode()))
506 int IA = PathA.
size() - 1;
507 int IB = PathB.
size() - 1;
509 const MDNode *Ret =
nullptr;
510 while (IA >= 0 && IB >= 0) {
511 if (PathA[IA] == PathB[IB])
525 Result.TBAAStruct =
nullptr;
535 Result.TBAA = Result.TBAAStruct =
nullptr;
552 if (TBAAStructTypeNode(AccessType).isNewFormat()) {
559 const_cast<MDNode*
>(AccessType),
560 OffsetNode, SizeNode};
565 const_cast<MDNode*
>(AccessType),
571 TBAAStructTypeNode FieldType) {
572 for (
unsigned I = 0, E =
BaseType.getNumFields();
I != E; ++
I) {
573 TBAAStructTypeNode
T =
BaseType.getFieldType(
I);
588 TBAAStructTagNode SubobjectTag,
590 const MDNode **GenericTag,
594 if (BaseTag.getAccessType() == BaseTag.getBaseType() &&
595 BaseTag.getAccessType() == CommonType) {
607 bool NewFormat = BaseTag.isNewFormat();
608 TBAAStructTypeNode
BaseType(BaseTag.getBaseType());
609 uint64_t OffsetInBase = BaseTag.getOffset();
615 assert(!NewFormat &&
"Did not see access type in access path!");
619 if (
BaseType.getNode() == SubobjectTag.getBaseType()) {
620 MayAlias = OffsetInBase == SubobjectTag.getOffset() ||
621 BaseType.getNode() == BaseTag.getAccessType() ||
622 SubobjectTag.getBaseType() == SubobjectTag.getAccessType();
631 if (NewFormat &&
BaseType.getNode() == BaseTag.getAccessType())
644 TBAAStructTypeNode FieldType(SubobjectTag.getBaseType());
660 const MDNode **GenericTag) {
670 *GenericTag =
nullptr;
679 TBAAStructTagNode TagA(
A), TagB(
B);
681 TagB.getAccessType());
687 *GenericTag =
nullptr;
695 CommonType, GenericTag, MayAlias) ||
697 CommonType, GenericTag, MayAlias))
708bool TypeBasedAAResult::Aliases(
const MDNode *
A,
const MDNode *
B)
const {
712bool TypeBasedAAResult::shouldUseTBAA()
const {
773 mdconst::extract<ConstantInt>(MD->
getOperand(i + 1));
787 ConstantInt::get(InnerOffset->
getType(), NewOffset)));
789 ConstantInt::get(InnerSize->
getType(), NewSize)));
805 TBAAStructTagNode
Tag(MD);
808 if (!
Tag.isNewFormat())
818 ConstantInt *PreviousSize = mdconst::extract<ConstantInt>(NextNodes[3]);
831 MDNode *M = New.TBAAStruct;
832 if (!New.TBAA && M && M->getNumOperands() >= 3 && M->getOperand(0) &&
833 mdconst::hasa<ConstantInt>(M->getOperand(0)) &&
834 mdconst::extract<ConstantInt>(M->getOperand(0))->isZero() &&
835 M->getOperand(1) && mdconst::hasa<ConstantInt>(M->getOperand(1)) &&
836 mdconst::extract<ConstantInt>(M->getOperand(1))->getValue() ==
838 M->getOperand(2) && isa<MDNode>(M->getOperand(2)))
839 New.TBAA = cast<MDNode>(M->getOperand(2));
841 New.TBAAStruct =
nullptr;
848 if (!
DL.typeSizeEqualsStoreSize(AccessTy))
851 if (
Size.isScalable())
854 return New.adjustForAccess(
Size.getKnownMinValue());
859 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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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
std::optional< std::vector< StOtherPiece > > Other
static MemAccessTy getAccessType(const TargetTransformInfo &TTI, Instruction *Inst, Value *OperandVal)
Return the type of the memory being accessed.
mir Rename Register Operands
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,...
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.
A container for analyses that lazily runs them and caches their results.
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),...
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.
static LLVM_ABI MDNode * intersect(MDNode *A, MDNode *B)
LLVMContext & getContext() const
static MemoryEffectsBase none()
Create MemoryEffectsBase that cannot read or write any memory.
static MemoryEffectsBase unknown()
Create MemoryEffectsBase that can read and write any memory.
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 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)
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.
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
unsigned M1(unsigned Val)
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
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()
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
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...