forked from OSchip/llvm-project
Make isLegalAddressingMode() taking DataLayout as an argument
Summary: This change is part of a series of commits dedicated to have a single DataLayout during compilation by using always the one owned by the module. Reviewers: echristo Subscribers: jholewinski, llvm-commits, rafael, yaron.keren Differential Revision: http://reviews.llvm.org/D11040 From: Mehdi Amini <mehdi.amini@apple.com> llvm-svn: 241778
This commit is contained in:
parent
5c183d5239
commit
0cdec1e2ab
llvm
include/llvm
lib
CodeGen
Target
AArch64
AMDGPU
ARM
Hexagon
Mips
NVPTX
PowerPC
SystemZ
X86
XCore
|
@ -126,7 +126,7 @@ public:
|
||||||
AM.BaseOffs = BaseOffset;
|
AM.BaseOffs = BaseOffset;
|
||||||
AM.HasBaseReg = HasBaseReg;
|
AM.HasBaseReg = HasBaseReg;
|
||||||
AM.Scale = Scale;
|
AM.Scale = Scale;
|
||||||
return getTLI()->isLegalAddressingMode(AM, Ty, AddrSpace);
|
return getTLI()->isLegalAddressingMode(DL, AM, Ty, AddrSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
int getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset,
|
int getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset,
|
||||||
|
@ -136,7 +136,7 @@ public:
|
||||||
AM.BaseOffs = BaseOffset;
|
AM.BaseOffs = BaseOffset;
|
||||||
AM.HasBaseReg = HasBaseReg;
|
AM.HasBaseReg = HasBaseReg;
|
||||||
AM.Scale = Scale;
|
AM.Scale = Scale;
|
||||||
return getTLI()->getScalingFactorCost(AM, Ty, AddrSpace);
|
return getTLI()->getScalingFactorCost(DL, AM, Ty, AddrSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isTruncateFree(Type *Ty1, Type *Ty2) {
|
bool isTruncateFree(Type *Ty1, Type *Ty2) {
|
||||||
|
|
|
@ -1462,8 +1462,8 @@ public:
|
||||||
/// If the address space cannot be determined, it will be -1.
|
/// If the address space cannot be determined, it will be -1.
|
||||||
///
|
///
|
||||||
/// TODO: Remove default argument
|
/// TODO: Remove default argument
|
||||||
virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
virtual bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AddrSpace) const;
|
Type *Ty, unsigned AddrSpace) const;
|
||||||
|
|
||||||
/// \brief Return the cost of the scaling factor used in the addressing mode
|
/// \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.
|
/// represented by AM for this target, for a load/store of the specified type.
|
||||||
|
@ -1472,10 +1472,10 @@ public:
|
||||||
/// If the AM is not supported, it returns a negative value.
|
/// If the AM is not supported, it returns a negative value.
|
||||||
/// TODO: Handle pre/postinc as well.
|
/// TODO: Handle pre/postinc as well.
|
||||||
/// TODO: Remove default argument
|
/// TODO: Remove default argument
|
||||||
virtual int getScalingFactorCost(const AddrMode &AM, Type *Ty,
|
virtual int getScalingFactorCost(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AS = 0) const {
|
Type *Ty, unsigned AS = 0) const {
|
||||||
// Default: assume that any scaling factor used in a legal AM is free.
|
// Default: assume that any scaling factor used in a legal AM is free.
|
||||||
if (isLegalAddressingMode(AM, Ty, AS))
|
if (isLegalAddressingMode(DL, AM, Ty, AS))
|
||||||
return 0;
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2205,7 +2205,7 @@ bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale,
|
||||||
TestAddrMode.ScaledReg = ScaleReg;
|
TestAddrMode.ScaledReg = ScaleReg;
|
||||||
|
|
||||||
// If the new address isn't legal, bail out.
|
// If the new address isn't legal, bail out.
|
||||||
if (!TLI.isLegalAddressingMode(TestAddrMode, AccessTy, AddrSpace))
|
if (!TLI.isLegalAddressingMode(DL, TestAddrMode, AccessTy, AddrSpace))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// It was legal, so commit it.
|
// It was legal, so commit it.
|
||||||
|
@ -2222,7 +2222,7 @@ bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale,
|
||||||
|
|
||||||
// If this addressing mode is legal, commit it and remember that we folded
|
// If this addressing mode is legal, commit it and remember that we folded
|
||||||
// this instruction.
|
// this instruction.
|
||||||
if (TLI.isLegalAddressingMode(TestAddrMode, AccessTy, AddrSpace)) {
|
if (TLI.isLegalAddressingMode(DL, TestAddrMode, AccessTy, AddrSpace)) {
|
||||||
AddrModeInsts.push_back(cast<Instruction>(ScaleReg));
|
AddrModeInsts.push_back(cast<Instruction>(ScaleReg));
|
||||||
AddrMode = TestAddrMode;
|
AddrMode = TestAddrMode;
|
||||||
return true;
|
return true;
|
||||||
|
@ -2789,7 +2789,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
|
||||||
if (VariableOperand == -1) {
|
if (VariableOperand == -1) {
|
||||||
AddrMode.BaseOffs += ConstantOffset;
|
AddrMode.BaseOffs += ConstantOffset;
|
||||||
if (ConstantOffset == 0 ||
|
if (ConstantOffset == 0 ||
|
||||||
TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace)) {
|
TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace)) {
|
||||||
// Check to see if we can fold the base pointer in too.
|
// Check to see if we can fold the base pointer in too.
|
||||||
if (MatchAddr(AddrInst->getOperand(0), Depth+1))
|
if (MatchAddr(AddrInst->getOperand(0), Depth+1))
|
||||||
return true;
|
return true;
|
||||||
|
@ -2912,14 +2912,14 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {
|
||||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(Addr)) {
|
if (ConstantInt *CI = dyn_cast<ConstantInt>(Addr)) {
|
||||||
// Fold in immediates if legal for the target.
|
// Fold in immediates if legal for the target.
|
||||||
AddrMode.BaseOffs += CI->getSExtValue();
|
AddrMode.BaseOffs += CI->getSExtValue();
|
||||||
if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace))
|
if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))
|
||||||
return true;
|
return true;
|
||||||
AddrMode.BaseOffs -= CI->getSExtValue();
|
AddrMode.BaseOffs -= CI->getSExtValue();
|
||||||
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(Addr)) {
|
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(Addr)) {
|
||||||
// If this is a global variable, try to fold it into the addressing mode.
|
// If this is a global variable, try to fold it into the addressing mode.
|
||||||
if (!AddrMode.BaseGV) {
|
if (!AddrMode.BaseGV) {
|
||||||
AddrMode.BaseGV = GV;
|
AddrMode.BaseGV = GV;
|
||||||
if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace))
|
if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))
|
||||||
return true;
|
return true;
|
||||||
AddrMode.BaseGV = nullptr;
|
AddrMode.BaseGV = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -2963,7 +2963,7 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {
|
||||||
AddrMode.HasBaseReg = true;
|
AddrMode.HasBaseReg = true;
|
||||||
AddrMode.BaseReg = Addr;
|
AddrMode.BaseReg = Addr;
|
||||||
// Still check for legality in case the target supports [imm] but not [i+r].
|
// Still check for legality in case the target supports [imm] but not [i+r].
|
||||||
if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace))
|
if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))
|
||||||
return true;
|
return true;
|
||||||
AddrMode.HasBaseReg = false;
|
AddrMode.HasBaseReg = false;
|
||||||
AddrMode.BaseReg = nullptr;
|
AddrMode.BaseReg = nullptr;
|
||||||
|
@ -2973,7 +2973,7 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {
|
||||||
if (AddrMode.Scale == 0) {
|
if (AddrMode.Scale == 0) {
|
||||||
AddrMode.Scale = 1;
|
AddrMode.Scale = 1;
|
||||||
AddrMode.ScaledReg = Addr;
|
AddrMode.ScaledReg = Addr;
|
||||||
if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace))
|
if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))
|
||||||
return true;
|
return true;
|
||||||
AddrMode.Scale = 0;
|
AddrMode.Scale = 0;
|
||||||
AddrMode.ScaledReg = nullptr;
|
AddrMode.ScaledReg = nullptr;
|
||||||
|
|
|
@ -9143,7 +9143,8 @@ static bool canFoldInAddressingMode(SDNode *N, SDNode *Use,
|
||||||
} else
|
} else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return TLI.isLegalAddressingMode(AM, VT.getTypeForEVT(*DAG.getContext()), AS);
|
return TLI.isLegalAddressingMode(DAG.getDataLayout(), AM,
|
||||||
|
VT.getTypeForEVT(*DAG.getContext()), AS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Try turning a load/store into a pre-indexed load/store when the base
|
/// Try turning a load/store into a pre-indexed load/store when the base
|
||||||
|
|
|
@ -1632,8 +1632,8 @@ TargetLoweringBase::getTypeLegalizationCost(const DataLayout &DL,
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool TargetLoweringBase::isLegalAddressingMode(const AddrMode &AM,
|
bool TargetLoweringBase::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// The default implementation of this implements a conservative RISCy, r+r and
|
// The default implementation of this implements a conservative RISCy, r+r and
|
||||||
// r+i addr mode.
|
// r+i addr mode.
|
||||||
|
|
|
@ -6900,8 +6900,8 @@ bool AArch64TargetLowering::isLegalICmpImmediate(int64_t Immed) const {
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool AArch64TargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool AArch64TargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// AArch64 has five basic addressing modes:
|
// AArch64 has five basic addressing modes:
|
||||||
// reg
|
// reg
|
||||||
|
@ -6922,7 +6922,7 @@ bool AArch64TargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||||
// i.e., reg + 0, reg + imm9, reg + SIZE_IN_BYTES * uimm12
|
// i.e., reg + 0, reg + imm9, reg + SIZE_IN_BYTES * uimm12
|
||||||
uint64_t NumBytes = 0;
|
uint64_t NumBytes = 0;
|
||||||
if (Ty->isSized()) {
|
if (Ty->isSized()) {
|
||||||
uint64_t NumBits = getDataLayout()->getTypeSizeInBits(Ty);
|
uint64_t NumBits = DL.getTypeSizeInBits(Ty);
|
||||||
NumBytes = NumBits / 8;
|
NumBytes = NumBits / 8;
|
||||||
if (!isPowerOf2_64(NumBits))
|
if (!isPowerOf2_64(NumBits))
|
||||||
NumBytes = 0;
|
NumBytes = 0;
|
||||||
|
@ -6952,8 +6952,8 @@ bool AArch64TargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AArch64TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
int AArch64TargetLowering::getScalingFactorCost(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// Scaling factors are not free at all.
|
// Scaling factors are not free at all.
|
||||||
// Operands | Rt Latency
|
// Operands | Rt Latency
|
||||||
|
@ -6962,7 +6962,7 @@ int AArch64TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
// Rt, [Xn, Xm, lsl #imm] | Rn: 4 Rm: 5
|
// Rt, [Xn, Xm, lsl #imm] | Rn: 4 Rm: 5
|
||||||
// Rt, [Xn, Wm, <extend> #imm] |
|
// Rt, [Xn, Wm, <extend> #imm] |
|
||||||
if (isLegalAddressingMode(AM, Ty, AS))
|
if (isLegalAddressingMode(DL, AM, Ty, AS))
|
||||||
// Scale represents reg2 * scale, thus account for 1 if
|
// Scale represents reg2 * scale, thus account for 1 if
|
||||||
// it is not equal to 0 or 1.
|
// it is not equal to 0 or 1.
|
||||||
return AM.Scale != 0 && AM.Scale != 1;
|
return AM.Scale != 0 && AM.Scale != 1;
|
||||||
|
|
|
@ -324,7 +324,7 @@ public:
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const override;
|
unsigned AS) const override;
|
||||||
|
|
||||||
/// \brief Return the cost of the scaling factor used in the addressing
|
/// \brief Return the cost of the scaling factor used in the addressing
|
||||||
|
@ -332,7 +332,7 @@ public:
|
||||||
/// of the specified type.
|
/// of the specified type.
|
||||||
/// If the AM is supported, the return value must be >= 0.
|
/// If the AM is supported, the return value must be >= 0.
|
||||||
/// If the AM is not supported, it returns a negative value.
|
/// If the AM is not supported, it returns a negative value.
|
||||||
int getScalingFactorCost(const AddrMode &AM, Type *Ty,
|
int getScalingFactorCost(const DataLayout &DL, const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const override;
|
unsigned AS) const override;
|
||||||
|
|
||||||
/// isFMAFasterThanFMulAndFAdd - Return true if an FMA operation is faster
|
/// isFMAFasterThanFMulAndFAdd - Return true if an FMA operation is faster
|
||||||
|
|
|
@ -254,8 +254,9 @@ bool SITargetLowering::isShuffleMaskLegal(const SmallVectorImpl<int> &,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SITargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool SITargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty, unsigned AS) const {
|
const AddrMode &AM, Type *Ty,
|
||||||
|
unsigned AS) const {
|
||||||
// No global is ever allowed as a base.
|
// No global is ever allowed as a base.
|
||||||
if (AM.BaseGV)
|
if (AM.BaseGV)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -62,8 +62,8 @@ public:
|
||||||
bool isShuffleMaskLegal(const SmallVectorImpl<int> &/*Mask*/,
|
bool isShuffleMaskLegal(const SmallVectorImpl<int> &/*Mask*/,
|
||||||
EVT /*VT*/) const override;
|
EVT /*VT*/) const override;
|
||||||
|
|
||||||
bool isLegalAddressingMode(const AddrMode &AM,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
|
||||||
Type *Ty, unsigned AS) const override;
|
unsigned AS) const override;
|
||||||
|
|
||||||
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
||||||
unsigned Align,
|
unsigned Align,
|
||||||
|
|
|
@ -10319,10 +10319,10 @@ bool ARMTargetLowering::isLegalT2ScaledAddressingMode(const AddrMode &AM,
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool ARMTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool ARMTargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
EVT VT = getValueType(*getDataLayout(), Ty, true);
|
EVT VT = getValueType(DL, Ty, true);
|
||||||
if (!isLegalAddressImmediate(AM.BaseOffs, VT, Subtarget))
|
if (!isLegalAddressImmediate(AM.BaseOffs, VT, Subtarget))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -287,8 +287,8 @@ namespace llvm {
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AS) const override;
|
Type *Ty, unsigned AS) const override;
|
||||||
bool isLegalT2ScaledAddressingMode(const AddrMode &AM, EVT VT) const;
|
bool isLegalT2ScaledAddressingMode(const AddrMode &AM, EVT VT) const;
|
||||||
|
|
||||||
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
||||||
|
|
|
@ -2375,8 +2375,8 @@ bool HexagonTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented by
|
/// isLegalAddressingMode - Return true if the addressing mode represented by
|
||||||
/// AM is legal for this target, for a load/store of the specified type.
|
/// AM is legal for this target, for a load/store of the specified type.
|
||||||
bool HexagonTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool HexagonTargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// Allows a signed-extended 11-bit immediate field.
|
// Allows a signed-extended 11-bit immediate field.
|
||||||
if (AM.BaseOffs <= -(1LL << 13) || AM.BaseOffs >= (1LL << 13)-1)
|
if (AM.BaseOffs <= -(1LL << 13) || AM.BaseOffs >= (1LL << 13)-1)
|
||||||
|
|
|
@ -198,8 +198,8 @@ bool isPositiveHalfWord(SDNode *N);
|
||||||
/// The type may be VoidTy, in which case only return true if the addressing
|
/// 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.
|
/// mode is legal for a load/store of any legal type.
|
||||||
/// TODO: Handle pre/postinc as well.
|
/// TODO: Handle pre/postinc as well.
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AS) const override;
|
Type *Ty, unsigned AS) const override;
|
||||||
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
||||||
|
|
||||||
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
||||||
|
|
|
@ -3550,8 +3550,8 @@ void MipsTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||||
TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MipsTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool MipsTargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// No global is ever allowed as a base.
|
// No global is ever allowed as a base.
|
||||||
if (AM.BaseGV)
|
if (AM.BaseGV)
|
||||||
|
|
|
@ -515,8 +515,8 @@ namespace llvm {
|
||||||
return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
|
return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AS) const override;
|
Type *Ty, unsigned AS) const override;
|
||||||
|
|
||||||
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
|
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
|
||||||
|
|
||||||
|
|
|
@ -3732,8 +3732,8 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic(
|
||||||
/// Used to guide target specific optimizations, like loop strength reduction
|
/// Used to guide target specific optimizations, like loop strength reduction
|
||||||
/// (LoopStrengthReduce.cpp) and memory optimization for address mode
|
/// (LoopStrengthReduce.cpp) and memory optimization for address mode
|
||||||
/// (CodeGenPrepare.cpp)
|
/// (CodeGenPrepare.cpp)
|
||||||
bool NVPTXTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool NVPTXTargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
|
|
||||||
// AddrMode - This represents an addressing mode of:
|
// AddrMode - This represents an addressing mode of:
|
||||||
|
|
|
@ -456,7 +456,7 @@ public:
|
||||||
/// Used to guide target specific optimizations, like loop strength
|
/// Used to guide target specific optimizations, like loop strength
|
||||||
/// reduction (LoopStrengthReduce.cpp) and memory optimization for
|
/// reduction (LoopStrengthReduce.cpp) and memory optimization for
|
||||||
/// address mode (CodeGenPrepare.cpp)
|
/// address mode (CodeGenPrepare.cpp)
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const override;
|
unsigned AS) const override;
|
||||||
|
|
||||||
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
||||||
|
|
|
@ -10930,8 +10930,8 @@ void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||||
|
|
||||||
// isLegalAddressingMode - Return true if the addressing mode represented
|
// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
// by AM is legal for this target, for a load/store of the specified type.
|
// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool PPCTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool PPCTargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// PPC does not allow r+i addressing modes for vectors!
|
// PPC does not allow r+i addressing modes for vectors!
|
||||||
if (Ty->isVectorTy() && AM.BaseOffs != 0)
|
if (Ty->isVectorTy() && AM.BaseOffs != 0)
|
||||||
|
|
|
@ -563,8 +563,8 @@ namespace llvm {
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AS) const override;
|
Type *Ty, unsigned AS) const override;
|
||||||
|
|
||||||
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
/// isLegalICmpImmediate - Return true if the specified immediate is legal
|
||||||
/// icmp immediate, that is the target has icmp instructions which can
|
/// icmp immediate, that is the target has icmp instructions which can
|
||||||
|
|
|
@ -509,8 +509,8 @@ bool SystemZTargetLowering::allowsMisalignedMemoryAccesses(EVT VT,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SystemZTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool SystemZTargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// Punt on globals for now, although they can be used in limited
|
// Punt on globals for now, although they can be used in limited
|
||||||
// RELATIVE LONG cases.
|
// RELATIVE LONG cases.
|
||||||
|
|
|
@ -370,7 +370,7 @@ public:
|
||||||
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
||||||
bool isLegalICmpImmediate(int64_t Imm) const override;
|
bool isLegalICmpImmediate(int64_t Imm) const override;
|
||||||
bool isLegalAddImmediate(int64_t Imm) const override;
|
bool isLegalAddImmediate(int64_t Imm) const override;
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const override;
|
unsigned AS) const override;
|
||||||
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
||||||
unsigned Align,
|
unsigned Align,
|
||||||
|
|
|
@ -18940,8 +18940,8 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||||
|
|
||||||
// isLegalAddressingMode - Return true if the addressing mode represented
|
// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
// by AM is legal for this target, for a load/store of the specified type.
|
// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool X86TargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
bool X86TargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// X86 supports extremely general addressing modes.
|
// X86 supports extremely general addressing modes.
|
||||||
CodeModel::Model M = getTargetMachine().getCodeModel();
|
CodeModel::Model M = getTargetMachine().getCodeModel();
|
||||||
|
@ -26086,8 +26086,8 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||||
return Res;
|
return Res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int X86TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
int X86TargetLowering::getScalingFactorCost(const DataLayout &DL,
|
||||||
Type *Ty,
|
const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const {
|
unsigned AS) const {
|
||||||
// Scaling factors are not free at all.
|
// Scaling factors are not free at all.
|
||||||
// An indexed folded instruction, i.e., inst (reg1, reg2, scale),
|
// An indexed folded instruction, i.e., inst (reg1, reg2, scale),
|
||||||
|
@ -26107,7 +26107,7 @@ int X86TargetLowering::getScalingFactorCost(const AddrMode &AM,
|
||||||
// E.g., on Haswell:
|
// E.g., on Haswell:
|
||||||
// vmovaps %ymm1, (%r8, %rdi) can use port 2 or 3.
|
// vmovaps %ymm1, (%r8, %rdi) can use port 2 or 3.
|
||||||
// vmovaps %ymm1, (%r8) can use port 2, 3, or 7.
|
// vmovaps %ymm1, (%r8) can use port 2, 3, or 7.
|
||||||
if (isLegalAddressingMode(AM, Ty, AS))
|
if (isLegalAddressingMode(DL, AM, Ty, AS))
|
||||||
// Scale represents reg2 * scale, thus account for 1
|
// Scale represents reg2 * scale, thus account for 1
|
||||||
// as soon as we use a second register.
|
// as soon as we use a second register.
|
||||||
return AM.Scale != 0;
|
return AM.Scale != 0;
|
||||||
|
|
|
@ -751,8 +751,8 @@ namespace llvm {
|
||||||
|
|
||||||
/// Return true if the addressing mode represented
|
/// Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AS) const override;
|
Type *Ty, unsigned AS) const override;
|
||||||
|
|
||||||
/// Return true if the specified immediate is legal
|
/// Return true if the specified immediate is legal
|
||||||
/// icmp immediate, that is the target has icmp instructions which can
|
/// icmp immediate, that is the target has icmp instructions which can
|
||||||
|
@ -771,7 +771,7 @@ namespace llvm {
|
||||||
/// of the specified type.
|
/// of the specified type.
|
||||||
/// If the AM is supported, the return value must be >= 0.
|
/// If the AM is supported, the return value must be >= 0.
|
||||||
/// If the AM is not supported, it returns a negative value.
|
/// If the AM is not supported, it returns a negative value.
|
||||||
int getScalingFactorCost(const AddrMode &AM, Type *Ty,
|
int getScalingFactorCost(const DataLayout &DL, const AddrMode &AM, Type *Ty,
|
||||||
unsigned AS) const override;
|
unsigned AS) const override;
|
||||||
|
|
||||||
bool isVectorShiftByScalarCheap(Type *Ty) const override;
|
bool isVectorShiftByScalarCheap(Type *Ty) const override;
|
||||||
|
|
|
@ -1923,15 +1923,13 @@ static inline bool isImmUs4(int64_t val)
|
||||||
|
|
||||||
/// isLegalAddressingMode - Return true if the addressing mode represented
|
/// isLegalAddressingMode - Return true if the addressing mode represented
|
||||||
/// by AM is legal for this target, for a load/store of the specified type.
|
/// by AM is legal for this target, for a load/store of the specified type.
|
||||||
bool
|
bool XCoreTargetLowering::isLegalAddressingMode(const DataLayout &DL,
|
||||||
XCoreTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
const AddrMode &AM, Type *Ty,
|
||||||
Type *Ty,
|
unsigned AS) const {
|
||||||
unsigned AS) const {
|
|
||||||
if (Ty->getTypeID() == Type::VoidTyID)
|
if (Ty->getTypeID() == Type::VoidTyID)
|
||||||
return AM.Scale == 0 && isImmUs(AM.BaseOffs) && isImmUs4(AM.BaseOffs);
|
return AM.Scale == 0 && isImmUs(AM.BaseOffs) && isImmUs4(AM.BaseOffs);
|
||||||
|
|
||||||
const DataLayout *TD = TM.getDataLayout();
|
unsigned Size = DL.getTypeAllocSize(Ty);
|
||||||
unsigned Size = TD->getTypeAllocSize(Ty);
|
|
||||||
if (AM.BaseGV) {
|
if (AM.BaseGV) {
|
||||||
return Size >= 4 && !AM.HasBaseReg && AM.Scale == 0 &&
|
return Size >= 4 && !AM.HasBaseReg && AM.Scale == 0 &&
|
||||||
AM.BaseOffs%4 == 0;
|
AM.BaseOffs%4 == 0;
|
||||||
|
|
|
@ -122,8 +122,8 @@ namespace llvm {
|
||||||
EmitInstrWithCustomInserter(MachineInstr *MI,
|
EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||||
MachineBasicBlock *MBB) const override;
|
MachineBasicBlock *MBB) const override;
|
||||||
|
|
||||||
bool isLegalAddressingMode(const AddrMode &AM, Type *Ty,
|
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
|
||||||
unsigned AS) const override;
|
Type *Ty, unsigned AS) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const TargetMachine &TM;
|
const TargetMachine &TM;
|
||||||
|
|
Loading…
Reference in New Issue