LLVM 20.0.0git
Macros | Functions | Variables
InferAddressSpaces.cpp File Reference
#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/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 TypegetPtrOrVecOfPtrsWithNewAS (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 ValueoperandWithNewAddressSpaceOrCreatePoison (const Use &OperandUse, unsigned NewAddrSpace, const ValueToValueMapTy &ValueWithNewAddrSpace, const PredicatedAddrSpaceMapTy &PredicatedAS, SmallVectorImpl< const Use * > *PoisonUsesToFix)
 
static ValuecloneConstantExprWithNewAddressSpace (ConstantExpr *CE, unsigned NewAddrSpace, const ValueToValueMapTy &ValueWithNewAddrSpace, const DataLayout *DL, const TargetTransformInfo *TTI)
 
static bool replaceOperandIfSame (Instruction *Inst, unsigned OpIdx, Value *OldVal, Value *NewVal)
 Replace operand OpIdx in Inst, if the value is the same as OldVal with NewVal.
 
template<typename InstrType >
static bool replaceSimplePointerUse (const TargetTransformInfo &TTI, InstrType *MemInstr, unsigned AddrSpace, Value *OldV, Value *NewV)
 
static bool replaceIfSimplePointerUse (const TargetTransformInfo &TTI, User *Inst, unsigned AddrSpace, Value *OldV, Value *NewV)
 If OldV is used as the pointer operand of a compatible memory operation Inst, replaces the pointer operand with NewV.
 
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< boolAssumeDefaultIsFlatAddressSpace ("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
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "infer-address-spaces"

Definition at line 135 of file InferAddressSpaces.cpp.

Function Documentation

◆ cloneConstantExprWithNewAddressSpace()

static Value * cloneConstantExprWithNewAddressSpace ( ConstantExpr CE,
unsigned  NewAddrSpace,
const ValueToValueMapTy ValueWithNewAddrSpace,
const DataLayout DL,
const TargetTransformInfo TTI 
)
static

◆ getPointerOperands()

static SmallVector< Value *, 2 > getPointerOperands ( const Value V,
const DataLayout DL,
const TargetTransformInfo TTI 
)
static

Definition at line 342 of file InferAddressSpaces.cpp.

References assert(), DL, II, isNoopPtrIntCastPair(), and llvm_unreachable.

◆ getPtrOrVecOfPtrsWithNewAS()

Infer address static false Type * getPtrOrVecOfPtrsWithNewAS ( Type Ty,
unsigned  NewAddrSpace 
)
static

◆ handleMemIntrinsicPtrUse()

static bool handleMemIntrinsicPtrUse ( MemIntrinsic MI,
Value OldV,
Value NewV 
)
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 1100 of file InferAddressSpaces.cpp.

References assert(), B, llvm_unreachable, and MI.

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( InferAddressSpaces  ,
DEBUG_TYPE  ,
"Infer address spaces"  ,
false  ,
false   
)

◆ isAddressExpression()

static bool isAddressExpression ( const Value V,
const DataLayout DL,
const TargetTransformInfo TTI 
)
static

◆ isNoopPtrIntCastPair()

static bool isNoopPtrIntCastPair ( const Operator I2P,
const DataLayout DL,
const TargetTransformInfo TTI 
)
static

◆ operandWithNewAddressSpaceOrCreatePoison()

static Value * operandWithNewAddressSpaceOrCreatePoison ( const Use OperandUse,
unsigned  NewAddrSpace,
const ValueToValueMapTy ValueWithNewAddrSpace,
const PredicatedAddrSpaceMapTy &  PredicatedAS,
SmallVectorImpl< const Use * > *  PoisonUsesToFix 
)
static

◆ replaceIfSimplePointerUse()

static bool replaceIfSimplePointerUse ( const TargetTransformInfo TTI,
User Inst,
unsigned  AddrSpace,
Value OldV,
Value NewV 
)
static

If OldV is used as the pointer operand of a compatible memory operation Inst, replaces the pointer operand with NewV.

This covers memory instructions with a single pointer operand that can have its address space changed by simply mutating the use to a new value.

returns true the user replacement was made.

Definition at line 1079 of file InferAddressSpaces.cpp.

References replaceSimplePointerUse().

◆ replaceOperandIfSame()

static bool replaceOperandIfSame ( Instruction Inst,
unsigned  OpIdx,
Value OldVal,
Value NewVal 
)
static

Replace operand OpIdx in Inst, if the value is the same as OldVal with NewVal.

Definition at line 1049 of file InferAddressSpaces.cpp.

References llvm::User::getOperandUse().

Referenced by replaceSimplePointerUse().

◆ replaceSimplePointerUse()

template<typename InstrType >
static bool replaceSimplePointerUse ( const TargetTransformInfo TTI,
InstrType MemInstr,
unsigned  AddrSpace,
Value OldV,
Value NewV 
)
static

◆ skipToNextUser()

static Value::use_iterator skipToNextUser ( Value::use_iterator  I,
Value::use_iterator  End 
)
static

Definition at line 1180 of file InferAddressSpaces.cpp.

References End, and I.

Variable Documentation

◆ AssumeDefaultIsFlatAddressSpace

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.")) ( "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

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 264 of file InferAddressSpaces.cpp.

◆ false

Infer address false

Definition at line 265 of file InferAddressSpaces.cpp.

◆ spaces

Infer address spaces

Definition at line 264 of file InferAddressSpaces.cpp.

◆ UninitializedAddressSpace

const unsigned UninitializedAddressSpace
static
Initial value:
=
std::numeric_limits<unsigned>::max()

Definition at line 144 of file InferAddressSpaces.cpp.

Referenced by isAddressExpression().