forked from OSchip/llvm-project
Add address space argument to isLegalAddressingMode
This is important because of different addressing modes depending on the address space for GPU targets. This only adds the argument, and does not update any of the uses to provide the correct address space. llvm-svn: 238723
This commit is contained in:
parent
0dba2b399e
commit
bd7d80a4a6
|
@ -1431,7 +1431,8 @@ public:
|
|||
/// load/store.
|
||||
virtual bool GetAddrModeArguments(IntrinsicInst * /*I*/,
|
||||
SmallVectorImpl<Value*> &/*Ops*/,
|
||||
Type *&/*AccessTy*/) const {
|
||||
Type *&/*AccessTy*/,
|
||||
unsigned AddrSpace = 0) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1456,7 +1457,9 @@ public:
|
|||
/// The type may be VoidTy, in which case only return true if the addressing
|
||||
/// mode is legal for a load/store of any legal type. TODO: Handle
|
||||
/// pre/postinc as well.
|
||||
virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const;
|
||||
/// TODO: Remove default argument
|
||||
virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS = 0) const;
|
||||
|
||||
/// \brief Return the cost of the scaling factor used in the addressing mode
|
||||
/// represented by AM for this target, for a load/store of the specified type.
|
||||
|
@ -1464,9 +1467,12 @@ public:
|
|||
/// If the AM is supported, the return value must be >= 0.
|
||||
/// If the AM is not supported, it returns a negative value.
|
||||
/// TODO: Handle pre/postinc as well.
|
||||
virtual int getScalingFactorCost(const AddrMode &AM, Type *Ty) const {
|
||||
/// TODO: Remove default argument
|
||||
virtual int getScalingFactorCost(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS = 0) const {
|
||||
// Default: assume that any scaling factor used in a legal AM is free.
|
||||
if (isLegalAddressingMode(AM, Ty)) return 0;
|
||||
if (isLegalAddressingMode(AM, Ty, AS))
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1632,7 +1632,8 @@ TargetLoweringBase::getTypeLegalizationCost(Type *Ty) const {
|
|||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool TargetLoweringBase::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// The default implementation of this implements a conservative RISCy, r+r and
|
||||
// r+i addr mode.
|
||||
|
||||
|
|
|
@ -6741,7 +6741,8 @@ bool AArch64TargetLowering::isLegalICmpImmediate(int64_t Immed) const {
|
|||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool AArch64TargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// AArch64 has five basic addressing modes:
|
||||
// reg
|
||||
// reg + 9-bit signed offset
|
||||
|
@ -6792,7 +6793,8 @@ bool AArch64TargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
|||
}
|
||||
|
||||
int AArch64TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// Scaling factors are not free at all.
|
||||
// Operands | Rt Latency
|
||||
// -------------------------------------------
|
||||
|
@ -6800,7 +6802,7 @@ int AArch64TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
|||
// -------------------------------------------
|
||||
// Rt, [Xn, Xm, lsl #imm] | Rn: 4 Rm: 5
|
||||
// Rt, [Xn, Wm, <extend> #imm] |
|
||||
if (isLegalAddressingMode(AM, Ty))
|
||||
if (isLegalAddressingMode(AM, Ty, AS))
|
||||
// Scale represents reg2 * scale, thus account for 1 if
|
||||
// it is not equal to 0 or 1.
|
||||
return AM.Scale != 0 && AM.Scale != 1;
|
||||
|
|
|
@ -314,14 +314,16 @@ public:
|
|||
|
||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
/// \brief Return the cost of the scaling factor used in the addressing
|
||||
/// mode represented by AM for this target, for a load/store
|
||||
/// of the specified type.
|
||||
/// If the AM is supported, the return value must be >= 0.
|
||||
/// If the AM is not supported, it returns a negative value.
|
||||
int getScalingFactorCost(const AddrMode &AM, Type *Ty) const override;
|
||||
int getScalingFactorCost(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
/// isFMAFasterThanFMulAndFAdd - Return true if an FMA operation is faster
|
||||
/// than a pair of fmul and fadd instructions. fmuladd intrinsics will be
|
||||
|
|
|
@ -10274,7 +10274,8 @@ bool ARMTargetLowering::isLegalT2ScaledAddressingMode(const AddrMode &AM,
|
|||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool ARMTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
EVT VT = getValueType(Ty, true);
|
||||
if (!isLegalAddressImmediate(AM.BaseOffs, VT, Subtarget))
|
||||
return false;
|
||||
|
|
|
@ -290,7 +290,8 @@ namespace llvm {
|
|||
|
||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
bool isLegalT2ScaledAddressingMode(const AddrMode &AM, EVT VT) const;
|
||||
|
||||
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
||||
|
|
|
@ -2370,7 +2370,8 @@ bool HexagonTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
|
|||
/// isLegalAddressingMode - Return true if the addressing mode represented by
|
||||
/// AM is legal for this target, for a load/store of the specified type.
|
||||
bool HexagonTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// Allows a signed-extended 11-bit immediate field.
|
||||
if (AM.BaseOffs <= -(1LL << 13) || AM.BaseOffs >= (1LL << 13)-1)
|
||||
return false;
|
||||
|
|
|
@ -198,7 +198,8 @@ bool isPositiveHalfWord(SDNode *N);
|
|||
/// The type may be VoidTy, in which case only return true if the addressing
|
||||
/// mode is legal for a load/store of any legal type.
|
||||
/// TODO: Handle pre/postinc as well.
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
||||
|
||||
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
||||
|
|
|
@ -3547,7 +3547,8 @@ void MipsTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
|||
}
|
||||
|
||||
bool MipsTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// No global is ever allowed as a base.
|
||||
if (AM.BaseGV)
|
||||
return false;
|
||||
|
|
|
@ -514,7 +514,8 @@ namespace llvm {
|
|||
return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
|
||||
}
|
||||
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
|
||||
|
||||
|
|
|
@ -3725,7 +3725,8 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic(
|
|||
/// (LoopStrengthReduce.cpp) and memory optimization for address mode
|
||||
/// (CodeGenPrepare.cpp)
|
||||
bool NVPTXTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
|
||||
// AddrMode - This represents an addressing mode of:
|
||||
// BaseGV + BaseOffs + BaseReg + Scale*ScaleReg
|
||||
|
|
|
@ -456,7 +456,8 @@ public:
|
|||
/// Used to guide target specific optimizations, like loop strength
|
||||
/// reduction (LoopStrengthReduce.cpp) and memory optimization for
|
||||
/// address mode (CodeGenPrepare.cpp)
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
||||
unsigned getFunctionAlignment(const Function *F) const;
|
||||
|
|
|
@ -10825,7 +10825,8 @@ void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
|||
// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool PPCTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// PPC does not allow r+i addressing modes for vectors!
|
||||
if (Ty->isVectorTy() && AM.BaseOffs != 0)
|
||||
return false;
|
||||
|
|
|
@ -556,7 +556,8 @@ namespace llvm {
|
|||
|
||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
||||
/// icmp immediate, that is the target has icmp instructions which can
|
||||
|
|
|
@ -263,7 +263,7 @@ bool SITargetLowering::isShuffleMaskLegal(const SmallVectorImpl<int> &,
|
|||
// SMRD instructions have an 8-bit, dword offset.
|
||||
//
|
||||
bool SITargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty, unsigned AS) const {
|
||||
// No global is ever allowed as a base.
|
||||
if (AM.BaseGV)
|
||||
return false;
|
||||
|
|
|
@ -63,7 +63,7 @@ public:
|
|||
EVT /*VT*/) const override;
|
||||
|
||||
bool isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const override;
|
||||
Type *Ty, unsigned AS) const override;
|
||||
|
||||
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
||||
unsigned Align,
|
||||
|
|
|
@ -506,9 +506,10 @@ bool SystemZTargetLowering::allowsMisalignedMemoryAccesses(EVT VT,
|
|||
*Fast = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool SystemZTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// Punt on globals for now, although they can be used in limited
|
||||
// RELATIVE LONG cases.
|
||||
if (AM.BaseGV)
|
||||
|
|
|
@ -369,7 +369,8 @@ public:
|
|||
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
||||
bool isLegalICmpImmediate(int64_t Imm) const override;
|
||||
bool isLegalAddImmediate(int64_t Imm) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
||||
unsigned Align,
|
||||
bool *Fast) const override;
|
||||
|
|
|
@ -18269,7 +18269,8 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
|||
// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool X86TargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// X86 supports extremely general addressing modes.
|
||||
CodeModel::Model M = getTargetMachine().getCodeModel();
|
||||
Reloc::Model R = getTargetMachine().getRelocationModel();
|
||||
|
@ -25405,7 +25406,8 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
|||
}
|
||||
|
||||
int X86TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
// Scaling factors are not free at all.
|
||||
// An indexed folded instruction, i.e., inst (reg1, reg2, scale),
|
||||
// will take 2 allocations in the out of order engine instead of 1
|
||||
|
@ -25424,7 +25426,7 @@ int X86TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
|||
// E.g., on Haswell:
|
||||
// vmovaps %ymm1, (%r8, %rdi) can use port 2 or 3.
|
||||
// vmovaps %ymm1, (%r8) can use port 2, 3, or 7.
|
||||
if (isLegalAddressingMode(AM, Ty))
|
||||
if (isLegalAddressingMode(AM, Ty, AS))
|
||||
// Scale represents reg2 * scale, thus account for 1
|
||||
// as soon as we use a second register.
|
||||
return AM.Scale != 0;
|
||||
|
|
|
@ -732,7 +732,8 @@ namespace llvm {
|
|||
|
||||
/// Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
/// Return true if the specified immediate is legal
|
||||
/// icmp immediate, that is the target has icmp instructions which can
|
||||
|
@ -751,7 +752,8 @@ namespace llvm {
|
|||
/// of the specified type.
|
||||
/// If the AM is supported, the return value must be >= 0.
|
||||
/// If the AM is not supported, it returns a negative value.
|
||||
int getScalingFactorCost(const AddrMode &AM, Type *Ty) const override;
|
||||
int getScalingFactorCost(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
bool isVectorShiftByScalarCheap(Type *Ty) const override;
|
||||
|
||||
|
|
|
@ -1926,7 +1926,8 @@ static inline bool isImmUs4(int64_t val)
|
|||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
bool
|
||||
XCoreTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty) const {
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
if (Ty->getTypeID() == Type::VoidTyID)
|
||||
return AM.Scale == 0 && isImmUs(AM.BaseOffs) && isImmUs4(AM.BaseOffs);
|
||||
|
||||
|
|
|
@ -120,7 +120,8 @@ namespace llvm {
|
|||
EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
MachineBasicBlock *MBB) const override;
|
||||
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
|
||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
||||
unsigned AS) const override;
|
||||
|
||||
private:
|
||||
const TargetMachine &TM;
|
||||
|
|
Loading…
Reference in New Issue