LLVM 19.0.0git
Classes | Macros | Functions | Variables
BasicAliasAnalysis.cpp File Reference
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Support/SaveAndRestore.h"
#include <cassert>
#include <cstdint>
#include <cstdlib>
#include <optional>
#include <utility>

Go to the source code of this file.

Classes

struct  llvm::BasicAAResult::DecomposedGEP
 

Macros

#define DEBUG_TYPE   "basicaa"
 

Functions

 STATISTIC (SearchLimitReached, "Number of times the limit to " "decompose GEPs is reached")
 SearchLimitReached / SearchTimes shows how often the limit of to decompose GEPs is reached.
 
 STATISTIC (SearchTimes, "Number of times a GEP is decomposed")
 
static std::optional< TypeSizegetObjectSize (const Value *V, const DataLayout &DL, const TargetLibraryInfo &TLI, bool NullIsValidLoc, bool RoundToAlign=false)
 Returns the size of the object specified by V or UnknownSize if unknown.
 
static bool isObjectSmallerThan (const Value *V, TypeSize Size, const DataLayout &DL, const TargetLibraryInfo &TLI, bool NullIsValidLoc)
 Returns true if we can prove that the object specified by V is smaller than Size.
 
static TypeSize getMinimalExtentFrom (const Value &V, const LocationSize &LocSize, const DataLayout &DL, bool NullIsValidLoc)
 Return the minimal extent from V to the end of the underlying object, assuming the result is used in an aliasing query.
 
static bool isObjectSize (const Value *V, TypeSize Size, const DataLayout &DL, const TargetLibraryInfo &TLI, bool NullIsValidLoc)
 Returns true if we can prove that the object specified by V has size Size.
 
static bool areBothVScale (const Value *V1, const Value *V2)
 Return true if both V1 and V2 are VScale.
 
static bool isNotInCycle (const Instruction *I, const DominatorTree *DT, const LoopInfo *LI)
 
static LinearExpression GetLinearExpression (const CastedValue &Val, const DataLayout &DL, unsigned Depth, AssumptionCache *AC, DominatorTree *DT)
 Analyzes the specified value as a linear expression: "A*V + B", where A and B are constant integers.
 
static void adjustToIndexSize (APInt &Offset, unsigned IndexSize)
 To ensure a pointer offset fits in an integer of size IndexSize (in bits) when that size is smaller than the maximum index size.
 
static bool isIntrinsicCall (const CallBase *Call, Intrinsic::ID IID)
 
static const FunctiongetParent (const Value *V)
 
static bool notDifferentParent (const Value *O1, const Value *O2)
 
static bool isBaseOfObject (const Value *V)
 Return true if we know V to the base address of the corresponding memory object.
 
static AliasResult MergeAliasResults (AliasResult A, AliasResult B)
 
 INITIALIZE_PASS_BEGIN (BasicAAWrapperPass, "basic-aa", "Basic Alias Analysis (stateless AA impl)", true, true) INITIALIZE_PASS_END(BasicAAWrapperPass
 
basic Basic Alias Analysis (stateless AA impl)"
 

Variables

static cl::opt< boolEnableRecPhiAnalysis ("basic-aa-recphi", cl::Hidden, cl::init(true))
 Enable analysis of recursive PHI nodes.
 
static cl::opt< boolEnableSeparateStorageAnalysis ("basic-aa-separate-storage", cl::Hidden, cl::init(true))
 
static const unsigned MaxLookupSearchDepth = 6
 
basic aa
 
basic Basic Alias true
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "basicaa"

Definition at line 63 of file BasicAliasAnalysis.cpp.

Function Documentation

◆ adjustToIndexSize()

static void adjustToIndexSize ( APInt Offset,
unsigned  IndexSize 
)
static

To ensure a pointer offset fits in an integer of size IndexSize (in bits) when that size is smaller than the maximum index size.

This is an issue, for example, in particular for 32b pointers with negative indices that rely on two's complement wrap-arounds for precise alias information where the maximum index size is 64b.

Definition at line 468 of file BasicAliasAnalysis.cpp.

References assert(), and llvm::Offset.

◆ Analysis()

basic Basic Alias Analysis ( stateless AA  impl)

◆ areBothVScale()

static bool areBothVScale ( const Value V1,
const Value V2 
)
static

Return true if both V1 and V2 are VScale.

Definition at line 192 of file BasicAliasAnalysis.cpp.

References llvm::PatternMatch::m_VScale(), and llvm::PatternMatch::match().

◆ GetLinearExpression()

static LinearExpression GetLinearExpression ( const CastedValue &  Val,
const DataLayout DL,
unsigned  Depth,
AssumptionCache AC,
DominatorTree DT 
)
static

Analyzes the specified value as a linear expression: "A*V + B", where A and B are constant integers.

Definition at line 370 of file BasicAliasAnalysis.cpp.

References llvm::Depth, DL, E, GetLinearExpression(), and RHS.

Referenced by GetLinearExpression().

◆ getMinimalExtentFrom()

static TypeSize getMinimalExtentFrom ( const Value V,
const LocationSize LocSize,
const DataLayout DL,
bool  NullIsValidLoc 
)
static

Return the minimal extent from V to the end of the underlying object, assuming the result is used in an aliasing query.

E.g., we do use the query location size and the fact that null pointers cannot alias here.

Definition at line 164 of file BasicAliasAnalysis.cpp.

References DL, llvm::TypeSize::getFixed(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getKnownMinValue(), llvm::LocationSize::getValue(), and llvm::LocationSize::isPrecise().

◆ getObjectSize()

static std::optional< TypeSize > getObjectSize ( const Value V,
const DataLayout DL,
const TargetLibraryInfo TLI,
bool  NullIsValidLoc,
bool  RoundToAlign = false 
)
static

Returns the size of the object specified by V or UnknownSize if unknown.

Definition at line 104 of file BasicAliasAnalysis.cpp.

References DL, llvm::TypeSize::getFixed(), llvm::getObjectSize(), llvm::ObjectSizeOpts::NullIsUnknownSize, llvm::ObjectSizeOpts::RoundToAlign, and Size.

◆ getParent()

static const Function * getParent ( const Value V)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( BasicAAWrapperPass  ,
"basic-aa"  ,
"Basic Alias Analysis (stateless AA impl)"  ,
true  ,
true   
)

◆ isBaseOfObject()

static bool isBaseOfObject ( const Value V)
static

Return true if we know V to the base address of the corresponding memory object.

This implies that any address less than V must be out of bounds for the underlying object. Note that just being isIdentifiedObject() is not enough - For example, a negative offset from a noalias argument or call can be inbounds w.r.t the actual underlying object.

Definition at line 1040 of file BasicAliasAnalysis.cpp.

◆ isIntrinsicCall()

static bool isIntrinsicCall ( const CallBase Call,
Intrinsic::ID  IID 
)
static

◆ isNotInCycle()

static bool isNotInCycle ( const Instruction I,
const DominatorTree DT,
const LoopInfo LI 
)
static

◆ isObjectSize()

static bool isObjectSize ( const Value V,
TypeSize  Size,
const DataLayout DL,
const TargetLibraryInfo TLI,
bool  NullIsValidLoc 
)
static

Returns true if we can prove that the object specified by V has size Size.

Definition at line 184 of file BasicAliasAnalysis.cpp.

References DL, llvm::getObjectSize(), and Size.

◆ isObjectSmallerThan()

static bool isObjectSmallerThan ( const Value V,
TypeSize  Size,
const DataLayout DL,
const TargetLibraryInfo TLI,
bool  NullIsValidLoc 
)
static

Returns true if we can prove that the object specified by V is smaller than Size.

Definition at line 120 of file BasicAliasAnalysis.cpp.

References DL, llvm::getObjectSize(), llvm::isIdentifiedObject(), llvm::details::FixedOrScalableQuantity< TypeSize, uint64_t >::isKnownLT(), and Size.

◆ MergeAliasResults()

static AliasResult MergeAliasResults ( AliasResult  A,
AliasResult  B 
)
static

◆ notDifferentParent()

static bool notDifferentParent ( const Value O1,
const Value O2 
)
static

◆ STATISTIC() [1/2]

STATISTIC ( SearchLimitReached  ,
"Number of times the limit to " "decompose GEPs is reached"   
)

SearchLimitReached / SearchTimes shows how often the limit of to decompose GEPs is reached.

It will affect the precision of basic alias analysis.

◆ STATISTIC() [2/2]

STATISTIC ( SearchTimes  ,
"Number of times a GEP is decomposed"   
)

Variable Documentation

◆ aa

basic aa

Definition at line 1913 of file BasicAliasAnalysis.cpp.

◆ EnableRecPhiAnalysis

cl::opt< bool > EnableRecPhiAnalysis("basic-aa-recphi", cl::Hidden, cl::init(true)) ( "basic-aa-recphi"  ,
cl::Hidden  ,
cl::init(true  
)
static

Enable analysis of recursive PHI nodes.

◆ EnableSeparateStorageAnalysis

cl::opt< bool > EnableSeparateStorageAnalysis("basic-aa-separate-storage", cl::Hidden, cl::init(true)) ( "basic-aa-separate-storage"  ,
cl::Hidden  ,
cl::init(true  
)
static

◆ MaxLookupSearchDepth

const unsigned MaxLookupSearchDepth = 6
static

Definition at line 83 of file BasicAliasAnalysis.cpp.

◆ true

print machine Print Machine Uniformity Info true