125 using namespace llvm;
136 static bool isNewFormatTypeNode(
const MDNode *
N) {
148 template<
typename MDNodeTy>
150 MDNodeTy *Node =
nullptr;
153 TBAANodeImpl() =
default;
154 explicit TBAANodeImpl(MDNodeTy *N) : Node(N) {}
157 MDNodeTy *getNode()
const {
return Node; }
161 bool isNewFormat()
const {
return isNewFormatTypeNode(Node); }
164 TBAANodeImpl<MDNodeTy>
getParent()
const {
166 return TBAANodeImpl(cast<MDNodeTy>(Node->getOperand(0)));
168 if (Node->getNumOperands() < 2)
169 return TBAANodeImpl<MDNodeTy>();
170 MDNodeTy *
P = dyn_cast_or_null<MDNodeTy>(Node->getOperand(1));
172 return TBAANodeImpl<MDNodeTy>();
174 return TBAANodeImpl<MDNodeTy>(
P);
180 bool isTypeImmutable()
const {
181 if (Node->getNumOperands() < 3)
183 ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Node->getOperand(2));
193 using TBAANode = TBAANodeImpl<const MDNode>;
194 using MutableTBAANode = TBAANodeImpl<MDNode>;
200 template<
typename MDNodeTy>
201 class TBAAStructTagNodeImpl {
206 explicit TBAAStructTagNodeImpl(MDNodeTy *N) : Node(N) {}
209 MDNodeTy *getNode()
const {
return Node; }
213 bool isNewFormat()
const {
214 if (Node->getNumOperands() < 4)
217 if (!TBAANodeImpl<MDNodeTy>(AccessType).isNewFormat())
223 return dyn_cast_or_null<MDNode>(Node->getOperand(0));
227 return dyn_cast_or_null<MDNode>(Node->getOperand(1));
231 return mdconst::extract<ConstantInt>(Node->getOperand(2))->getZExtValue();
234 uint64_t getSize()
const {
237 return mdconst::extract<ConstantInt>(Node->getOperand(3))->getZExtValue();
243 bool isTypeImmutable()
const {
244 unsigned OpNo = isNewFormat() ? 4 : 3;
245 if (Node->getNumOperands() < OpNo + 1)
247 ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Node->getOperand(OpNo));
257 using TBAAStructTagNode = TBAAStructTagNodeImpl<const MDNode>;
258 using MutableTBAAStructTagNode = TBAAStructTagNodeImpl<MDNode>;
264 class TBAAStructTypeNode {
266 const MDNode *Node =
nullptr;
269 TBAAStructTypeNode() =
default;
270 explicit TBAAStructTypeNode(
const MDNode *N) : Node(N) {}
273 const MDNode *getNode()
const {
return Node; }
277 bool isNewFormat()
const {
return isNewFormatTypeNode(Node); }
279 bool operator==(
const TBAAStructTypeNode &Other)
const {
280 return getNode() == Other.getNode();
285 return Node->
getOperand(isNewFormat() ? 2 : 0);
288 unsigned getNumFields()
const {
289 unsigned FirstFieldOpNo = isNewFormat() ? 3 : 1;
290 unsigned NumOpsPerField = isNewFormat() ? 3 : 2;
291 return (getNode()->getNumOperands() - FirstFieldOpNo) / NumOpsPerField;
294 TBAAStructTypeNode getFieldType(
unsigned FieldIndex)
const {
295 unsigned FirstFieldOpNo = isNewFormat() ? 3 : 1;
296 unsigned NumOpsPerField = isNewFormat() ? 3 : 2;
297 unsigned OpIndex = FirstFieldOpNo + FieldIndex * NumOpsPerField;
298 auto *TypeNode = cast<MDNode>(getNode()->getOperand(OpIndex));
299 return TBAAStructTypeNode(TypeNode);
304 TBAAStructTypeNode getField(uint64_t &
Offset)
const {
305 bool NewFormat = isNewFormat();
309 return TBAAStructTypeNode();
313 return TBAAStructTypeNode();
320 : mdconst::extract<ConstantInt>(Node->
getOperand(2))
325 return TBAAStructTypeNode();
326 return TBAAStructTypeNode(P);
332 unsigned FirstFieldOpNo = NewFormat ? 3 : 1;
333 unsigned NumOpsPerField = NewFormat ? 3 : 2;
336 Idx += NumOpsPerField) {
337 uint64_t Cur = mdconst::extract<ConstantInt>(Node->
getOperand(Idx + 1))
340 assert(Idx >= FirstFieldOpNo + NumOpsPerField &&
341 "TBAAStructTypeNode::getField should have an offset match!");
342 TheIdx = Idx - NumOpsPerField;
349 uint64_t Cur = mdconst::extract<ConstantInt>(Node->
getOperand(TheIdx + 1))
354 return TBAAStructTypeNode();
355 return TBAAStructTypeNode(P);
443 if (!Aliases(M1, M2))
451 if (getNumOperands() < 1)
453 if (
MDString *Tag1 = dyn_cast<MDString>(getOperand(0))) {
454 if (Tag1->getString() ==
"vtable pointer")
461 TBAAStructTagNode
Tag(
this);
462 TBAAStructTypeNode AccessType(Tag.getAccessType());
463 if(
auto *
Id = dyn_cast<MDString>(AccessType.getId()))
464 if (
Id->getString() ==
"vtable pointer")
470 const MDNode **GenericTag =
nullptr);
475 return const_cast<MDNode*
>(GenericTag);
487 while (TA.getNode()) {
488 if (PathA.
count(TA.getNode()))
490 PathA.
insert(TA.getNode());
496 while (TB.getNode()) {
497 if (PathB.
count(TB.getNode()))
499 PathB.
insert(TB.getNode());
503 int IA = PathA.
size() - 1;
504 int IB = PathB.
size() - 1;
507 while (IA >= 0 && IB >= 0) {
508 if (PathA[IA] == PathB[IB])
548 if (TBAAStructTypeNode(AccessType).isNewFormat()) {
555 const_cast<MDNode*>(AccessType),
556 OffsetNode, SizeNode};
561 const_cast<MDNode*>(AccessType),
567 TBAAStructTypeNode FieldType) {
568 for (
unsigned I = 0,
E = BaseType.getNumFields();
I !=
E; ++
I) {
569 TBAAStructTypeNode
T = BaseType.getFieldType(
I);
570 if (T == FieldType ||
hasField(T, FieldType))
584 TBAAStructTagNode SubobjectTag,
586 const MDNode **GenericTag,
590 if (BaseTag.getAccessType() == BaseTag.getBaseType() &&
591 BaseTag.getAccessType() == CommonType) {
603 bool NewFormat = BaseTag.isNewFormat();
604 TBAAStructTypeNode
BaseType(BaseTag.getBaseType());
605 uint64_t OffsetInBase = BaseTag.getOffset();
611 assert(!NewFormat &&
"Did not see access type in access path!");
615 if (
BaseType.getNode() == SubobjectTag.getBaseType()) {
616 bool SameMemberAccess = OffsetInBase == SubobjectTag.getOffset();
618 *GenericTag = SameMemberAccess ? SubobjectTag.getNode() :
621 MayAlias = SameMemberAccess;
626 if (NewFormat &&
BaseType.getNode() == BaseTag.getAccessType())
639 TBAAStructTypeNode FieldType(SubobjectTag.getBaseType());
655 const MDNode **GenericTag) {
665 *GenericTag =
nullptr;
674 TBAAStructTagNode TagA(A), TagB(B);
676 TagB.getAccessType());
682 *GenericTag =
nullptr;
690 CommonType, GenericTag, MayAlias) ||
692 CommonType, GenericTag, MayAlias))
703 bool TypeBasedAAResult::Aliases(
const MDNode *A,
const MDNode *B)
const {
static const MDNode * createAccessTag(const MDNode *AccessType)
The access neither references nor modifies the value stored in memory.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
MDNode * Scope
The tag for alias scope specification (used with noalias).
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
This class represents lattice values for constants.
MDNode * TBAA
The tag for type-based alias analysis.
size_type size() const
Determine the number of elements in the SetVector.
A Module instance is used to store all the information related to an LLVM module. ...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal)
static MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
The two locations do not alias at all.
FunctionModRefBehavior getModRefBehavior(const CallBase *Call)
static enum BaseType getBaseType(const Value *Val)
Return the baseType for Val which states whether Val is exclusively derived from constant/null, or not exclusively derived from constant.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB)
const MDOperand & getOperand(unsigned I) const
void initializeTypeBasedAAWrapperPassPass(PassRegistry &)
TypeBasedAAResult run(Function &F, FunctionAnalysisManager &AM)
This indicates that the function could not be classified into one of the behaviors above...
Legacy wrapper pass to provide the TypeBasedAAResult object.
bool isTBAAVtableAccess() const
Check whether MDNode is a vtable access.
FunctionModRefBehavior getModRefBehavior(const CallBase *Call)
bool insert(const value_type &X)
Insert a new element into the SetVector.
LLVMContext & getContext() const
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...
FunctionModRefBehavior
Summary of how a function affects memory in the program.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
const APInt & getValue() const
Return the constant as an APInt value reference.
static MDNode * intersect(MDNode *A, MDNode *B)
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB)
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
size_type count(const key_type &key) const
Count the number of elements of a given key in the SetVector.
AliasResult
The possible results of an alias query.
void getAAMetadata(AAMDNodes &N, bool Merge=false) const
Fills the AAMDNodes structure with AA metadata from this instruction.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata *> MDs)
initializer< Ty > init(const Ty &Val)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This is the interface for a metadata-based TBAA.
The instances of the Type class are immutable: once they are created, they are never changed...
static const MDNode * getLeastCommonType(const MDNode *A, const MDNode *B)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Represent the analysis usage information of a pass.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
A simple AA result that uses TBAA metadata to answer queries.
static MDNode * getMostGenericTBAA(MDNode *A, MDNode *B)
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
The two locations may or may not alias. This is the least precise result.
Representation for a specific memory location.
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
A SetVector that performs no allocations if smaller than a certain size.
This is the shared class of boolean and integer constants.
ImmutablePass class - This class is used to provide information that does not need to be run...
INITIALIZE_PASS(TypeBasedAAWrapperPass, "tbaa", "Type-Based Alias Analysis", false, true) ImmutablePass *llvm
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
MDNode * NoAlias
The tag specifying the noalias scope.
ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc)
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
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.
This function does not perform any non-local stores or volatile loads, but may read from any memory l...
void setPreservesAll()
Set by analyses that do not transform their input at all.
AAMDNodes AATags
The metadata nodes which describes the aliasing of the location (each member is null if that kind of ...
This file provides utility analysis objects describing memory locations.
static MemAccessTy getAccessType(const TargetTransformInfo &TTI, Instruction *Inst, Value *OperandVal)
Return the type of the memory being accessed.
ImmutablePass * createTypeBasedAAWrapperPass()
ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool hasField(TBAAStructTypeNode BaseType, TBAAStructTypeNode FieldType)
static const Function * getParent(const Value *V)
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
A container for analyses that lazily runs them and caches their results.
bool operator==(uint64_t V1, const APInt &V2)
unsigned getNumOperands() const
Return number of MDNode operands.
A special type used by analysis passes to provide an address that identifies that particular analysis...
static cl::opt< bool > EnableTBAA("enable-tbaa", cl::init(true), cl::Hidden)
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal)
bool doInitialization(Module &M) override
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
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...