12#ifndef LLVM_SANDBOXIR_UTILS_H
13#define LLVM_SANDBOXIR_UTILS_H
31 if (
auto *
I = dyn_cast<Instruction>(V)) {
33 if (
auto *RI = dyn_cast<ReturnInst>(
I)) {
34 if (RI->getReturnValue() ==
nullptr)
46 if (
auto *SI = dyn_cast<StoreInst>(
I))
47 return SI->getValueOperand();
48 if (
auto *RI = dyn_cast<ReturnInst>(
I))
49 return RI->getReturnValue();
54 template <
typename LoadOrStoreT>
56 static_assert(std::is_same_v<LoadOrStoreT, LoadInst> ||
57 std::is_same_v<LoadOrStoreT, StoreInst>,
58 "Expected sandboxir::Load or sandboxir::Store!");
67 return DL.getTypeSizeInBits(Ty->
LLVMTy);
77 static std::optional<llvm::MemoryLocation>
84 template <
typename LoadOrStoreT>
88 static_assert(std::is_same_v<LoadOrStoreT, LoadInst> ||
89 std::is_same_v<LoadOrStoreT, StoreInst>,
90 "Expected sandboxir::Load or sandboxir::Store!");
98 return getPointersDiff(ElemTy, Opnd0, ElemTy, Opnd1, I0->getDataLayout(),
105 template <
typename LoadOrStoreT>
117 const std::optional<MemoryLocation> &OptLoc) {
118 return BatchAA.
getModRefInfo(cast<llvm::Instruction>(
I->Val), OptLoc);
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file provides utility analysis objects describing memory locations.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
ModRefInfo getModRefInfo(const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
A parsed version of the target data layout string in and methods for querying it.
static std::optional< MemoryLocation > getOrNone(const Instruction *Inst)
The main scalar evolution driver.
LLVMContext & getContext() const
The instances of the Type class are immutable: once they are created, they are never changed.
static IntegerType * getInt8Ty(LLVMContext &C)
LLVM Value Representation.
Value * getOrCreateValue(llvm::Value *LLVMV)
Get or create a sandboxir::Value for an existing LLVM IR LLVMV.
A sandboxir::User with operands, opcode and linked with previous/next instructions in an instruction ...
Just like llvm::Type these are immutable, unique, never get freed and can only be created via static ...
static unsigned getNumBits(Value *V, const DataLayout &DL)
\Returns the number of bits required to represent the operands or return value of V in DL.
static bool atLowerAddress(LoadOrStoreT *I0, LoadOrStoreT *I1, ScalarEvolution &SE)
\Returns true if I0 accesses a memory location lower than I1.
static std::optional< int > getPointerDiffInBytes(LoadOrStoreT *I0, LoadOrStoreT *I1, ScalarEvolution &SE)
\Returns the gap between the memory locations accessed by I0 and I1 in bytes.
static ModRefInfo aliasAnalysisGetModRefInfo(BatchAAResults &BatchAA, const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
Equivalent to BatchAA::getModRefInfo().
static Type * getExpectedType(const Value *V)
\Returns the expected type of Value V.
static unsigned getNumBits(Instruction *I)
\Returns the number of bits required to represent the operands or return value of I.
static std::optional< llvm::MemoryLocation > memoryLocationGetOrNone(const Instruction *I)
Equivalent to MemoryLocation::getOrNone(I).
static Value * getMemInstructionBase(const LoadOrStoreT *LSI)
\Returns the base Value for load or store instruction LSI.
static Value * getExpectedValue(const Instruction *I)
\Returns the expected Value for this instruction.
A SandboxIR Value has users. This is the base class.
Context & Ctx
All values point to the context.
std::optional< int > getPointersDiff(Type *ElemTyA, Value *PtrA, Type *ElemTyB, Value *PtrB, const DataLayout &DL, ScalarEvolution &SE, bool StrictCheck=false, bool CheckType=true)
Returns the distance between the pointers PtrA and PtrB iff they are compatible and it is possible to...
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
ModRefInfo
Flags indicating whether a memory access modifies or references memory.