LLVM 17.0.0git
|
#include "llvm/Transforms/Scalar/InferAddressSpaces.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/ValueHandle.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/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <cassert>
#include <iterator>
#include <limits>
#include <utility>
#include <vector>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "infer-address-spaces" |
Functions | |
INITIALIZE_PASS_BEGIN (InferAddressSpaces, DEBUG_TYPE, "Infer address spaces", false, false) INITIALIZE_PASS_END(InferAddressSpaces | |
Infer address static false Type * | getPtrOrVecOfPtrsWithNewAS (Type *Ty, unsigned NewAddrSpace) |
static bool | isNoopPtrIntCastPair (const Operator *I2P, const DataLayout &DL, const TargetTransformInfo *TTI) |
static bool | isAddressExpression (const Value &V, const DataLayout &DL, const TargetTransformInfo *TTI) |
static SmallVector< Value *, 2 > | getPointerOperands (const Value &V, const DataLayout &DL, const TargetTransformInfo *TTI) |
static Value * | operandWithNewAddressSpaceOrCreateUndef (const Use &OperandUse, unsigned NewAddrSpace, const ValueToValueMapTy &ValueWithNewAddrSpace, const PredicatedAddrSpaceMapTy &PredicatedAS, SmallVectorImpl< const Use * > *UndefUsesToFix) |
static Value * | cloneConstantExprWithNewAddressSpace (ConstantExpr *CE, unsigned NewAddrSpace, const ValueToValueMapTy &ValueWithNewAddrSpace, const DataLayout *DL, const TargetTransformInfo *TTI) |
static bool | isSimplePointerUseValidToReplace (const TargetTransformInfo &TTI, Use &U, unsigned AddrSpace) |
returns true if U is the pointer operand of a memory instruction with a single pointer operand that can have its address space changed by simply mutating the use to a new value. | |
static bool | handleMemIntrinsicPtrUse (MemIntrinsic *MI, Value *OldV, Value *NewV) |
Update memory intrinsic uses that require more complex processing than simple memory instructions. | |
static Value::use_iterator | skipToNextUser (Value::use_iterator I, Value::use_iterator End) |
Variables | |
static cl::opt< bool > | AssumeDefaultIsFlatAddressSpace ("assume-default-is-flat-addrspace", cl::init(false), cl::ReallyHidden, cl::desc("The default address space is assumed as the flat address space. " "This is mainly for test purpose.")) |
static const unsigned | UninitializedAddressSpace |
DEBUG_TYPE | |
Infer address | spaces |
Infer address | false |
#define DEBUG_TYPE "infer-address-spaces" |
Definition at line 136 of file InferAddressSpaces.cpp.
|
static |
Definition at line 698 of file InferAddressSpaces.cpp.
References assert(), cloneConstantExprWithNewAddressSpace(), DL, llvm::ConstantExpr::getAddrSpaceCast(), llvm::ConstantExpr::getBitCast(), getPtrOrVecOfPtrsWithNewAS(), isNoopPtrIntCastPair(), llvm::ValueMap< KeyT, ValueT, Config >::lookup(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by cloneConstantExprWithNewAddressSpace().
|
static |
Definition at line 334 of file InferAddressSpaces.cpp.
References assert(), DL, llvm::CallBase::getArgOperand(), llvm::IntrinsicInst::getIntrinsicID(), isNoopPtrIntCastPair(), and llvm_unreachable.
|
static |
Definition at line 259 of file InferAddressSpaces.cpp.
References assert().
Referenced by cloneConstantExprWithNewAddressSpace(), and operandWithNewAddressSpaceOrCreateUndef().
|
static |
Update memory intrinsic uses that require more complex processing than simple memory instructions.
These require re-mangling and may have multiple pointer operands.
Definition at line 1031 of file InferAddressSpaces.cpp.
References assert(), B, llvm_unreachable, and MI.
INITIALIZE_PASS_BEGIN | ( | InferAddressSpaces | , |
DEBUG_TYPE | , | ||
"Infer address spaces" | , | ||
false | , | ||
false | |||
) |
|
static |
Definition at line 302 of file InferAddressSpaces.cpp.
References assert(), DL, llvm::TargetTransformInfo::getAssumedAddrSpace(), llvm::IntrinsicInst::getIntrinsicID(), isNoopPtrIntCastPair(), and UninitializedAddressSpace.
|
static |
Definition at line 268 of file InferAddressSpaces.cpp.
References assert(), DL, llvm::Operator::getOpcode(), llvm::User::getOperand(), llvm::Type::getPointerAddressSpace(), llvm::Value::getType(), llvm::TargetTransformInfo::isNoopAddrSpaceCast(), and llvm::CastInst::isNoopCast().
Referenced by cloneConstantExprWithNewAddressSpace(), getPointerOperands(), and isAddressExpression().
|
static |
returns
true if U
is the pointer operand of a memory instruction with a single pointer operand that can have its address space changed by simply mutating the use to a new value.
If the memory instruction is volatile, return true only if the target allows the memory instruction to be volatile in the new address space.
Definition at line 1001 of file InferAddressSpaces.cpp.
References llvm::LoadInst::getPointerOperandIndex(), llvm::StoreInst::getPointerOperandIndex(), llvm::AtomicCmpXchgInst::getPointerOperandIndex(), llvm::AtomicRMWInst::getPointerOperandIndex(), llvm::TargetTransformInfo::hasVolatileVariant(), I, and SI.
|
static |
Definition at line 554 of file InferAddressSpaces.cpp.
References llvm::CallingConv::C, llvm::Use::get(), llvm::UndefValue::get(), llvm::ConstantExpr::getAddrSpaceCast(), llvm::Instruction::getDebugLoc(), getPtrOrVecOfPtrsWithNewAS(), llvm::Value::getType(), llvm::Use::getUser(), I, llvm::ValueMap< KeyT, ValueT, Config >::lookup(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
|
static |
Definition at line 1110 of file InferAddressSpaces.cpp.
|
static |
DEBUG_TYPE |
Definition at line 256 of file InferAddressSpaces.cpp.
Infer address false |
Definition at line 257 of file InferAddressSpaces.cpp.
Infer address spaces |
Definition at line 256 of file InferAddressSpaces.cpp.
Definition at line 145 of file InferAddressSpaces.cpp.
Referenced by isAddressExpression().