mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-02 13:21:43 +00:00
Make TargetLowering::getPointerTy() 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, ted, yaron.keren, rafael, llvm-commits Differential Revision: http://reviews.llvm.org/D11028 From: Mehdi Amini <mehdi.amini@apple.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241775 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
966e6ca1ac
commit
f29cc18dcb
@ -94,6 +94,8 @@ protected:
|
||||
explicit BasicTTIImplBase(const TargetMachine *TM, const DataLayout &DL)
|
||||
: BaseT(DL) {}
|
||||
|
||||
using TargetTransformInfoImplBase::DL;
|
||||
|
||||
public:
|
||||
// Provide value semantics. MSVC requires that we spell all of these out.
|
||||
BasicTTIImplBase(const BasicTTIImplBase &Arg)
|
||||
@ -146,7 +148,7 @@ public:
|
||||
}
|
||||
|
||||
bool isTypeLegal(Type *Ty) {
|
||||
EVT VT = getTLI()->getValueType(Ty);
|
||||
EVT VT = getTLI()->getValueType(DL, Ty);
|
||||
return getTLI()->isTypeLegal(VT);
|
||||
}
|
||||
|
||||
@ -184,7 +186,7 @@ public:
|
||||
|
||||
bool haveFastSqrt(Type *Ty) {
|
||||
const TargetLoweringBase *TLI = getTLI();
|
||||
EVT VT = TLI->getValueType(Ty);
|
||||
EVT VT = TLI->getValueType(DL, Ty);
|
||||
return TLI->isTypeLegal(VT) &&
|
||||
TLI->isOperationLegalOrCustom(ISD::FSQRT, VT);
|
||||
}
|
||||
@ -291,7 +293,7 @@ public:
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
assert(ISD && "Invalid opcode");
|
||||
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Ty);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
|
||||
|
||||
bool IsFloat = Ty->getScalarType()->isFloatingPointTy();
|
||||
// Assume that floating point arithmetic operations cost twice as much as
|
||||
@ -341,9 +343,8 @@ public:
|
||||
const TargetLoweringBase *TLI = getTLI();
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
assert(ISD && "Invalid opcode");
|
||||
|
||||
std::pair<unsigned, MVT> SrcLT = TLI->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> DstLT = TLI->getTypeLegalizationCost(Dst);
|
||||
std::pair<unsigned, MVT> SrcLT = TLI->getTypeLegalizationCost(DL, Src);
|
||||
std::pair<unsigned, MVT> DstLT = TLI->getTypeLegalizationCost(DL, Dst);
|
||||
|
||||
// Check for NOOP conversions.
|
||||
if (SrcLT.first == DstLT.first &&
|
||||
@ -447,8 +448,7 @@ public:
|
||||
if (CondTy->isVectorTy())
|
||||
ISD = ISD::VSELECT;
|
||||
}
|
||||
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(ValTy);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, ValTy);
|
||||
|
||||
if (!(ValTy->isVectorTy() && !LT.second.isVector()) &&
|
||||
!TLI->isOperationExpand(ISD, LT.second)) {
|
||||
@ -477,7 +477,7 @@ public:
|
||||
|
||||
unsigned getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
|
||||
std::pair<unsigned, MVT> LT =
|
||||
getTLI()->getTypeLegalizationCost(Val->getScalarType());
|
||||
getTLI()->getTypeLegalizationCost(DL, Val->getScalarType());
|
||||
|
||||
return LT.first;
|
||||
}
|
||||
@ -485,7 +485,7 @@ public:
|
||||
unsigned getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment,
|
||||
unsigned AddressSpace) {
|
||||
assert(!Src->isVoidTy() && "Invalid type");
|
||||
std::pair<unsigned, MVT> LT = getTLI()->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> LT = getTLI()->getTypeLegalizationCost(DL, Src);
|
||||
|
||||
// Assuming that all loads of legal types cost 1.
|
||||
unsigned Cost = LT.first;
|
||||
@ -496,7 +496,7 @@ public:
|
||||
// itself. Unless the corresponding extending load or truncating store is
|
||||
// legal, then this will scalarize.
|
||||
TargetLowering::LegalizeAction LA = TargetLowering::Expand;
|
||||
EVT MemVT = getTLI()->getValueType(Src, true);
|
||||
EVT MemVT = getTLI()->getValueType(DL, Src, true);
|
||||
if (MemVT.isSimple() && MemVT != MVT::Other) {
|
||||
if (Opcode == Instruction::Store)
|
||||
LA = getTLI()->getTruncStoreAction(LT.second, MemVT.getSimpleVT());
|
||||
@ -692,7 +692,7 @@ public:
|
||||
}
|
||||
|
||||
const TargetLoweringBase *TLI = getTLI();
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(RetTy);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, RetTy);
|
||||
|
||||
if (TLI->isOperationLegalOrPromote(ISD, LT.second)) {
|
||||
// The operation is legal. Assume it costs 1.
|
||||
@ -763,7 +763,7 @@ public:
|
||||
}
|
||||
|
||||
unsigned getNumberOfParts(Type *Tp) {
|
||||
std::pair<unsigned, MVT> LT = getTLI()->getTypeLegalizationCost(Tp);
|
||||
std::pair<unsigned, MVT> LT = getTLI()->getTypeLegalizationCost(DL, Tp);
|
||||
return LT.first;
|
||||
}
|
||||
|
||||
|
@ -168,9 +168,9 @@ public:
|
||||
/// Return the pointer type for the given address space, defaults to
|
||||
/// the pointer type from the data layout.
|
||||
/// FIXME: The default needs to be removed once all the code is updated.
|
||||
virtual MVT getPointerTy(uint32_t /*AS*/ = 0) const;
|
||||
unsigned getPointerSizeInBits(uint32_t AS = 0) const;
|
||||
unsigned getPointerTypeSizeInBits(Type *Ty) const;
|
||||
MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const {
|
||||
return MVT::getIntegerVT(DL.getPointerSizeInBits(AS));
|
||||
}
|
||||
virtual MVT getScalarShiftAmountTy(EVT LHSTy) const;
|
||||
|
||||
EVT getShiftAmountTy(EVT LHSTy) const;
|
||||
@ -178,8 +178,8 @@ public:
|
||||
/// Returns the type to be used for the index operand of:
|
||||
/// ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT,
|
||||
/// ISD::INSERT_SUBVECTOR, and ISD::EXTRACT_SUBVECTOR
|
||||
virtual MVT getVectorIdxTy() const {
|
||||
return getPointerTy();
|
||||
virtual MVT getVectorIdxTy(const DataLayout &DL) const {
|
||||
return getPointerTy(DL);
|
||||
}
|
||||
|
||||
/// Return true if the select operation is expensive for this target.
|
||||
@ -325,7 +325,8 @@ public:
|
||||
}
|
||||
|
||||
/// Return the ValueType of the result of SETCC operations.
|
||||
virtual EVT getSetCCResultType(LLVMContext &Context, EVT VT) const;
|
||||
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const;
|
||||
|
||||
/// Return the ValueType for comparison libcalls. Comparions libcalls include
|
||||
/// floating point comparion calls, and Ordered/Unordered check calls on
|
||||
@ -713,17 +714,18 @@ public:
|
||||
/// operations except for the pointer size. If AllowUnknown is true, this
|
||||
/// will return MVT::Other for types with no EVT counterpart (e.g. structs),
|
||||
/// otherwise it will assert.
|
||||
EVT getValueType(Type *Ty, bool AllowUnknown = false) const {
|
||||
EVT getValueType(const DataLayout &DL, Type *Ty,
|
||||
bool AllowUnknown = false) const {
|
||||
// Lower scalar pointers to native pointer types.
|
||||
if (PointerType *PTy = dyn_cast<PointerType>(Ty))
|
||||
return getPointerTy(PTy->getAddressSpace());
|
||||
return getPointerTy(DL, PTy->getAddressSpace());
|
||||
|
||||
if (Ty->isVectorTy()) {
|
||||
VectorType *VTy = cast<VectorType>(Ty);
|
||||
Type *Elm = VTy->getElementType();
|
||||
// Lower vectors of pointers to native pointer types.
|
||||
if (PointerType *PT = dyn_cast<PointerType>(Elm)) {
|
||||
EVT PointerTy(getPointerTy(PT->getAddressSpace()));
|
||||
EVT PointerTy(getPointerTy(DL, PT->getAddressSpace()));
|
||||
Elm = PointerTy.getTypeForEVT(Ty->getContext());
|
||||
}
|
||||
|
||||
@ -734,8 +736,9 @@ public:
|
||||
}
|
||||
|
||||
/// Return the MVT corresponding to this LLVM type. See getValueType.
|
||||
MVT getSimpleValueType(Type *Ty, bool AllowUnknown = false) const {
|
||||
return getValueType(Ty, AllowUnknown).getSimpleVT();
|
||||
MVT getSimpleValueType(const DataLayout &DL, Type *Ty,
|
||||
bool AllowUnknown = false) const {
|
||||
return getValueType(DL, Ty, AllowUnknown).getSimpleVT();
|
||||
}
|
||||
|
||||
/// Return the desired alignment for ByVal or InAlloca aggregate function
|
||||
@ -1004,7 +1007,8 @@ public:
|
||||
int InstructionOpcodeToISD(unsigned Opcode) const;
|
||||
|
||||
/// Estimate the cost of type-legalization and the legalized type.
|
||||
std::pair<unsigned, MVT> getTypeLegalizationCost(Type *Ty) const;
|
||||
std::pair<unsigned, MVT> getTypeLegalizationCost(const DataLayout &DL,
|
||||
Type *Ty) const;
|
||||
|
||||
/// @}
|
||||
|
||||
|
@ -109,7 +109,7 @@ void llvm::ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL,
|
||||
if (Ty->isVoidTy())
|
||||
return;
|
||||
// Base case: we can get an EVT for this LLVM IR type.
|
||||
ValueVTs.push_back(TLI.getValueType(Ty));
|
||||
ValueVTs.push_back(TLI.getValueType(DL, Ty));
|
||||
if (Offsets)
|
||||
Offsets->push_back(StartingOffset);
|
||||
}
|
||||
@ -233,7 +233,8 @@ static bool isNoopBitcast(Type *T1, Type *T2,
|
||||
static const Value *getNoopInput(const Value *V,
|
||||
SmallVectorImpl<unsigned> &ValLoc,
|
||||
unsigned &DataBits,
|
||||
const TargetLoweringBase &TLI) {
|
||||
const TargetLoweringBase &TLI,
|
||||
const DataLayout &DL) {
|
||||
while (true) {
|
||||
// Try to look through V1; if V1 is not an instruction, it can't be looked
|
||||
// through.
|
||||
@ -255,16 +256,16 @@ static const Value *getNoopInput(const Value *V,
|
||||
// Make sure this isn't a truncating or extending cast. We could
|
||||
// support this eventually, but don't bother for now.
|
||||
if (!isa<VectorType>(I->getType()) &&
|
||||
TLI.getPointerTy().getSizeInBits() ==
|
||||
cast<IntegerType>(Op->getType())->getBitWidth())
|
||||
DL.getPointerSizeInBits() ==
|
||||
cast<IntegerType>(Op->getType())->getBitWidth())
|
||||
NoopInput = Op;
|
||||
} else if (isa<PtrToIntInst>(I)) {
|
||||
// Look through ptrtoint.
|
||||
// Make sure this isn't a truncating or extending cast. We could
|
||||
// support this eventually, but don't bother for now.
|
||||
if (!isa<VectorType>(I->getType()) &&
|
||||
TLI.getPointerTy().getSizeInBits() ==
|
||||
cast<IntegerType>(I->getType())->getBitWidth())
|
||||
DL.getPointerSizeInBits() ==
|
||||
cast<IntegerType>(I->getType())->getBitWidth())
|
||||
NoopInput = Op;
|
||||
} else if (isa<TruncInst>(I) &&
|
||||
TLI.allowTruncateForTailCall(Op->getType(), I->getType())) {
|
||||
@ -331,14 +332,15 @@ static bool slotOnlyDiscardsData(const Value *RetVal, const Value *CallVal,
|
||||
SmallVectorImpl<unsigned> &RetIndices,
|
||||
SmallVectorImpl<unsigned> &CallIndices,
|
||||
bool AllowDifferingSizes,
|
||||
const TargetLoweringBase &TLI) {
|
||||
const TargetLoweringBase &TLI,
|
||||
const DataLayout &DL) {
|
||||
|
||||
// Trace the sub-value needed by the return value as far back up the graph as
|
||||
// possible, in the hope that it will intersect with the value produced by the
|
||||
// call. In the simple case with no "returned" attribute, the hope is actually
|
||||
// that we end up back at the tail call instruction itself.
|
||||
unsigned BitsRequired = UINT_MAX;
|
||||
RetVal = getNoopInput(RetVal, RetIndices, BitsRequired, TLI);
|
||||
RetVal = getNoopInput(RetVal, RetIndices, BitsRequired, TLI, DL);
|
||||
|
||||
// If this slot in the value returned is undef, it doesn't matter what the
|
||||
// call puts there, it'll be fine.
|
||||
@ -350,7 +352,7 @@ static bool slotOnlyDiscardsData(const Value *RetVal, const Value *CallVal,
|
||||
// a "returned" attribute, the search will be blocked immediately and the loop
|
||||
// a Noop.
|
||||
unsigned BitsProvided = UINT_MAX;
|
||||
CallVal = getNoopInput(CallVal, CallIndices, BitsProvided, TLI);
|
||||
CallVal = getNoopInput(CallVal, CallIndices, BitsProvided, TLI, DL);
|
||||
|
||||
// There's no hope if we can't actually trace them to (the same part of!) the
|
||||
// same value.
|
||||
@ -606,7 +608,8 @@ bool llvm::returnTypeIsEligibleForTailCall(const Function *F,
|
||||
// Finally, we can check whether the value produced by the tail call at this
|
||||
// index is compatible with the value we return.
|
||||
if (!slotOnlyDiscardsData(RetVal, CallVal, TmpRetPath, TmpCallPath,
|
||||
AllowDifferingSizes, TLI))
|
||||
AllowDifferingSizes, TLI,
|
||||
F->getParent()->getDataLayout()))
|
||||
return false;
|
||||
|
||||
CallEmpty = !nextRealType(CallSubTypes, CallPath);
|
||||
|
@ -758,10 +758,11 @@ static bool SinkCast(CastInst *CI) {
|
||||
///
|
||||
/// Return true if any changes are made.
|
||||
///
|
||||
static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI){
|
||||
static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI,
|
||||
const DataLayout &DL) {
|
||||
// If this is a noop copy,
|
||||
EVT SrcVT = TLI.getValueType(CI->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(CI->getType());
|
||||
EVT SrcVT = TLI.getValueType(DL, CI->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(DL, CI->getType());
|
||||
|
||||
// This is an fp<->int conversion?
|
||||
if (SrcVT.isInteger() != DstVT.isInteger())
|
||||
@ -926,7 +927,7 @@ static bool isExtractBitsCandidateUse(Instruction *User) {
|
||||
static bool
|
||||
SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,
|
||||
DenseMap<BasicBlock *, BinaryOperator *> &InsertedShifts,
|
||||
const TargetLowering &TLI) {
|
||||
const TargetLowering &TLI, const DataLayout &DL) {
|
||||
BasicBlock *UserBB = User->getParent();
|
||||
DenseMap<BasicBlock *, CastInst *> InsertedTruncs;
|
||||
TruncInst *TruncI = dyn_cast<TruncInst>(User);
|
||||
@ -952,7 +953,7 @@ SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,
|
||||
// approximation; some nodes' legality is determined by the
|
||||
// operand or other means. There's no good way to find out though.
|
||||
if (TLI.isOperationLegalOrCustom(
|
||||
ISDOpcode, TLI.getValueType(TruncUser->getType(), true)))
|
||||
ISDOpcode, TLI.getValueType(DL, TruncUser->getType(), true)))
|
||||
continue;
|
||||
|
||||
// Don't bother for PHI nodes.
|
||||
@ -1010,13 +1011,14 @@ SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,
|
||||
/// instruction.
|
||||
/// Return true if any changes are made.
|
||||
static bool OptimizeExtractBits(BinaryOperator *ShiftI, ConstantInt *CI,
|
||||
const TargetLowering &TLI) {
|
||||
const TargetLowering &TLI,
|
||||
const DataLayout &DL) {
|
||||
BasicBlock *DefBB = ShiftI->getParent();
|
||||
|
||||
/// Only insert instructions in each block once.
|
||||
DenseMap<BasicBlock *, BinaryOperator *> InsertedShifts;
|
||||
|
||||
bool shiftIsLegal = TLI.isTypeLegal(TLI.getValueType(ShiftI->getType()));
|
||||
bool shiftIsLegal = TLI.isTypeLegal(TLI.getValueType(DL, ShiftI->getType()));
|
||||
|
||||
bool MadeChange = false;
|
||||
for (Value::user_iterator UI = ShiftI->user_begin(), E = ShiftI->user_end();
|
||||
@ -1053,9 +1055,10 @@ static bool OptimizeExtractBits(BinaryOperator *ShiftI, ConstantInt *CI,
|
||||
if (isa<TruncInst>(User) && shiftIsLegal
|
||||
// If the type of the truncate is legal, no trucate will be
|
||||
// introduced in other basic blocks.
|
||||
&& (!TLI.isTypeLegal(TLI.getValueType(User->getType()))))
|
||||
&&
|
||||
(!TLI.isTypeLegal(TLI.getValueType(DL, User->getType()))))
|
||||
MadeChange =
|
||||
SinkShiftAndTruncate(ShiftI, User, CI, InsertedShifts, TLI);
|
||||
SinkShiftAndTruncate(ShiftI, User, CI, InsertedShifts, TLI, DL);
|
||||
|
||||
continue;
|
||||
}
|
||||
@ -2265,7 +2268,8 @@ static bool MightBeFoldableInst(Instruction *I) {
|
||||
/// \note \p Val is assumed to be the product of some type promotion.
|
||||
/// Therefore if \p Val has an undefined state in \p TLI, this is assumed
|
||||
/// to be legal, as the non-promoted value would have had the same state.
|
||||
static bool isPromotedInstructionLegal(const TargetLowering &TLI, Value *Val) {
|
||||
static bool isPromotedInstructionLegal(const TargetLowering &TLI,
|
||||
const DataLayout &DL, Value *Val) {
|
||||
Instruction *PromotedInst = dyn_cast<Instruction>(Val);
|
||||
if (!PromotedInst)
|
||||
return false;
|
||||
@ -2275,7 +2279,7 @@ static bool isPromotedInstructionLegal(const TargetLowering &TLI, Value *Val) {
|
||||
return true;
|
||||
// Otherwise, check if the promoted instruction is legal or not.
|
||||
return TLI.isOperationLegalOrCustom(
|
||||
ISDOpcode, TLI.getValueType(PromotedInst->getType()));
|
||||
ISDOpcode, TLI.getValueType(DL, PromotedInst->getType()));
|
||||
}
|
||||
|
||||
/// \brief Hepler class to perform type promotion.
|
||||
@ -2649,7 +2653,7 @@ bool AddressingModeMatcher::IsPromotionProfitable(
|
||||
// The promotion is neutral but it may help folding the sign extension in
|
||||
// loads for instance.
|
||||
// Check that we did not create an illegal instruction.
|
||||
return isPromotedInstructionLegal(TLI, PromotedOperand);
|
||||
return isPromotedInstructionLegal(TLI, DL, PromotedOperand);
|
||||
}
|
||||
|
||||
/// MatchOperationAddr - Given an instruction or constant expr, see if we can
|
||||
@ -2677,12 +2681,14 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
|
||||
case Instruction::PtrToInt:
|
||||
// PtrToInt is always a noop, as we know that the int type is pointer sized.
|
||||
return MatchAddr(AddrInst->getOperand(0), Depth);
|
||||
case Instruction::IntToPtr:
|
||||
case Instruction::IntToPtr: {
|
||||
auto AS = AddrInst->getType()->getPointerAddressSpace();
|
||||
auto PtrTy = MVT::getIntegerVT(DL.getPointerSizeInBits(AS));
|
||||
// This inttoptr is a no-op if the integer type is pointer sized.
|
||||
if (TLI.getValueType(AddrInst->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(AddrInst->getType()->getPointerAddressSpace()))
|
||||
if (TLI.getValueType(DL, AddrInst->getOperand(0)->getType()) == PtrTy)
|
||||
return MatchAddr(AddrInst->getOperand(0), Depth);
|
||||
return false;
|
||||
}
|
||||
case Instruction::BitCast:
|
||||
// BitCast is always a noop, and we can handle it as long as it is
|
||||
// int->int or pointer->pointer (we don't want int<->fp or something).
|
||||
@ -3683,7 +3689,7 @@ bool CodeGenPrepare::ExtLdPromotion(TypePromotionTransaction &TPT,
|
||||
TotalCreatedInstsCost -= ExtCost;
|
||||
if (!StressExtLdPromotion &&
|
||||
(TotalCreatedInstsCost > 1 ||
|
||||
!isPromotedInstructionLegal(*TLI, PromotedVal))) {
|
||||
!isPromotedInstructionLegal(*TLI, *DL, PromotedVal))) {
|
||||
// The promotion is not profitable, rollback to the previous state.
|
||||
TPT.rollback(LastKnownGood);
|
||||
continue;
|
||||
@ -3738,8 +3744,8 @@ bool CodeGenPrepare::MoveExtToFormExtLoad(Instruction *&I) {
|
||||
if (!HasPromoted && LI->getParent() == I->getParent())
|
||||
return false;
|
||||
|
||||
EVT VT = TLI->getValueType(I->getType());
|
||||
EVT LoadVT = TLI->getValueType(LI->getType());
|
||||
EVT VT = TLI->getValueType(*DL, I->getType());
|
||||
EVT LoadVT = TLI->getValueType(*DL, LI->getType());
|
||||
|
||||
// If the load has other users and the truncate is not free, this probably
|
||||
// isn't worthwhile.
|
||||
@ -4016,6 +4022,9 @@ namespace {
|
||||
/// Assuming both extractelement and store can be combine, we get rid of the
|
||||
/// transition.
|
||||
class VectorPromoteHelper {
|
||||
/// DataLayout associated with the current module.
|
||||
const DataLayout &DL;
|
||||
|
||||
/// Used to perform some checks on the legality of vector operations.
|
||||
const TargetLowering &TLI;
|
||||
|
||||
@ -4089,7 +4098,8 @@ class VectorPromoteHelper {
|
||||
unsigned Align = ST->getAlignment();
|
||||
// Check if this store is supported.
|
||||
if (!TLI.allowsMisalignedMemoryAccesses(
|
||||
TLI.getValueType(ST->getValueOperand()->getType()), AS, Align)) {
|
||||
TLI.getValueType(DL, ST->getValueOperand()->getType()), AS,
|
||||
Align)) {
|
||||
// If this is not supported, there is no way we can combine
|
||||
// the extract with the store.
|
||||
return false;
|
||||
@ -4184,9 +4194,10 @@ class VectorPromoteHelper {
|
||||
}
|
||||
|
||||
public:
|
||||
VectorPromoteHelper(const TargetLowering &TLI, const TargetTransformInfo &TTI,
|
||||
Instruction *Transition, unsigned CombineCost)
|
||||
: TLI(TLI), TTI(TTI), Transition(Transition),
|
||||
VectorPromoteHelper(const DataLayout &DL, const TargetLowering &TLI,
|
||||
const TargetTransformInfo &TTI, Instruction *Transition,
|
||||
unsigned CombineCost)
|
||||
: DL(DL), TLI(TLI), TTI(TTI), Transition(Transition),
|
||||
StoreExtractCombineCost(CombineCost), CombineInst(nullptr) {
|
||||
assert(Transition && "Do not know how to promote null");
|
||||
}
|
||||
@ -4222,7 +4233,7 @@ public:
|
||||
return false;
|
||||
return StressStoreExtract ||
|
||||
TLI.isOperationLegalOrCustom(
|
||||
ISDOpcode, TLI.getValueType(getTransitionType(), true));
|
||||
ISDOpcode, TLI.getValueType(DL, getTransitionType(), true));
|
||||
}
|
||||
|
||||
/// \brief Check whether or not \p Use can be combined
|
||||
@ -4326,7 +4337,7 @@ bool CodeGenPrepare::OptimizeExtractElementInst(Instruction *Inst) {
|
||||
// we do not do that for now.
|
||||
BasicBlock *Parent = Inst->getParent();
|
||||
DEBUG(dbgs() << "Found an interesting transition: " << *Inst << '\n');
|
||||
VectorPromoteHelper VPH(*TLI, *TTI, Inst, CombineCost);
|
||||
VectorPromoteHelper VPH(*DL, *TLI, *TTI, Inst, CombineCost);
|
||||
// If the transition has more than one use, assume this is not going to be
|
||||
// beneficial.
|
||||
while (Inst->hasOneUse()) {
|
||||
@ -4390,15 +4401,16 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
|
||||
if (isa<Constant>(CI->getOperand(0)))
|
||||
return false;
|
||||
|
||||
if (TLI && OptimizeNoopCopyExpression(CI, *TLI))
|
||||
if (TLI && OptimizeNoopCopyExpression(CI, *TLI, *DL))
|
||||
return true;
|
||||
|
||||
if (isa<ZExtInst>(I) || isa<SExtInst>(I)) {
|
||||
/// Sink a zext or sext into its user blocks if the target type doesn't
|
||||
/// fit in one register
|
||||
if (TLI && TLI->getTypeAction(CI->getContext(),
|
||||
TLI->getValueType(CI->getType())) ==
|
||||
TargetLowering::TypeExpandInteger) {
|
||||
if (TLI &&
|
||||
TLI->getTypeAction(CI->getContext(),
|
||||
TLI->getValueType(*DL, CI->getType())) ==
|
||||
TargetLowering::TypeExpandInteger) {
|
||||
return SinkCast(CI);
|
||||
} else {
|
||||
bool MadeChange = MoveExtToFormExtLoad(I);
|
||||
@ -4435,7 +4447,7 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
|
||||
BinOp->getOpcode() == Instruction::LShr)) {
|
||||
ConstantInt *CI = dyn_cast<ConstantInt>(BinOp->getOperand(1));
|
||||
if (TLI && CI && TLI->hasExtractBitsInsn())
|
||||
return OptimizeExtractBits(BinOp, CI, *TLI);
|
||||
return OptimizeExtractBits(BinOp, CI, *TLI, *DL);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -443,8 +443,9 @@ namespace {
|
||||
assert(LHSTy.isInteger() && "Shift amount is not an integer type!");
|
||||
if (LHSTy.isVector())
|
||||
return LHSTy;
|
||||
auto &DL = DAG.getDataLayout();
|
||||
return LegalTypes ? TLI.getScalarShiftAmountTy(LHSTy)
|
||||
: TLI.getPointerTy();
|
||||
: TLI.getPointerTy(DL);
|
||||
}
|
||||
|
||||
/// This method returns true if we are running before type legalization or
|
||||
@ -456,7 +457,7 @@ namespace {
|
||||
|
||||
/// Convenience wrapper around TargetLowering::getSetCCResultType
|
||||
EVT getSetCCResultType(EVT VT) const {
|
||||
return TLI.getSetCCResultType(*DAG.getContext(), VT);
|
||||
return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -6926,7 +6927,7 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
|
||||
SDValue EltNo = N0->getOperand(1);
|
||||
if (isa<ConstantSDNode>(EltNo) && isTypeLegal(NVT)) {
|
||||
int Elt = cast<ConstantSDNode>(EltNo)->getZExtValue();
|
||||
EVT IndexTy = TLI.getVectorIdxTy();
|
||||
EVT IndexTy = TLI.getVectorIdxTy(DAG.getDataLayout());
|
||||
int Index = isLE ? (Elt*SizeRatio) : (Elt*SizeRatio + (SizeRatio-1));
|
||||
|
||||
SDValue V = DAG.getNode(ISD::BITCAST, SDLoc(N),
|
||||
@ -8422,7 +8423,7 @@ SDValue DAGCombiner::visitFSQRT(SDNode *N) {
|
||||
// Unfortunately, RV is now NaN if the input was exactly 0.
|
||||
// Select out this case and force the answer to 0.
|
||||
SDValue Zero = DAG.getConstantFP(0.0, DL, VT);
|
||||
EVT CCVT = TLI.getSetCCResultType(*DAG.getContext(), VT);
|
||||
EVT CCVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
|
||||
SDValue ZeroCmp = DAG.getSetCC(DL, CCVT, N->getOperand(0), Zero, ISD::SETEQ);
|
||||
AddToWorklist(ZeroCmp.getNode());
|
||||
AddToWorklist(RV.getNode());
|
||||
@ -11647,7 +11648,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
|
||||
// scalar_to_vector here as well.
|
||||
|
||||
if (!LegalOperations) {
|
||||
EVT IndexTy = TLI.getVectorIdxTy();
|
||||
EVT IndexTy = TLI.getVectorIdxTy(DAG.getDataLayout());
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(N), NVT, SVInVec,
|
||||
DAG.getConstant(OrigElt, SDLoc(SVOp), IndexTy));
|
||||
}
|
||||
@ -12078,10 +12079,13 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {
|
||||
|
||||
// Try to replace VecIn1 with two extract_subvectors
|
||||
// No need to update the masks, they should still be correct.
|
||||
VecIn2 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1,
|
||||
DAG.getConstant(VT.getVectorNumElements(), dl, TLI.getVectorIdxTy()));
|
||||
VecIn1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy()));
|
||||
VecIn2 = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1,
|
||||
DAG.getConstant(VT.getVectorNumElements(), dl,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
VecIn1 = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
} else
|
||||
return SDValue();
|
||||
}
|
||||
@ -13357,8 +13361,9 @@ SDValue DAGCombiner::SimplifySelectCC(SDLoc DL, SDValue N0, SDValue N1,
|
||||
|
||||
// Create a ConstantArray of the two constants.
|
||||
Constant *CA = ConstantArray::get(ArrayType::get(FPTy, 2), Elts);
|
||||
SDValue CPIdx = DAG.getConstantPool(CA, TLI.getPointerTy(),
|
||||
TD.getPrefTypeAlignment(FPTy));
|
||||
SDValue CPIdx =
|
||||
DAG.getConstantPool(CA, TLI.getPointerTy(DAG.getDataLayout()),
|
||||
TD.getPrefTypeAlignment(FPTy));
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
|
||||
// Get the offsets to the 0 and 1 element of the array so that we can
|
||||
|
@ -166,7 +166,7 @@ bool FastISel::hasTrivialKill(const Value *V) {
|
||||
}
|
||||
|
||||
unsigned FastISel::getRegForValue(const Value *V) {
|
||||
EVT RealVT = TLI.getValueType(V->getType(), /*AllowUnknown=*/true);
|
||||
EVT RealVT = TLI.getValueType(DL, V->getType(), /*AllowUnknown=*/true);
|
||||
// Don't handle non-simple values in FastISel.
|
||||
if (!RealVT.isSimple())
|
||||
return 0;
|
||||
@ -228,7 +228,7 @@ unsigned FastISel::materializeConstant(const Value *V, MVT VT) {
|
||||
if (!Reg) {
|
||||
// Try to emit the constant by using an integer constant with a cast.
|
||||
const APFloat &Flt = CF->getValueAPF();
|
||||
EVT IntVT = TLI.getPointerTy();
|
||||
EVT IntVT = TLI.getPointerTy(DL);
|
||||
|
||||
uint64_t x[2];
|
||||
uint32_t IntBitWidth = IntVT.getSizeInBits();
|
||||
@ -321,7 +321,7 @@ std::pair<unsigned, bool> FastISel::getRegForGEPIndex(const Value *Idx) {
|
||||
bool IdxNIsKill = hasTrivialKill(Idx);
|
||||
|
||||
// If the index is smaller or larger than intptr_t, truncate or extend it.
|
||||
MVT PtrVT = TLI.getPointerTy();
|
||||
MVT PtrVT = TLI.getPointerTy(DL);
|
||||
EVT IdxVT = EVT::getEVT(Idx->getType(), /*HandleUnknown=*/false);
|
||||
if (IdxVT.bitsLT(PtrVT)) {
|
||||
IdxN = fastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::SIGN_EXTEND, IdxN,
|
||||
@ -493,7 +493,7 @@ bool FastISel::selectGetElementPtr(const User *I) {
|
||||
// FIXME: What's a good SWAG number for MaxOffs?
|
||||
uint64_t MaxOffs = 2048;
|
||||
Type *Ty = I->getOperand(0)->getType();
|
||||
MVT VT = TLI.getPointerTy();
|
||||
MVT VT = TLI.getPointerTy(DL);
|
||||
for (GetElementPtrInst::const_op_iterator OI = I->op_begin() + 1,
|
||||
E = I->op_end();
|
||||
OI != E; ++OI) {
|
||||
@ -1245,8 +1245,8 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {
|
||||
}
|
||||
|
||||
bool FastISel::selectCast(const User *I, unsigned Opcode) {
|
||||
EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(I->getType());
|
||||
EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(DL, I->getType());
|
||||
|
||||
if (SrcVT == MVT::Other || !SrcVT.isSimple() || DstVT == MVT::Other ||
|
||||
!DstVT.isSimple())
|
||||
@ -1288,8 +1288,8 @@ bool FastISel::selectBitCast(const User *I) {
|
||||
}
|
||||
|
||||
// Bitcasts of other values become reg-reg copies or BITCAST operators.
|
||||
EVT SrcEVT = TLI.getValueType(I->getOperand(0)->getType());
|
||||
EVT DstEVT = TLI.getValueType(I->getType());
|
||||
EVT SrcEVT = TLI.getValueType(DL, I->getOperand(0)->getType());
|
||||
EVT DstEVT = TLI.getValueType(DL, I->getType());
|
||||
if (SrcEVT == MVT::Other || DstEVT == MVT::Other ||
|
||||
!TLI.isTypeLegal(SrcEVT) || !TLI.isTypeLegal(DstEVT))
|
||||
// Unhandled type. Halt "fast" selection and bail.
|
||||
@ -1413,7 +1413,7 @@ bool FastISel::selectFNeg(const User *I) {
|
||||
bool OpRegIsKill = hasTrivialKill(I);
|
||||
|
||||
// If the target has ISD::FNEG, use it.
|
||||
EVT VT = TLI.getValueType(I->getType());
|
||||
EVT VT = TLI.getValueType(DL, I->getType());
|
||||
unsigned ResultReg = fastEmit_r(VT.getSimpleVT(), VT.getSimpleVT(), ISD::FNEG,
|
||||
OpReg, OpRegIsKill);
|
||||
if (ResultReg) {
|
||||
@ -1456,7 +1456,7 @@ bool FastISel::selectExtractValue(const User *U) {
|
||||
|
||||
// Make sure we only try to handle extracts with a legal result. But also
|
||||
// allow i1 because it's easy.
|
||||
EVT RealVT = TLI.getValueType(EVI->getType(), /*AllowUnknown=*/true);
|
||||
EVT RealVT = TLI.getValueType(DL, EVI->getType(), /*AllowUnknown=*/true);
|
||||
if (!RealVT.isSimple())
|
||||
return false;
|
||||
MVT VT = RealVT.getSimpleVT();
|
||||
@ -1582,8 +1582,8 @@ bool FastISel::selectOperator(const User *I, unsigned Opcode) {
|
||||
|
||||
case Instruction::IntToPtr: // Deliberate fall-through.
|
||||
case Instruction::PtrToInt: {
|
||||
EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(I->getType());
|
||||
EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(DL, I->getType());
|
||||
if (DstVT.bitsGT(SrcVT))
|
||||
return selectCast(I, ISD::ZERO_EXTEND);
|
||||
if (DstVT.bitsLT(SrcVT))
|
||||
@ -2037,7 +2037,7 @@ bool FastISel::handlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
// own moves. Second, this check is necessary because FastISel doesn't
|
||||
// use CreateRegs to create registers, so it always creates
|
||||
// exactly one register for each non-void instruction.
|
||||
EVT VT = TLI.getValueType(PN->getType(), /*AllowUnknown=*/true);
|
||||
EVT VT = TLI.getValueType(DL, PN->getType(), /*AllowUnknown=*/true);
|
||||
if (VT == MVT::Other || !TLI.isTypeLegal(VT)) {
|
||||
// Handle integer promotions, though, because they're common and easy.
|
||||
if (!(VT == MVT::i1 || VT == MVT::i8 || VT == MVT::i16)) {
|
||||
|
@ -65,7 +65,7 @@ class SelectionDAGLegalize {
|
||||
SmallSetVector<SDNode *, 16> *UpdatedNodes;
|
||||
|
||||
EVT getSetCCResultType(EVT VT) const {
|
||||
return TLI.getSetCCResultType(*DAG.getContext(), VT);
|
||||
return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
|
||||
}
|
||||
|
||||
// Libcall insertion helpers.
|
||||
@ -269,7 +269,8 @@ SelectionDAGLegalize::ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP) {
|
||||
}
|
||||
}
|
||||
|
||||
SDValue CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy());
|
||||
SDValue CPIdx =
|
||||
DAG.getConstantPool(LLVMC, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
if (Extend) {
|
||||
SDValue Result =
|
||||
@ -331,7 +332,8 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
SDValue Store = DAG.getTruncStore(Chain, dl,
|
||||
Val, StackPtr, MachinePointerInfo(),
|
||||
StoredVT, false, false, 0);
|
||||
SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy(AS));
|
||||
SDValue Increment = DAG.getConstant(
|
||||
RegBytes, dl, TLI.getPointerTy(DAG.getDataLayout(), AS));
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
unsigned Offset = 0;
|
||||
|
||||
@ -398,7 +400,8 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
ST->isVolatile(), ST->isNonTemporal(), Alignment);
|
||||
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl, TLI.getPointerTy(AS)));
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout(), AS)));
|
||||
Alignment = MinAlign(Alignment, IncrementSize);
|
||||
Store2 = DAG.getTruncStore(
|
||||
Chain, dl, DAG.getDataLayout().isLittleEndian() ? Hi : Lo, Ptr,
|
||||
@ -449,7 +452,8 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
// Make sure the stack slot is also aligned for the register type.
|
||||
SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
|
||||
|
||||
SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy());
|
||||
SDValue Increment =
|
||||
DAG.getConstant(RegBytes, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
SDValue StackPtr = StackBase;
|
||||
unsigned Offset = 0;
|
||||
@ -582,7 +586,7 @@ PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
|
||||
EVT VT = Tmp1.getValueType();
|
||||
EVT EltVT = VT.getVectorElementType();
|
||||
EVT IdxVT = Tmp3.getValueType();
|
||||
EVT PtrVT = TLI.getPointerTy();
|
||||
EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(VT);
|
||||
|
||||
int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
|
||||
@ -1442,7 +1446,7 @@ SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
|
||||
Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx,
|
||||
DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType()));
|
||||
|
||||
Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy());
|
||||
Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
StackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, StackPtr);
|
||||
|
||||
SDValue NewLoad;
|
||||
@ -1494,7 +1498,7 @@ SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {
|
||||
|
||||
Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx,
|
||||
DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType()));
|
||||
Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy());
|
||||
Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
SDValue SubStackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx,
|
||||
StackPtr);
|
||||
@ -1574,7 +1578,7 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
||||
} else {
|
||||
auto &DL = DAG.getDataLayout();
|
||||
// Store the float to memory, then load the sign part out as an integer.
|
||||
MVT LoadTy = TLI.getPointerTy();
|
||||
MVT LoadTy = TLI.getPointerTy(DL);
|
||||
// First create a temporary that is aligned for both the load and store.
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(FloatVT, LoadTy);
|
||||
// Then store the float to it.
|
||||
@ -1997,7 +2001,8 @@ SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {
|
||||
}
|
||||
}
|
||||
Constant *CP = ConstantVector::get(CV);
|
||||
SDValue CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy());
|
||||
SDValue CPIdx =
|
||||
DAG.getConstantPool(CP, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
return DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
@ -2061,7 +2066,7 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
|
||||
Args.push_back(Entry);
|
||||
}
|
||||
SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
|
||||
TLI.getPointerTy());
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext());
|
||||
|
||||
@ -2109,7 +2114,7 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, EVT RetVT,
|
||||
Args.push_back(Entry);
|
||||
}
|
||||
SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
|
||||
TLI.getPointerTy());
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
|
||||
|
||||
@ -2143,7 +2148,7 @@ SelectionDAGLegalize::ExpandChainLibCall(RTLIB::Libcall LC,
|
||||
Args.push_back(Entry);
|
||||
}
|
||||
SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
|
||||
TLI.getPointerTy());
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext());
|
||||
|
||||
@ -2280,7 +2285,7 @@ SelectionDAGLegalize::ExpandDivRemLibCall(SDNode *Node,
|
||||
Args.push_back(Entry);
|
||||
|
||||
SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
|
||||
TLI.getPointerTy());
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
SDLoc dl(Node);
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
@ -2392,7 +2397,7 @@ SelectionDAGLegalize::ExpandSinCosLibCall(SDNode *Node,
|
||||
Args.push_back(Entry);
|
||||
|
||||
SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
|
||||
TLI.getPointerTy());
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
SDLoc dl(Node);
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
@ -2592,7 +2597,8 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
Constant *FudgeFactor = ConstantInt::get(
|
||||
Type::getInt64Ty(*DAG.getContext()), FF);
|
||||
|
||||
SDValue CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy());
|
||||
SDValue CPIdx =
|
||||
DAG.getConstantPool(FudgeFactor, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
CPIdx = DAG.getNode(ISD::ADD, dl, CPIdx.getValueType(), CPIdx, CstOffset);
|
||||
Alignment = std::min(Alignment, 4u);
|
||||
@ -2907,10 +2913,12 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
TargetLowering::ArgListTy Args;
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(Node->getOperand(0))
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__sync_synchronize",
|
||||
TLI.getPointerTy()), std::move(Args), 0);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Node->getOperand(0))
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__sync_synchronize",
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args), 0);
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
|
||||
@ -3006,10 +3014,12 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// If this operation is not supported, lower it to 'abort()' call
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(Node->getOperand(0))
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("abort", TLI.getPointerTy()),
|
||||
std::move(Args), 0);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Node->getOperand(0))
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("abort",
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args), 0);
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
|
||||
Results.push_back(CallResult.second);
|
||||
@ -3096,9 +3106,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp2 = Node->getOperand(1);
|
||||
unsigned Align = Node->getConstantOperandVal(3);
|
||||
|
||||
SDValue VAListLoad = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2,
|
||||
MachinePointerInfo(V),
|
||||
false, false, false, 0);
|
||||
SDValue VAListLoad =
|
||||
DAG.getLoad(TLI.getPointerTy(DAG.getDataLayout()), dl, Tmp1, Tmp2,
|
||||
MachinePointerInfo(V), false, false, false, 0);
|
||||
SDValue VAList = VAListLoad;
|
||||
|
||||
if (Align > TLI.getMinStackArgumentAlignment()) {
|
||||
@ -3132,9 +3142,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// output, returning the chain.
|
||||
const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
|
||||
const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
|
||||
Tmp1 = DAG.getLoad(TLI.getPointerTy(), dl, Node->getOperand(0),
|
||||
Node->getOperand(2), MachinePointerInfo(VS),
|
||||
false, false, false, 0);
|
||||
Tmp1 = DAG.getLoad(TLI.getPointerTy(DAG.getDataLayout()), dl,
|
||||
Node->getOperand(0), Node->getOperand(2),
|
||||
MachinePointerInfo(VS), false, false, false, 0);
|
||||
Tmp1 = DAG.getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
|
||||
MachinePointerInfo(VD), false, false, 0);
|
||||
Results.push_back(Tmp1);
|
||||
@ -3229,14 +3239,14 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
}
|
||||
unsigned Idx = Mask[i];
|
||||
if (Idx < NumElems)
|
||||
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT,
|
||||
Op0,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())));
|
||||
Ops.push_back(DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Op0,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));
|
||||
else
|
||||
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT,
|
||||
Op1,
|
||||
DAG.getConstant(Idx - NumElems, dl,
|
||||
TLI.getVectorIdxTy())));
|
||||
Ops.push_back(DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Op1,
|
||||
DAG.getConstant(Idx - NumElems, dl,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout()))));
|
||||
}
|
||||
|
||||
Tmp1 = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);
|
||||
@ -3762,12 +3772,14 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// The high part is obtained by SRA'ing all but one of the bits of low
|
||||
// part.
|
||||
unsigned LoSize = VT.getSizeInBits();
|
||||
SDValue HiLHS = DAG.getNode(ISD::SRA, dl, VT, RHS,
|
||||
DAG.getConstant(LoSize - 1, dl,
|
||||
TLI.getPointerTy()));
|
||||
SDValue HiRHS = DAG.getNode(ISD::SRA, dl, VT, LHS,
|
||||
DAG.getConstant(LoSize - 1, dl,
|
||||
TLI.getPointerTy()));
|
||||
SDValue HiLHS =
|
||||
DAG.getNode(ISD::SRA, dl, VT, RHS,
|
||||
DAG.getConstant(LoSize - 1, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
SDValue HiRHS =
|
||||
DAG.getNode(ISD::SRA, dl, VT, LHS,
|
||||
DAG.getConstant(LoSize - 1, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
|
||||
// Here we're passing the 2 arguments explicitly as 4 arguments that are
|
||||
// pre-lowered to the correct types. This all depends upon WideVT not
|
||||
@ -3831,7 +3843,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
SDValue Table = Node->getOperand(1);
|
||||
SDValue Index = Node->getOperand(2);
|
||||
|
||||
EVT PTy = TLI.getPointerTy();
|
||||
EVT PTy = TLI.getPointerTy(DAG.getDataLayout());
|
||||
|
||||
const DataLayout &TD = DAG.getDataLayout();
|
||||
unsigned EntrySize =
|
||||
@ -3939,7 +3951,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
assert(!TLI.isOperationExpand(ISD::SELECT, VT) &&
|
||||
"Cannot expand ISD::SELECT_CC when ISD::SELECT also needs to be "
|
||||
"expanded.");
|
||||
EVT CCVT = TLI.getSetCCResultType(*DAG.getContext(), CmpVT);
|
||||
EVT CCVT =
|
||||
TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), CmpVT);
|
||||
SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC);
|
||||
Results.push_back(DAG.getSelect(dl, VT, Cond, Tmp3, Tmp4));
|
||||
break;
|
||||
@ -4039,14 +4052,12 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
|
||||
SmallVector<SDValue, 8> Scalars;
|
||||
for (unsigned Idx = 0; Idx < NumElem; Idx++) {
|
||||
SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
VT.getScalarType(),
|
||||
Node->getOperand(0),
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()));
|
||||
SDValue Sh = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
VT.getScalarType(),
|
||||
Node->getOperand(1),
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()));
|
||||
SDValue Ex = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, VT.getScalarType(), Node->getOperand(0),
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
SDValue Sh = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, VT.getScalarType(), Node->getOperand(1),
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
Scalars.push_back(DAG.getNode(Node->getOpcode(), dl,
|
||||
VT.getScalarType(), Ex, Sh));
|
||||
}
|
||||
|
@ -809,8 +809,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {
|
||||
SDValue Part = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[i]);
|
||||
// Shift it to the right position and "or" it in.
|
||||
Part = DAG.getNode(ISD::SHL, dl, NVT, Part,
|
||||
DAG.getConstant(i*RegVT.getSizeInBits(), dl,
|
||||
TLI.getPointerTy()));
|
||||
DAG.getConstant(i * RegVT.getSizeInBits(), dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
Res = DAG.getNode(ISD::OR, dl, NVT, Res, Part);
|
||||
}
|
||||
|
||||
@ -1004,7 +1004,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) {
|
||||
|
||||
Hi = DAG.getNode(ISD::SHL, dl, N->getValueType(0), Hi,
|
||||
DAG.getConstant(OVT.getSizeInBits(), dl,
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
return DAG.getNode(ISD::OR, dl, N->getValueType(0), Lo, Hi);
|
||||
}
|
||||
|
||||
@ -1063,7 +1063,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
|
||||
|
||||
// Promote the index.
|
||||
SDValue Idx = DAG.getZExtOrTrunc(N->getOperand(2), SDLoc(N),
|
||||
TLI.getVectorIdxTy());
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout()));
|
||||
return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0),
|
||||
N->getOperand(1), Idx), 0);
|
||||
}
|
||||
@ -1808,7 +1808,8 @@ void DAGTypeLegalizer::ExpandIntRes_AssertSext(SDNode *N,
|
||||
Lo = DAG.getNode(ISD::AssertSext, dl, NVT, Lo, DAG.getValueType(EVT));
|
||||
// The high part replicates the sign bit of Lo, make it explicit.
|
||||
Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
|
||||
DAG.getConstant(NVTBits - 1, dl, TLI.getPointerTy()));
|
||||
DAG.getConstant(NVTBits - 1, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1975,7 +1976,8 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
// lo part.
|
||||
unsigned LoSize = Lo.getValueType().getSizeInBits();
|
||||
Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
|
||||
DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy()));
|
||||
DAG.getConstant(LoSize - 1, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
} else if (ExtType == ISD::ZEXTLOAD) {
|
||||
// The high part is just a zero.
|
||||
Hi = DAG.getConstant(0, dl, NVT);
|
||||
@ -2039,15 +2041,16 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
|
||||
if (ExcessBits < NVT.getSizeInBits()) {
|
||||
// Transfer low bits from the bottom of Hi to the top of Lo.
|
||||
Lo = DAG.getNode(ISD::OR, dl, NVT, Lo,
|
||||
DAG.getNode(ISD::SHL, dl, NVT, Hi,
|
||||
DAG.getConstant(ExcessBits, dl,
|
||||
TLI.getPointerTy())));
|
||||
Lo = DAG.getNode(
|
||||
ISD::OR, dl, NVT, Lo,
|
||||
DAG.getNode(ISD::SHL, dl, NVT, Hi,
|
||||
DAG.getConstant(ExcessBits, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()))));
|
||||
// Move high bits to the right position in Hi.
|
||||
Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl,
|
||||
NVT, Hi,
|
||||
Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl, NVT,
|
||||
Hi,
|
||||
DAG.getConstant(NVT.getSizeInBits() - ExcessBits, dl,
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2276,8 +2279,9 @@ void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(SDNode *N,
|
||||
Lo = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, N->getOperand(0));
|
||||
// The high part is obtained by SRA'ing all but one of the bits of low part.
|
||||
unsigned LoSize = NVT.getSizeInBits();
|
||||
Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
|
||||
DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy()));
|
||||
Hi = DAG.getNode(
|
||||
ISD::SRA, dl, NVT, Lo,
|
||||
DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy(DAG.getDataLayout())));
|
||||
} else {
|
||||
// For example, extension of an i48 to an i64. The operand type necessarily
|
||||
// promotes to the result type, so will end up being expanded too.
|
||||
@ -2312,7 +2316,7 @@ ExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
// things like sextinreg V:i64 from i8.
|
||||
Hi = DAG.getNode(ISD::SRA, dl, Hi.getValueType(), Lo,
|
||||
DAG.getConstant(Hi.getValueType().getSizeInBits() - 1, dl,
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
} else {
|
||||
// For example, extension of an i48 to an i64. Leave the low part alone,
|
||||
// sext_inreg the high part.
|
||||
@ -2355,10 +2359,10 @@ void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(SDNode *N,
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDLoc dl(N);
|
||||
Lo = DAG.getNode(ISD::TRUNCATE, dl, NVT, N->getOperand(0));
|
||||
Hi = DAG.getNode(ISD::SRL, dl,
|
||||
N->getOperand(0).getValueType(), N->getOperand(0),
|
||||
Hi = DAG.getNode(ISD::SRL, dl, N->getOperand(0).getValueType(),
|
||||
N->getOperand(0),
|
||||
DAG.getConstant(NVT.getSizeInBits(), dl,
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
Hi = DAG.getNode(ISD::TRUNCATE, dl, NVT, Hi);
|
||||
}
|
||||
|
||||
@ -2414,7 +2418,7 @@ void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N,
|
||||
}
|
||||
|
||||
Type *RetTy = VT.getTypeForEVT(*DAG.getContext());
|
||||
EVT PtrVT = TLI.getPointerTy();
|
||||
EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
Type *PtrTy = PtrVT.getTypeForEVT(*DAG.getContext());
|
||||
|
||||
// Replace this with a libcall that will check overflow.
|
||||
@ -2882,11 +2886,12 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
// Transfer high bits from the top of Lo to the bottom of Hi.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi,
|
||||
DAG.getConstant(NVT.getSizeInBits() - ExcessBits, dl,
|
||||
TLI.getPointerTy()));
|
||||
Hi = DAG.getNode(ISD::OR, dl, NVT, Hi,
|
||||
DAG.getNode(ISD::SRL, dl, NVT, Lo,
|
||||
DAG.getConstant(ExcessBits, dl,
|
||||
TLI.getPointerTy())));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
Hi = DAG.getNode(
|
||||
ISD::OR, dl, NVT, Hi,
|
||||
DAG.getNode(ISD::SRL, dl, NVT, Lo,
|
||||
DAG.getConstant(ExcessBits, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()))));
|
||||
}
|
||||
|
||||
// Store both the high bits and maybe some of the low bits.
|
||||
@ -2956,9 +2961,9 @@ SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
|
||||
ISD::SETLT);
|
||||
|
||||
// Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
|
||||
SDValue FudgePtr = DAG.getConstantPool(
|
||||
ConstantInt::get(*DAG.getContext(), FF.zext(64)),
|
||||
TLI.getPointerTy());
|
||||
SDValue FudgePtr =
|
||||
DAG.getConstantPool(ConstantInt::get(*DAG.getContext(), FF.zext(64)),
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
// Get a pointer to FF if the sign bit was set, or to 0 otherwise.
|
||||
SDValue Zero = DAG.getIntPtrConstant(0, dl);
|
||||
@ -3114,9 +3119,9 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(SDNode *N) {
|
||||
for (unsigned i = 0; i < NumOperands; ++i) {
|
||||
SDValue Op = N->getOperand(i);
|
||||
for (unsigned j = 0; j < NumElem; ++j) {
|
||||
SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
InElemTy, Op, DAG.getConstant(j, dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
SDValue Ext = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, InElemTy, Op,
|
||||
DAG.getConstant(j, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
Ops[i * NumElem + j] = DAG.getNode(ISD::ANY_EXTEND, dl, OutElemTy, Ext);
|
||||
}
|
||||
}
|
||||
@ -3143,7 +3148,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) {
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N) {
|
||||
SDLoc dl(N);
|
||||
SDValue V0 = GetPromotedInteger(N->getOperand(0));
|
||||
SDValue V1 = DAG.getZExtOrTrunc(N->getOperand(1), dl, TLI.getVectorIdxTy());
|
||||
SDValue V1 = DAG.getZExtOrTrunc(N->getOperand(1), dl,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout()));
|
||||
SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
V0->getValueType(0).getScalarType(), V0, V1);
|
||||
|
||||
@ -3180,8 +3186,9 @@ SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(SDNode *N) {
|
||||
|
||||
for (unsigned i=0; i<NumElem; ++i) {
|
||||
// Extract element from incoming vector
|
||||
SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, SclrTy,
|
||||
Incoming, DAG.getConstant(i, dl, TLI.getVectorIdxTy()));
|
||||
SDValue Ex = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, SclrTy, Incoming,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
SDValue Tr = DAG.getNode(ISD::TRUNCATE, dl, RetSclrTy, Ex);
|
||||
NewOps.push_back(Tr);
|
||||
}
|
||||
|
@ -1006,7 +1006,7 @@ SDValue DAGTypeLegalizer::GetVectorElementPointer(SDValue VecPtr, EVT EltVT,
|
||||
SDValue Index) {
|
||||
SDLoc dl(Index);
|
||||
// Make sure the index type is big enough to compute in.
|
||||
Index = DAG.getZExtOrTrunc(Index, dl, TLI.getPointerTy());
|
||||
Index = DAG.getZExtOrTrunc(Index, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
// Calculate the element offset and add it to the pointer.
|
||||
unsigned EltSize = EltVT.getSizeInBits() / 8; // FIXME: should be ABI size.
|
||||
@ -1030,7 +1030,7 @@ SDValue DAGTypeLegalizer::JoinIntegers(SDValue Lo, SDValue Hi) {
|
||||
Hi = DAG.getNode(ISD::ANY_EXTEND, dlHi, NVT, Hi);
|
||||
Hi = DAG.getNode(ISD::SHL, dlHi, NVT, Hi,
|
||||
DAG.getConstant(LVT.getSizeInBits(), dlHi,
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
return DAG.getNode(ISD::OR, dlHi, NVT, Lo, Hi);
|
||||
}
|
||||
|
||||
@ -1079,7 +1079,7 @@ DAGTypeLegalizer::ExpandChainLibCall(RTLIB::Libcall LC,
|
||||
Args.push_back(Entry);
|
||||
}
|
||||
SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
|
||||
TLI.getPointerTy());
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext());
|
||||
|
||||
@ -1117,7 +1117,7 @@ void DAGTypeLegalizer::SplitInteger(SDValue Op,
|
||||
Lo = DAG.getNode(ISD::TRUNCATE, dl, LoVT, Op);
|
||||
Hi = DAG.getNode(ISD::SRL, dl, Op.getValueType(), Op,
|
||||
DAG.getConstant(LoVT.getSizeInBits(), dl,
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
Hi = DAG.getNode(ISD::TRUNCATE, dl, HiVT, Hi);
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ private:
|
||||
}
|
||||
|
||||
EVT getSetCCResultType(EVT VT) const {
|
||||
return TLI.getSetCCResultType(*DAG.getContext(), VT);
|
||||
return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
|
||||
}
|
||||
|
||||
/// IgnoreNodeResults - Pretend all of this node's results are legal.
|
||||
|
@ -121,9 +121,9 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
|
||||
SmallVector<SDValue, 8> Vals;
|
||||
for (unsigned i = 0; i < NumElems; ++i)
|
||||
Vals.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ElemVT,
|
||||
CastInOp, DAG.getConstant(i, dl,
|
||||
TLI.getVectorIdxTy())));
|
||||
Vals.push_back(DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, ElemVT, CastInOp,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));
|
||||
|
||||
// Build Lo, Hi pair by pairing extracted elements if needed.
|
||||
unsigned Slot = 0;
|
||||
|
@ -503,7 +503,7 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
|
||||
// Instead, we load all significant words, mask bits off, and concatenate
|
||||
// them to form each element. Finally, they are extended to destination
|
||||
// scalar type to build the destination vector.
|
||||
EVT WideVT = TLI.getPointerTy();
|
||||
EVT WideVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
|
||||
assert(WideVT.isRound() &&
|
||||
"Could not handle the sophisticated case when the widest integer is"
|
||||
@ -663,8 +663,9 @@ SDValue VectorLegalizer::ExpandStore(SDValue Op) {
|
||||
// and save them into memory individually.
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
for (unsigned Idx = 0; Idx < NumElem; Idx++) {
|
||||
SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
RegSclVT, Value, DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()));
|
||||
SDValue Ex = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, RegSclVT, Value,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
|
||||
// This scalar TruncStore may be illegal, but we legalize it later.
|
||||
SDValue Store = DAG.getTruncStore(Chain, dl, Ex, BasePTR,
|
||||
@ -995,12 +996,15 @@ SDValue VectorLegalizer::UnrollVSETCC(SDValue Op) {
|
||||
SDLoc dl(Op);
|
||||
SmallVector<SDValue, 8> Ops(NumElems);
|
||||
for (unsigned i = 0; i < NumElems; ++i) {
|
||||
SDValue LHSElem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, LHS,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy()));
|
||||
SDValue RHSElem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, RHS,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy()));
|
||||
SDValue LHSElem = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, LHS,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
SDValue RHSElem = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, RHS,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
Ops[i] = DAG.getNode(ISD::SETCC, dl,
|
||||
TLI.getSetCCResultType(*DAG.getContext(), TmpEltVT),
|
||||
TLI.getSetCCResultType(DAG.getDataLayout(),
|
||||
*DAG.getContext(), TmpEltVT),
|
||||
LHSElem, RHSElem, CC);
|
||||
Ops[i] = DAG.getSelect(dl, EltVT, Ops[i],
|
||||
DAG.getConstant(APInt::getAllOnesValue
|
||||
|
@ -251,8 +251,9 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_UnaryOp(SDNode *N) {
|
||||
Op = GetScalarizedVector(Op);
|
||||
} else {
|
||||
EVT VT = OpVT.getVectorElementType();
|
||||
Op = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Op,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
Op = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, VT, Op,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
return DAG.getNode(N->getOpcode(), SDLoc(N), DestVT, Op);
|
||||
}
|
||||
@ -384,10 +385,12 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_VSETCC(SDNode *N) {
|
||||
RHS = GetScalarizedVector(RHS);
|
||||
} else {
|
||||
EVT VT = OpVT.getVectorElementType();
|
||||
LHS = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, LHS,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
RHS = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, RHS,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
LHS = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, VT, LHS,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
RHS = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, VT, RHS,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
|
||||
// Turn it into a scalar SETCC.
|
||||
@ -819,7 +822,7 @@ void DAGTypeLegalizer::SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo,
|
||||
uint64_t IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue();
|
||||
Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, HiVT, Vec,
|
||||
DAG.getConstant(IdxVal + LoVT.getVectorNumElements(), dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
|
||||
void DAGTypeLegalizer::SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo,
|
||||
@ -898,9 +901,10 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
|
||||
Lo = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl,
|
||||
Lo.getValueType(), Lo, Elt, Idx);
|
||||
else
|
||||
Hi = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, Hi.getValueType(), Hi, Elt,
|
||||
DAG.getConstant(IdxVal - LoNumElts, dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
Hi =
|
||||
DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, Hi.getValueType(), Hi, Elt,
|
||||
DAG.getConstant(IdxVal - LoNumElts, dl,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1291,10 +1295,9 @@ void DAGTypeLegalizer::SplitVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N,
|
||||
Idx -= Input * NewElts;
|
||||
|
||||
// Extract the vector element by hand.
|
||||
SVOps.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT,
|
||||
Inputs[Input],
|
||||
DAG.getConstant(Idx, dl,
|
||||
TLI.getVectorIdxTy())));
|
||||
SVOps.push_back(DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Inputs[Input],
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));
|
||||
}
|
||||
|
||||
// Construct the Lo/Hi output using a BUILD_VECTOR.
|
||||
@ -1762,9 +1765,9 @@ SDValue DAGTypeLegalizer::SplitVecOp_CONCAT_VECTORS(SDNode *N) {
|
||||
for (const SDValue &Op : N->op_values()) {
|
||||
for (unsigned i = 0, e = Op.getValueType().getVectorNumElements();
|
||||
i != e; ++i) {
|
||||
Elts.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT,
|
||||
Op, DAG.getConstant(i, DL, TLI.getVectorIdxTy())));
|
||||
|
||||
Elts.push_back(DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Op,
|
||||
DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1828,10 +1831,11 @@ SDValue DAGTypeLegalizer::SplitVecOp_TruncateHelper(SDNode *N) {
|
||||
// type. This should normally be something that ends up being legal directly,
|
||||
// but in theory if a target has very wide vectors and an annoyingly
|
||||
// restricted set of legal types, this split can chain to build things up.
|
||||
return IsFloat ?
|
||||
DAG.getNode(ISD::FP_ROUND, DL, OutVT, InterVec,
|
||||
DAG.getTargetConstant(0, DL, TLI.getPointerTy())) :
|
||||
DAG.getNode(ISD::TRUNCATE, DL, OutVT, InterVec);
|
||||
return IsFloat
|
||||
? DAG.getNode(ISD::FP_ROUND, DL, OutVT, InterVec,
|
||||
DAG.getTargetConstant(
|
||||
0, DL, TLI.getPointerTy(DAG.getDataLayout())))
|
||||
: DAG.getNode(ISD::TRUNCATE, DL, OutVT, InterVec);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SplitVecOp_VSETCC(SDNode *N) {
|
||||
@ -2061,12 +2065,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {
|
||||
// }
|
||||
while (CurNumElts != 0) {
|
||||
while (CurNumElts >= NumElts) {
|
||||
SDValue EOp1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, InOp1,
|
||||
DAG.getConstant(Idx, dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
SDValue EOp2 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, InOp2,
|
||||
DAG.getConstant(Idx, dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
SDValue EOp1 = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, VT, InOp1,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
SDValue EOp2 = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, VT, InOp2,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
ConcatOps[ConcatEnd++] = DAG.getNode(Opcode, dl, VT, EOp1, EOp2);
|
||||
Idx += NumElts;
|
||||
CurNumElts -= NumElts;
|
||||
@ -2078,14 +2082,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {
|
||||
|
||||
if (NumElts == 1) {
|
||||
for (unsigned i = 0; i != CurNumElts; ++i, ++Idx) {
|
||||
SDValue EOp1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT,
|
||||
InOp1,
|
||||
DAG.getConstant(Idx, dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
SDValue EOp2 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT,
|
||||
InOp2,
|
||||
DAG.getConstant(Idx, dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
SDValue EOp1 = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT, InOp1,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
SDValue EOp2 = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT, InOp2,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
ConcatOps[ConcatEnd++] = DAG.getNode(Opcode, dl, WidenEltVT,
|
||||
EOp1, EOp2);
|
||||
}
|
||||
@ -2122,9 +2124,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {
|
||||
SDValue VecOp = DAG.getUNDEF(NextVT);
|
||||
unsigned NumToInsert = ConcatEnd - Idx - 1;
|
||||
for (unsigned i = 0, OpIdx = Idx+1; i < NumToInsert; i++, OpIdx++) {
|
||||
VecOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NextVT, VecOp,
|
||||
ConcatOps[OpIdx],
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy()));
|
||||
VecOp = DAG.getNode(
|
||||
ISD::INSERT_VECTOR_ELT, dl, NextVT, VecOp, ConcatOps[OpIdx],
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
ConcatOps[Idx+1] = VecOp;
|
||||
ConcatEnd = Idx + 2;
|
||||
@ -2210,8 +2212,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
|
||||
}
|
||||
|
||||
if (InVTNumElts % WidenNumElts == 0) {
|
||||
SDValue InVal = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, InWidenVT, InOp,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
SDValue InVal = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, DL, InWidenVT, InOp,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
// Extract the input and convert the shorten input vector.
|
||||
if (N->getNumOperands() == 1)
|
||||
return DAG.getNode(Opcode, DL, WidenVT, InVal);
|
||||
@ -2225,8 +2228,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
|
||||
unsigned MinElts = std::min(InVTNumElts, WidenNumElts);
|
||||
unsigned i;
|
||||
for (i=0; i < MinElts; ++i) {
|
||||
SDValue Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, InEltVT, InOp,
|
||||
DAG.getConstant(i, DL, TLI.getVectorIdxTy()));
|
||||
SDValue Val = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, InEltVT, InOp,
|
||||
DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
if (N->getNumOperands() == 1)
|
||||
Ops[i] = DAG.getNode(Opcode, DL, EltVT, Val);
|
||||
else
|
||||
@ -2452,8 +2456,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONCAT_VECTORS(SDNode *N) {
|
||||
if (InputWidened)
|
||||
InOp = GetWidenedVector(InOp);
|
||||
for (unsigned j=0; j < NumInElts; ++j)
|
||||
Ops[Idx++] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(j, dl, TLI.getVectorIdxTy()));
|
||||
Ops[Idx++] = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(j, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
SDValue UndefVal = DAG.getUNDEF(EltVT);
|
||||
for (; Idx < WidenNumElts; ++Idx)
|
||||
@ -2510,8 +2515,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONVERT_RNDSAT(SDNode *N) {
|
||||
|
||||
if (InVTNumElts % WidenNumElts == 0) {
|
||||
// Extract the input and convert the shorten input vector.
|
||||
InOp = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, InWidenVT, InOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy()));
|
||||
InOp = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, InWidenVT, InOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
return DAG.getConvertRndSat(WidenVT, dl, InOp, DTyOp, STyOp, RndOp,
|
||||
SatOp, CvtCode);
|
||||
}
|
||||
@ -2526,8 +2532,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONVERT_RNDSAT(SDNode *N) {
|
||||
unsigned MinElts = std::min(InVTNumElts, WidenNumElts);
|
||||
unsigned i;
|
||||
for (i=0; i < MinElts; ++i) {
|
||||
SDValue ExtVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy()));
|
||||
SDValue ExtVal = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
Ops[i] = DAG.getConvertRndSat(WidenVT, dl, ExtVal, DTyOp, STyOp, RndOp,
|
||||
SatOp, CvtCode);
|
||||
}
|
||||
@ -2569,8 +2576,10 @@ SDValue DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
|
||||
unsigned NumElts = VT.getVectorNumElements();
|
||||
unsigned i;
|
||||
for (i=0; i < NumElts; ++i)
|
||||
Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(IdxVal + i, dl, TLI.getVectorIdxTy()));
|
||||
Ops[i] =
|
||||
DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(IdxVal + i, dl,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
|
||||
SDValue UndefVal = DAG.getUNDEF(EltVT);
|
||||
for (; i < WidenNumElts; ++i)
|
||||
@ -2871,12 +2880,13 @@ SDValue DAGTypeLegalizer::WidenVecOp_EXTEND(SDNode *N) {
|
||||
assert(FixedVT.getVectorNumElements() != InVT.getVectorNumElements() &&
|
||||
"We can't have the same type as we started with!");
|
||||
if (FixedVT.getVectorNumElements() > InVT.getVectorNumElements())
|
||||
InOp = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, FixedVT,
|
||||
DAG.getUNDEF(FixedVT), InOp,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
InOp = DAG.getNode(
|
||||
ISD::INSERT_SUBVECTOR, DL, FixedVT, DAG.getUNDEF(FixedVT), InOp,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
else
|
||||
InOp = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, FixedVT, InOp,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
InOp = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, DL, FixedVT, InOp,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2919,10 +2929,11 @@ SDValue DAGTypeLegalizer::WidenVecOp_Convert(SDNode *N) {
|
||||
unsigned Opcode = N->getOpcode();
|
||||
SmallVector<SDValue, 16> Ops(NumElts);
|
||||
for (unsigned i=0; i < NumElts; ++i)
|
||||
Ops[i] = DAG.getNode(Opcode, dl, EltVT,
|
||||
DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp,
|
||||
DAG.getConstant(i, dl,
|
||||
TLI.getVectorIdxTy())));
|
||||
Ops[i] = DAG.getNode(
|
||||
Opcode, dl, EltVT,
|
||||
DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));
|
||||
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);
|
||||
}
|
||||
@ -2942,8 +2953,9 @@ SDValue DAGTypeLegalizer::WidenVecOp_BITCAST(SDNode *N) {
|
||||
EVT NewVT = EVT::getVectorVT(*DAG.getContext(), VT, NewNumElts);
|
||||
if (TLI.isTypeLegal(NewVT)) {
|
||||
SDValue BitOp = DAG.getNode(ISD::BITCAST, dl, NewVT, InOp);
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, BitOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy()));
|
||||
return DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, VT, BitOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2970,8 +2982,9 @@ SDValue DAGTypeLegalizer::WidenVecOp_CONCAT_VECTORS(SDNode *N) {
|
||||
if (getTypeAction(InOp.getValueType()) == TargetLowering::TypeWidenVector)
|
||||
InOp = GetWidenedVector(InOp);
|
||||
for (unsigned j=0; j < NumInElts; ++j)
|
||||
Ops[Idx++] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(j, dl, TLI.getVectorIdxTy()));
|
||||
Ops[Idx++] = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(j, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);
|
||||
}
|
||||
@ -3052,7 +3065,8 @@ SDValue DAGTypeLegalizer::WidenVecOp_SETCC(SDNode *N) {
|
||||
|
||||
// Get a new SETCC node to compare the newly widened operands.
|
||||
// Only some of the compared elements are legal.
|
||||
EVT SVT = TLI.getSetCCResultType(*DAG.getContext(), InOp0.getValueType());
|
||||
EVT SVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
|
||||
InOp0.getValueType());
|
||||
SDValue WideSETCC = DAG.getNode(ISD::SETCC, SDLoc(N),
|
||||
SVT, InOp0, InOp1, N->getOperand(2));
|
||||
|
||||
@ -3060,9 +3074,9 @@ SDValue DAGTypeLegalizer::WidenVecOp_SETCC(SDNode *N) {
|
||||
EVT ResVT = EVT::getVectorVT(*DAG.getContext(),
|
||||
SVT.getVectorElementType(),
|
||||
N->getValueType(0).getVectorNumElements());
|
||||
SDValue CC = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl,
|
||||
ResVT, WideSETCC,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy()));
|
||||
SDValue CC = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, ResVT, WideSETCC,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
|
||||
return PromoteTargetBoolean(CC, N->getValueType(0));
|
||||
}
|
||||
@ -3158,8 +3172,9 @@ static SDValue BuildVectorFromScalar(SelectionDAG& DAG, EVT VecTy,
|
||||
Idx = Idx * LdTy.getSizeInBits() / NewLdTy.getSizeInBits();
|
||||
LdTy = NewLdTy;
|
||||
}
|
||||
VecOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVecVT, VecOp, LdOps[i],
|
||||
DAG.getConstant(Idx++, dl, TLI.getVectorIdxTy()));
|
||||
VecOp = DAG.getNode(
|
||||
ISD::INSERT_VECTOR_ELT, dl, NewVecVT, VecOp, LdOps[i],
|
||||
DAG.getConstant(Idx++, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
return DAG.getNode(ISD::BITCAST, dl, VecTy, VecOp);
|
||||
}
|
||||
@ -3406,9 +3421,9 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,
|
||||
if (NewVT.isVector()) {
|
||||
unsigned NumVTElts = NewVT.getVectorNumElements();
|
||||
do {
|
||||
SDValue EOp = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NewVT, ValOp,
|
||||
DAG.getConstant(Idx, dl,
|
||||
TLI.getVectorIdxTy()));
|
||||
SDValue EOp = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, NewVT, ValOp,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
isVolatile, isNonTemporal,
|
||||
@ -3428,8 +3443,10 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,
|
||||
// Readjust index position based on new vector type
|
||||
Idx = Idx * ValEltWidth / NewVTWidth;
|
||||
do {
|
||||
SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, VecOp,
|
||||
DAG.getConstant(Idx++, dl, TLI.getVectorIdxTy()));
|
||||
SDValue EOp = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, NewVT, VecOp,
|
||||
DAG.getConstant(Idx++, dl,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
isVolatile, isNonTemporal,
|
||||
@ -3475,8 +3492,9 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
|
||||
EVT ValEltVT = ValVT.getVectorElementType();
|
||||
unsigned Increment = ValEltVT.getSizeInBits() / 8;
|
||||
unsigned NumElts = StVT.getVectorNumElements();
|
||||
SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy()));
|
||||
SDValue EOp = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo(), StEltVT,
|
||||
isVolatile, isNonTemporal, Align,
|
||||
@ -3487,8 +3505,9 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
|
||||
BasePtr,
|
||||
DAG.getConstant(Offset, dl,
|
||||
BasePtr.getValueType()));
|
||||
SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy()));
|
||||
SDValue EOp = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, NewBasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
StEltVT, isVolatile, isNonTemporal,
|
||||
@ -3524,8 +3543,9 @@ SDValue DAGTypeLegalizer::ModifyToType(SDValue InOp, EVT NVT) {
|
||||
}
|
||||
|
||||
if (WidenNumElts < InNumElts && InNumElts % WidenNumElts)
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NVT, InOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy()));
|
||||
return DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, NVT, InOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
|
||||
// Fall back to extract and build.
|
||||
SmallVector<SDValue, 16> Ops(WidenNumElts);
|
||||
@ -3533,8 +3553,9 @@ SDValue DAGTypeLegalizer::ModifyToType(SDValue InOp, EVT NVT) {
|
||||
unsigned MinNumElts = std::min(WidenNumElts, InNumElts);
|
||||
unsigned Idx;
|
||||
for (Idx = 0; Idx < MinNumElts; ++Idx)
|
||||
Ops[Idx] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()));
|
||||
Ops[Idx] = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
|
||||
SDValue UndefVal = DAG.getUNDEF(EltVT);
|
||||
for ( ; Idx < WidenNumElts; ++Idx)
|
||||
|
@ -1234,7 +1234,7 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, SDLoc DL, EVT VT,
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getIntPtrConstant(uint64_t Val, SDLoc DL, bool isTarget) {
|
||||
return getConstant(Val, DL, TLI->getPointerTy(), isTarget);
|
||||
return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getConstantFP(const APFloat& V, SDLoc DL, EVT VT,
|
||||
@ -1867,7 +1867,7 @@ SDValue SelectionDAG::CreateStackTemporary(EVT VT, unsigned minAlign) {
|
||||
std::max((unsigned)getDataLayout().getPrefTypeAlignment(Ty), minAlign);
|
||||
|
||||
int FrameIdx = FrameInfo->CreateStackObject(ByteSize, StackAlign, false);
|
||||
return getFrameIndex(FrameIdx, TLI->getPointerTy());
|
||||
return getFrameIndex(FrameIdx, TLI->getPointerTy(getDataLayout()));
|
||||
}
|
||||
|
||||
/// CreateStackTemporary - Create a stack temporary suitable for holding
|
||||
@ -1883,7 +1883,7 @@ SDValue SelectionDAG::CreateStackTemporary(EVT VT1, EVT VT2) {
|
||||
|
||||
MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo();
|
||||
int FrameIdx = FrameInfo->CreateStackObject(Bytes, Align, false);
|
||||
return getFrameIndex(FrameIdx, TLI->getPointerTy());
|
||||
return getFrameIndex(FrameIdx, TLI->getPointerTy(getDataLayout()));
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1,
|
||||
@ -4068,7 +4068,7 @@ static bool FindOptimalMemOpLowering(std::vector<EVT> &MemOps,
|
||||
unsigned AS = 0;
|
||||
if (DstAlign >= DAG.getDataLayout().getPointerPrefAlignment(AS) ||
|
||||
TLI.allowsMisalignedMemoryAccesses(VT, AS, DstAlign)) {
|
||||
VT = TLI.getPointerTy();
|
||||
VT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
} else {
|
||||
switch (DstAlign & 7) {
|
||||
case 0: VT = MVT::i64; break;
|
||||
@ -4494,13 +4494,15 @@ SDValue SelectionDAG::getMemcpy(SDValue Chain, SDLoc dl, SDValue Dst,
|
||||
Entry.Node = Size; Args.push_back(Entry);
|
||||
// FIXME: pass in SDLoc
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl).setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),
|
||||
TLI->getPointerTy()), std::move(Args), 0)
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
std::move(Args), 0)
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
|
||||
std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
@ -4550,13 +4552,15 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, SDLoc dl, SDValue Dst,
|
||||
Entry.Node = Size; Args.push_back(Entry);
|
||||
// FIXME: pass in SDLoc
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl).setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),
|
||||
TLI->getPointerTy()), std::move(Args), 0)
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
std::move(Args), 0)
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
|
||||
std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
@ -4608,13 +4612,15 @@ SDValue SelectionDAG::getMemset(SDValue Chain, SDLoc dl, SDValue Dst,
|
||||
|
||||
// FIXME: pass in SDLoc
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl).setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),
|
||||
TLI->getPointerTy()), std::move(Args), 0)
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
std::move(Args), 0)
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
|
||||
std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
@ -6784,10 +6790,9 @@ SDValue SelectionDAG::UnrollVectorOp(SDNode *N, unsigned ResNE) {
|
||||
if (OperandVT.isVector()) {
|
||||
// A vector operand; extract a single element.
|
||||
EVT OperandEltVT = OperandVT.getVectorElementType();
|
||||
Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
OperandEltVT,
|
||||
Operand,
|
||||
getConstant(i, dl, TLI->getVectorIdxTy()));
|
||||
Operands[j] =
|
||||
getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT, Operand,
|
||||
getConstant(i, dl, TLI->getVectorIdxTy(getDataLayout())));
|
||||
} else {
|
||||
// A scalar operand; just use it as is.
|
||||
Operands[j] = Operand;
|
||||
@ -6950,10 +6955,10 @@ SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
|
||||
"More vector elements requested than available!");
|
||||
SDValue Lo, Hi;
|
||||
Lo = getNode(ISD::EXTRACT_SUBVECTOR, DL, LoVT, N,
|
||||
getConstant(0, DL, TLI->getVectorIdxTy()));
|
||||
getConstant(0, DL, TLI->getVectorIdxTy(getDataLayout())));
|
||||
Hi = getNode(ISD::EXTRACT_SUBVECTOR, DL, HiVT, N,
|
||||
getConstant(LoVT.getVectorNumElements(), DL,
|
||||
TLI->getVectorIdxTy()));
|
||||
TLI->getVectorIdxTy(getDataLayout())));
|
||||
return std::make_pair(Lo, Hi);
|
||||
}
|
||||
|
||||
@ -6965,7 +6970,7 @@ void SelectionDAG::ExtractVectorElements(SDValue Op,
|
||||
Count = VT.getVectorNumElements();
|
||||
|
||||
EVT EltVT = VT.getVectorElementType();
|
||||
EVT IdxTy = TLI->getVectorIdxTy();
|
||||
EVT IdxTy = TLI->getVectorIdxTy(getDataLayout());
|
||||
SDLoc SL(Op);
|
||||
for (unsigned i = Start, e = Start + Count; i != e; ++i) {
|
||||
Args.push_back(getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT,
|
||||
|
@ -164,9 +164,10 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, SDLoc DL,
|
||||
std::swap(Lo, Hi);
|
||||
EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
|
||||
Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
|
||||
Hi = DAG.getNode(ISD::SHL, DL, TotalVT, Hi,
|
||||
DAG.getConstant(Lo.getValueType().getSizeInBits(), DL,
|
||||
TLI.getPointerTy()));
|
||||
Hi =
|
||||
DAG.getNode(ISD::SHL, DL, TotalVT, Hi,
|
||||
DAG.getConstant(Lo.getValueType().getSizeInBits(), DL,
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
|
||||
Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
|
||||
}
|
||||
@ -211,8 +212,9 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, SDLoc DL,
|
||||
if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
|
||||
// FP_ROUND's are always exact here.
|
||||
if (ValueVT.bitsLT(Val.getValueType()))
|
||||
return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val,
|
||||
DAG.getTargetConstant(1, DL, TLI.getPointerTy()));
|
||||
return DAG.getNode(
|
||||
ISD::FP_ROUND, DL, ValueVT, Val,
|
||||
DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout())));
|
||||
|
||||
return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
|
||||
}
|
||||
@ -305,8 +307,9 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, SDLoc DL,
|
||||
if (PartEVT.getVectorElementType() == ValueVT.getVectorElementType()) {
|
||||
assert(PartEVT.getVectorNumElements() > ValueVT.getVectorNumElements() &&
|
||||
"Cannot narrow, it would be a lossy transformation");
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ValueVT, Val,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
return DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, DL, ValueVT, Val,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
|
||||
// Vector/Vector bitcast.
|
||||
@ -497,9 +500,9 @@ static void getCopyToPartsVector(SelectionDAG &DAG, SDLoc DL,
|
||||
// undef elements.
|
||||
SmallVector<SDValue, 16> Ops;
|
||||
for (unsigned i = 0, e = ValueVT.getVectorNumElements(); i != e; ++i)
|
||||
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
|
||||
ElementVT, Val, DAG.getConstant(i, DL,
|
||||
TLI.getVectorIdxTy())));
|
||||
Ops.push_back(DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, ElementVT, Val,
|
||||
DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))));
|
||||
|
||||
for (unsigned i = ValueVT.getVectorNumElements(),
|
||||
e = PartVT.getVectorNumElements(); i != e; ++i)
|
||||
@ -524,9 +527,9 @@ static void getCopyToPartsVector(SelectionDAG &DAG, SDLoc DL,
|
||||
// Vector -> scalar conversion.
|
||||
assert(ValueVT.getVectorNumElements() == 1 &&
|
||||
"Only trivial vector-to-scalar conversions should get here!");
|
||||
Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
|
||||
PartVT, Val,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy()));
|
||||
Val = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
|
||||
bool Smaller = ValueVT.bitsLE(PartVT);
|
||||
Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
|
||||
@ -554,14 +557,14 @@ static void getCopyToPartsVector(SelectionDAG &DAG, SDLoc DL,
|
||||
SmallVector<SDValue, 8> Ops(NumIntermediates);
|
||||
for (unsigned i = 0; i != NumIntermediates; ++i) {
|
||||
if (IntermediateVT.isVector())
|
||||
Ops[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL,
|
||||
IntermediateVT, Val,
|
||||
DAG.getConstant(i * (NumElements / NumIntermediates), DL,
|
||||
TLI.getVectorIdxTy()));
|
||||
Ops[i] =
|
||||
DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
|
||||
DAG.getConstant(i * (NumElements / NumIntermediates), DL,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
else
|
||||
Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
|
||||
IntermediateVT, Val,
|
||||
DAG.getConstant(i, DL, TLI.getVectorIdxTy()));
|
||||
Ops[i] = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
|
||||
DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
|
||||
// Split the intermediate operands into legal parts.
|
||||
@ -1031,7 +1034,7 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
|
||||
if (const Constant *C = dyn_cast<Constant>(V)) {
|
||||
EVT VT = TLI.getValueType(V->getType(), true);
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
|
||||
|
||||
if (const ConstantInt *CI = dyn_cast<ConstantInt>(C))
|
||||
return DAG.getConstant(*CI, getCurSDLoc(), VT);
|
||||
@ -1041,7 +1044,8 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
||||
|
||||
if (isa<ConstantPointerNull>(C)) {
|
||||
unsigned AS = V->getType()->getPointerAddressSpace();
|
||||
return DAG.getConstant(0, getCurSDLoc(), TLI.getPointerTy(AS));
|
||||
return DAG.getConstant(0, getCurSDLoc(),
|
||||
TLI.getPointerTy(DAG.getDataLayout(), AS));
|
||||
}
|
||||
|
||||
if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
|
||||
@ -1127,7 +1131,8 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
||||
Ops.push_back(getValue(CV->getOperand(i)));
|
||||
} else {
|
||||
assert(isa<ConstantAggregateZero>(C) && "Unknown vector constant!");
|
||||
EVT EltVT = TLI.getValueType(VecTy->getElementType());
|
||||
EVT EltVT =
|
||||
TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
|
||||
|
||||
SDValue Op;
|
||||
if (EltVT.isFloatingPoint())
|
||||
@ -1147,7 +1152,8 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
||||
DenseMap<const AllocaInst*, int>::iterator SI =
|
||||
FuncInfo.StaticAllocaMap.find(AI);
|
||||
if (SI != FuncInfo.StaticAllocaMap.end())
|
||||
return DAG.getFrameIndex(SI->second, TLI.getPointerTy());
|
||||
return DAG.getFrameIndex(SI->second,
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
}
|
||||
|
||||
// If this is an instruction which fast-isel has deferred, select it now.
|
||||
@ -1694,7 +1700,7 @@ void SelectionDAGBuilder::visitSwitchCase(CaseBlock &CB,
|
||||
void SelectionDAGBuilder::visitJumpTable(JumpTable &JT) {
|
||||
// Emit the code for the jump table
|
||||
assert(JT.Reg != -1U && "Should lower JT Header first!");
|
||||
EVT PTy = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PTy = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
SDValue Index = DAG.getCopyFromReg(getControlRoot(), getCurSDLoc(),
|
||||
JT.Reg, PTy);
|
||||
SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
|
||||
@ -1725,9 +1731,10 @@ void SelectionDAGBuilder::visitJumpTableHeader(JumpTable &JT,
|
||||
// This value may be smaller or larger than the target's pointer type, and
|
||||
// therefore require extension or truncating.
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SwitchOp = DAG.getZExtOrTrunc(Sub, dl, TLI.getPointerTy());
|
||||
SwitchOp = DAG.getZExtOrTrunc(Sub, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
unsigned JumpTableReg = FuncInfo.CreateReg(TLI.getPointerTy());
|
||||
unsigned JumpTableReg =
|
||||
FuncInfo.CreateReg(TLI.getPointerTy(DAG.getDataLayout()));
|
||||
SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl,
|
||||
JumpTableReg, SwitchOp);
|
||||
JT.Reg = JumpTableReg;
|
||||
@ -1735,11 +1742,10 @@ void SelectionDAGBuilder::visitJumpTableHeader(JumpTable &JT,
|
||||
// Emit the range check for the jump table, and branch to the default block
|
||||
// for the switch statement if the value being switched on exceeds the largest
|
||||
// case in the switch.
|
||||
SDValue CMP =
|
||||
DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(),
|
||||
Sub.getValueType()),
|
||||
Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT),
|
||||
ISD::SETUGT);
|
||||
SDValue CMP = DAG.getSetCC(
|
||||
dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
|
||||
Sub.getValueType()),
|
||||
Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
|
||||
|
||||
SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
|
||||
MVT::Other, CopyTo, CMP,
|
||||
@ -1764,7 +1770,7 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,
|
||||
|
||||
// First create the loads to the guard/stack slot for the comparison.
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT PtrTy = TLI.getPointerTy();
|
||||
EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
|
||||
|
||||
MachineFrameInfo *MFI = ParentBB->getParent()->getFrameInfo();
|
||||
int FI = MFI->getStackProtectorIndex();
|
||||
@ -1800,10 +1806,10 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,
|
||||
EVT VT = Guard.getValueType();
|
||||
SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, Guard, StackSlot);
|
||||
|
||||
SDValue Cmp =
|
||||
DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(),
|
||||
Sub.getValueType()),
|
||||
Sub, DAG.getConstant(0, dl, VT), ISD::SETNE);
|
||||
SDValue Cmp = DAG.getSetCC(dl, TLI.getSetCCResultType(DAG.getDataLayout(),
|
||||
*DAG.getContext(),
|
||||
Sub.getValueType()),
|
||||
Sub, DAG.getConstant(0, dl, VT), ISD::SETNE);
|
||||
|
||||
// If the sub is not 0, then we know the guard/stackslot do not equal, so
|
||||
// branch to failure MBB.
|
||||
@ -1849,10 +1855,10 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
|
||||
|
||||
// Check range
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue RangeCmp =
|
||||
DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(),
|
||||
Sub.getValueType()),
|
||||
Sub, DAG.getConstant(B.Range, dl, VT), ISD::SETUGT);
|
||||
SDValue RangeCmp = DAG.getSetCC(
|
||||
dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
|
||||
Sub.getValueType()),
|
||||
Sub, DAG.getConstant(B.Range, dl, VT), ISD::SETUGT);
|
||||
|
||||
// Determine the type of the test operands.
|
||||
bool UsePtrType = false;
|
||||
@ -1868,7 +1874,7 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
|
||||
}
|
||||
}
|
||||
if (UsePtrType) {
|
||||
VT = TLI.getPointerTy();
|
||||
VT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
|
||||
}
|
||||
|
||||
@ -1910,13 +1916,15 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,
|
||||
// Testing for a single bit; just compare the shift count with what it
|
||||
// would need to be to shift a 1 bit in that position.
|
||||
Cmp = DAG.getSetCC(
|
||||
dl, TLI.getSetCCResultType(*DAG.getContext(), VT), ShiftOp,
|
||||
DAG.getConstant(countTrailingZeros(B.Mask), dl, VT), ISD::SETEQ);
|
||||
dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
|
||||
ShiftOp, DAG.getConstant(countTrailingZeros(B.Mask), dl, VT),
|
||||
ISD::SETEQ);
|
||||
} else if (PopCount == BB.Range) {
|
||||
// There is only one zero bit in the range, test for it directly.
|
||||
Cmp = DAG.getSetCC(
|
||||
dl, TLI.getSetCCResultType(*DAG.getContext(), VT), ShiftOp,
|
||||
DAG.getConstant(countTrailingOnes(B.Mask), dl, VT), ISD::SETNE);
|
||||
dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
|
||||
ShiftOp, DAG.getConstant(countTrailingOnes(B.Mask), dl, VT),
|
||||
ISD::SETNE);
|
||||
} else {
|
||||
// Make desired shift
|
||||
SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
|
||||
@ -1925,8 +1933,9 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,
|
||||
// Emit bit tests and jumps
|
||||
SDValue AndOp = DAG.getNode(ISD::AND, dl,
|
||||
VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
|
||||
Cmp = DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(), VT), AndOp,
|
||||
DAG.getConstant(0, dl, VT), ISD::SETNE);
|
||||
Cmp = DAG.getSetCC(
|
||||
dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
|
||||
AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
|
||||
}
|
||||
|
||||
// The branch weight from SwitchBB to B.TargetBB is B.ExtraWeight.
|
||||
@ -2023,14 +2032,16 @@ void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
|
||||
if (FuncInfo.ExceptionPointerVirtReg) {
|
||||
Ops[0] = DAG.getZExtOrTrunc(
|
||||
DAG.getCopyFromReg(DAG.getEntryNode(), dl,
|
||||
FuncInfo.ExceptionPointerVirtReg, TLI.getPointerTy()),
|
||||
FuncInfo.ExceptionPointerVirtReg,
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
dl, ValueVTs[0]);
|
||||
} else {
|
||||
Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy());
|
||||
Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
}
|
||||
Ops[1] = DAG.getZExtOrTrunc(
|
||||
DAG.getCopyFromReg(DAG.getEntryNode(), dl,
|
||||
FuncInfo.ExceptionSelectorVirtReg, TLI.getPointerTy()),
|
||||
FuncInfo.ExceptionSelectorVirtReg,
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
dl, ValueVTs[1]);
|
||||
|
||||
// Merge into one.
|
||||
@ -2047,10 +2058,12 @@ SelectionDAGBuilder::visitLandingPadClauseBB(GlobalValue *ClauseGV,
|
||||
|
||||
// Get the typeid that we will dispatch on later.
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
const TargetRegisterClass *RC = TLI.getRegClassFor(TLI.getPointerTy());
|
||||
const TargetRegisterClass *RC =
|
||||
TLI.getRegClassFor(TLI.getPointerTy(DAG.getDataLayout()));
|
||||
unsigned VReg = FuncInfo.MF->getRegInfo().createVirtualRegister(RC);
|
||||
unsigned TypeID = DAG.getMachineFunction().getMMI().getTypeIDFor(ClauseGV);
|
||||
SDValue Sel = DAG.getConstant(TypeID, dl, TLI.getPointerTy());
|
||||
SDValue Sel =
|
||||
DAG.getConstant(TypeID, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
Chain = DAG.getCopyToReg(Chain, dl, VReg, Sel);
|
||||
|
||||
// Branch to the main landing pad block.
|
||||
@ -2257,7 +2270,8 @@ void SelectionDAGBuilder::visitICmp(const User &I) {
|
||||
SDValue Op2 = getValue(I.getOperand(1));
|
||||
ISD::CondCode Opcode = getICmpCondCode(predicate);
|
||||
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
|
||||
}
|
||||
|
||||
@ -2272,7 +2286,8 @@ void SelectionDAGBuilder::visitFCmp(const User &I) {
|
||||
ISD::CondCode Condition = getFCmpCondCode(predicate);
|
||||
if (TM.Options.NoNaNsFPMath)
|
||||
Condition = getFCmpCodeWithoutNaN(Condition);
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition));
|
||||
}
|
||||
|
||||
@ -2338,7 +2353,8 @@ void SelectionDAGBuilder::visitSelect(const User &I) {
|
||||
void SelectionDAGBuilder::visitTrunc(const User &I) {
|
||||
// TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
@ -2346,7 +2362,8 @@ void SelectionDAGBuilder::visitZExt(const User &I) {
|
||||
// ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
|
||||
// ZExt also can't be a cast to bool for same reason. So, nothing much to do
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
@ -2354,7 +2371,8 @@ void SelectionDAGBuilder::visitSExt(const User &I) {
|
||||
// SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
|
||||
// SExt also can't be a cast to bool for same reason. So, nothing much to do
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
@ -2363,43 +2381,49 @@ void SelectionDAGBuilder::visitFPTrunc(const User &I) {
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
SDLoc dl = getCurSDLoc();
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT DestVT = TLI.getValueType(I.getType());
|
||||
EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
|
||||
DAG.getTargetConstant(0, dl, TLI.getPointerTy())));
|
||||
DAG.getTargetConstant(
|
||||
0, dl, TLI.getPointerTy(DAG.getDataLayout()))));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitFPExt(const User &I) {
|
||||
// FPExt is never a no-op cast, no need to check
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitFPToUI(const User &I) {
|
||||
// FPToUI is never a no-op cast, no need to check
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitFPToSI(const User &I) {
|
||||
// FPToSI is never a no-op cast, no need to check
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitUIToFP(const User &I) {
|
||||
// UIToFP is never a no-op cast, no need to check
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitSIToFP(const User &I) {
|
||||
// SIToFP is never a no-op cast, no need to check
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
|
||||
}
|
||||
|
||||
@ -2407,7 +2431,8 @@ void SelectionDAGBuilder::visitPtrToInt(const User &I) {
|
||||
// What to do depends on the size of the integer and the size of the pointer.
|
||||
// We can either truncate, zero extend, or no-op, accordingly.
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT));
|
||||
}
|
||||
|
||||
@ -2415,14 +2440,16 @@ void SelectionDAGBuilder::visitIntToPtr(const User &I) {
|
||||
// What to do depends on the size of the integer and the size of the pointer.
|
||||
// We can either truncate, zero extend, or no-op, accordingly.
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
setValue(&I, DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitBitCast(const User &I) {
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
SDLoc dl = getCurSDLoc();
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType());
|
||||
EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType());
|
||||
|
||||
// BitCast assures us that source and destination are the same size so this is
|
||||
// either a BITCAST or a no-op.
|
||||
@ -2444,7 +2471,7 @@ void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
const Value *SV = I.getOperand(0);
|
||||
SDValue N = getValue(SV);
|
||||
EVT DestVT = TLI.getValueType(I.getType());
|
||||
EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
|
||||
unsigned SrcAS = SV->getType()->getPointerAddressSpace();
|
||||
unsigned DestAS = I.getType()->getPointerAddressSpace();
|
||||
@ -2459,19 +2486,21 @@ void SelectionDAGBuilder::visitInsertElement(const User &I) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue InVec = getValue(I.getOperand(0));
|
||||
SDValue InVal = getValue(I.getOperand(1));
|
||||
SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(2)),
|
||||
getCurSDLoc(), TLI.getVectorIdxTy());
|
||||
SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout()));
|
||||
setValue(&I, DAG.getNode(ISD::INSERT_VECTOR_ELT, getCurSDLoc(),
|
||||
TLI.getValueType(I.getType()), InVec, InVal, InIdx));
|
||||
TLI.getValueType(DAG.getDataLayout(), I.getType()),
|
||||
InVec, InVal, InIdx));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitExtractElement(const User &I) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue InVec = getValue(I.getOperand(0));
|
||||
SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(1)),
|
||||
getCurSDLoc(), TLI.getVectorIdxTy());
|
||||
SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout()));
|
||||
setValue(&I, DAG.getNode(ISD::EXTRACT_VECTOR_ELT, getCurSDLoc(),
|
||||
TLI.getValueType(I.getType()), InVec, InIdx));
|
||||
TLI.getValueType(DAG.getDataLayout(), I.getType()),
|
||||
InVec, InIdx));
|
||||
}
|
||||
|
||||
// Utility for visitShuffleVector - Return true if every element in Mask,
|
||||
@ -2494,7 +2523,7 @@ void SelectionDAGBuilder::visitShuffleVector(const User &I) {
|
||||
unsigned MaskNumElts = Mask.size();
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT VT = TLI.getValueType(I.getType());
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
EVT SrcVT = Src1.getValueType();
|
||||
unsigned SrcNumElts = SrcVT.getVectorNumElements();
|
||||
|
||||
@ -2616,7 +2645,8 @@ void SelectionDAGBuilder::visitShuffleVector(const User &I) {
|
||||
SDLoc dl = getCurSDLoc();
|
||||
Src = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, VT, Src,
|
||||
DAG.getConstant(StartIdx[Input], dl, TLI.getVectorIdxTy()));
|
||||
DAG.getConstant(StartIdx[Input], dl,
|
||||
TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2643,7 +2673,7 @@ void SelectionDAGBuilder::visitShuffleVector(const User &I) {
|
||||
// replacing the shuffle with extract and build vector.
|
||||
// to insert and build vector.
|
||||
EVT EltVT = VT.getVectorElementType();
|
||||
EVT IdxVT = TLI.getVectorIdxTy();
|
||||
EVT IdxVT = TLI.getVectorIdxTy(DAG.getDataLayout());
|
||||
SDLoc dl = getCurSDLoc();
|
||||
SmallVector<SDValue,8> Ops;
|
||||
for (unsigned i = 0; i != MaskNumElts; ++i) {
|
||||
@ -2772,7 +2802,8 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
|
||||
Ty = StTy->getElementType(Field);
|
||||
} else {
|
||||
Ty = cast<SequentialType>(Ty)->getElementType();
|
||||
MVT PtrTy = DAG.getTargetLoweringInfo().getPointerTy(AS);
|
||||
MVT PtrTy =
|
||||
DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout(), AS);
|
||||
unsigned PtrSize = PtrTy.getSizeInBits();
|
||||
APInt ElementSize(PtrSize, DL->getTypeAllocSize(Ty));
|
||||
|
||||
@ -2832,7 +2863,7 @@ void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
|
||||
|
||||
SDValue AllocSize = getValue(I.getArraySize());
|
||||
|
||||
EVT IntPtr = TLI.getPointerTy();
|
||||
EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout());
|
||||
if (AllocSize.getValueType() != IntPtr)
|
||||
AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
|
||||
|
||||
@ -3079,9 +3110,10 @@ static bool getUniformBase(Value *& Ptr, SDValue& Base, SDValue& Index,
|
||||
else if (SDB->findValue(ShuffleInst)) {
|
||||
SDValue ShuffleNode = SDB->getValue(ShuffleInst);
|
||||
SDLoc sdl = ShuffleNode;
|
||||
Base = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
|
||||
ShuffleNode.getValueType().getScalarType(), ShuffleNode,
|
||||
DAG.getConstant(0, sdl, TLI.getVectorIdxTy()));
|
||||
Base = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, sdl,
|
||||
ShuffleNode.getValueType().getScalarType(), ShuffleNode,
|
||||
DAG.getConstant(0, sdl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
SDB->setValue(Ptr, Base);
|
||||
}
|
||||
else
|
||||
@ -3128,7 +3160,7 @@ void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
|
||||
MachineMemOperand::MOStore, VT.getStoreSize(),
|
||||
Alignment, AAInfo);
|
||||
if (!UniformBase) {
|
||||
Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy());
|
||||
Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
Index = getValue(Ptr);
|
||||
}
|
||||
SDValue Ops[] = { getRoot(), Src0, Mask, Base, Index };
|
||||
@ -3148,7 +3180,7 @@ void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I) {
|
||||
SDValue Mask = getValue(I.getArgOperand(2));
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT VT = TLI.getValueType(I.getType());
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
unsigned Alignment = (cast<ConstantInt>(I.getArgOperand(1)))->getZExtValue();
|
||||
if (!Alignment)
|
||||
Alignment = DAG.getEVTAlignment(VT);
|
||||
@ -3186,7 +3218,7 @@ void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
|
||||
SDValue Mask = getValue(I.getArgOperand(2));
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT VT = TLI.getValueType(I.getType());
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
unsigned Alignment = (cast<ConstantInt>(I.getArgOperand(1)))->getZExtValue();
|
||||
if (!Alignment)
|
||||
Alignment = DAG.getEVTAlignment(VT);
|
||||
@ -3216,7 +3248,7 @@ void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
|
||||
Alignment, AAInfo, Ranges);
|
||||
|
||||
if (!UniformBase) {
|
||||
Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy());
|
||||
Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
Index = getValue(Ptr);
|
||||
}
|
||||
SDValue Ops[] = { Root, Src0, Mask, Base, Index };
|
||||
@ -3293,8 +3325,10 @@ void SelectionDAGBuilder::visitFence(const FenceInst &I) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue Ops[3];
|
||||
Ops[0] = getRoot();
|
||||
Ops[1] = DAG.getConstant(I.getOrdering(), dl, TLI.getPointerTy());
|
||||
Ops[2] = DAG.getConstant(I.getSynchScope(), dl, TLI.getPointerTy());
|
||||
Ops[1] = DAG.getConstant(I.getOrdering(), dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
Ops[2] = DAG.getConstant(I.getSynchScope(), dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
DAG.setRoot(DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops));
|
||||
}
|
||||
|
||||
@ -3306,7 +3340,7 @@ void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
|
||||
SDValue InChain = getRoot();
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT VT = TLI.getValueType(I.getType());
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
|
||||
if (I.getAlignment() < VT.getSizeInBits() / 8)
|
||||
report_fatal_error("Cannot generate unaligned atomic load");
|
||||
@ -3341,7 +3375,8 @@ void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
|
||||
SDValue InChain = getRoot();
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT VT = TLI.getValueType(I.getValueOperand()->getType());
|
||||
EVT VT =
|
||||
TLI.getValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
|
||||
|
||||
if (I.getAlignment() < VT.getSizeInBits() / 8)
|
||||
report_fatal_error("Cannot generate unaligned atomic store");
|
||||
@ -3384,7 +3419,7 @@ void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
|
||||
if (!IsTgtIntrinsic || Info.opc == ISD::INTRINSIC_VOID ||
|
||||
Info.opc == ISD::INTRINSIC_W_CHAIN)
|
||||
Ops.push_back(DAG.getTargetConstant(Intrinsic, getCurSDLoc(),
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
|
||||
// Add all operands of the call to the operand list.
|
||||
for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) {
|
||||
@ -3427,7 +3462,7 @@ void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
|
||||
|
||||
if (!I.getType()->isVoidTy()) {
|
||||
if (VectorType *PTy = dyn_cast<VectorType>(I.getType())) {
|
||||
EVT VT = TLI.getValueType(PTy);
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), PTy);
|
||||
Result = DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT, Result);
|
||||
}
|
||||
|
||||
@ -3460,8 +3495,9 @@ GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI,
|
||||
SDLoc dl) {
|
||||
SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
|
||||
DAG.getConstant(0x7f800000, dl, MVT::i32));
|
||||
SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
|
||||
DAG.getConstant(23, dl, TLI.getPointerTy()));
|
||||
SDValue t1 = DAG.getNode(
|
||||
ISD::SRL, dl, MVT::i32, t0,
|
||||
DAG.getConstant(23, dl, TLI.getPointerTy(DAG.getDataLayout())));
|
||||
SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
|
||||
DAG.getConstant(127, dl, MVT::i32));
|
||||
return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
|
||||
@ -3486,7 +3522,8 @@ static SDValue getLimitedPrecisionExp2(SDValue t0, SDLoc dl,
|
||||
// IntegerPartOfX <<= 23;
|
||||
IntegerPartOfX = DAG.getNode(
|
||||
ISD::SHL, dl, MVT::i32, IntegerPartOfX,
|
||||
DAG.getConstant(23, dl, DAG.getTargetLoweringInfo().getPointerTy()));
|
||||
DAG.getConstant(23, dl, DAG.getTargetLoweringInfo().getPointerTy(
|
||||
DAG.getDataLayout())));
|
||||
|
||||
SDValue TwoToFractionalPartOfX;
|
||||
if (LimitFloatPrecision <= 6) {
|
||||
@ -4073,11 +4110,13 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::vaend: visitVAEnd(I); return nullptr;
|
||||
case Intrinsic::vacopy: visitVACopy(I); return nullptr;
|
||||
case Intrinsic::returnaddress:
|
||||
setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl, TLI.getPointerTy(),
|
||||
setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()),
|
||||
getValue(I.getArgOperand(0))));
|
||||
return nullptr;
|
||||
case Intrinsic::frameaddress:
|
||||
setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl, TLI.getPointerTy(),
|
||||
setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()),
|
||||
getValue(I.getArgOperand(0))));
|
||||
return nullptr;
|
||||
case Intrinsic::read_register: {
|
||||
@ -4085,7 +4124,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
SDValue Chain = getRoot();
|
||||
SDValue RegName =
|
||||
DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
|
||||
EVT VT = TLI.getValueType(I.getType());
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
Res = DAG.getNode(ISD::READ_REGISTER, sdl,
|
||||
DAG.getVTList(VT, MVT::Other), Chain, RegName);
|
||||
setValue(&I, Res);
|
||||
@ -4337,14 +4376,15 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
return nullptr;
|
||||
case Intrinsic::eh_dwarf_cfa: {
|
||||
SDValue CfaArg = DAG.getSExtOrTrunc(getValue(I.getArgOperand(0)), sdl,
|
||||
TLI.getPointerTy());
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
SDValue Offset = DAG.getNode(ISD::ADD, sdl,
|
||||
CfaArg.getValueType(),
|
||||
DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET, sdl,
|
||||
CfaArg.getValueType()),
|
||||
CfaArg);
|
||||
SDValue FA = DAG.getNode(ISD::FRAMEADDR, sdl, TLI.getPointerTy(),
|
||||
DAG.getConstant(0, sdl, TLI.getPointerTy()));
|
||||
SDValue FA = DAG.getNode(
|
||||
ISD::FRAMEADDR, sdl, TLI.getPointerTy(DAG.getDataLayout()),
|
||||
DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
|
||||
setValue(&I, DAG.getNode(ISD::ADD, sdl, FA.getValueType(),
|
||||
FA, Offset));
|
||||
return nullptr;
|
||||
@ -4446,7 +4486,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
ShOps[0] = ShAmt;
|
||||
ShOps[1] = DAG.getConstant(0, sdl, MVT::i32);
|
||||
ShAmt = DAG.getNode(ISD::BUILD_VECTOR, sdl, ShAmtVT, ShOps);
|
||||
EVT DestVT = TLI.getValueType(I.getType());
|
||||
EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
ShAmt = DAG.getNode(ISD::BITCAST, sdl, DestVT, ShAmt);
|
||||
Res = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, sdl, DestVT,
|
||||
DAG.getConstant(NewIntrinsic, sdl, MVT::i32),
|
||||
@ -4476,7 +4516,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::convertus: Code = ISD::CVT_US; break;
|
||||
case Intrinsic::convertuu: Code = ISD::CVT_UU; break;
|
||||
}
|
||||
EVT DestVT = TLI.getValueType(I.getType());
|
||||
EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
const Value *Op1 = I.getArgOperand(0);
|
||||
Res = DAG.getConvertRndSat(DestVT, sdl, getValue(Op1),
|
||||
DAG.getValueType(DestVT),
|
||||
@ -4566,7 +4606,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
getValue(I.getArgOperand(2))));
|
||||
return nullptr;
|
||||
case Intrinsic::fmuladd: {
|
||||
EVT VT = TLI.getValueType(I.getType());
|
||||
EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
|
||||
TLI.isFMAFasterThanFMulAndFAdd(VT)) {
|
||||
setValue(&I, DAG.getNode(ISD::FMA, sdl,
|
||||
@ -4595,10 +4635,10 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
MVT::i32))));
|
||||
return nullptr;
|
||||
case Intrinsic::convert_from_fp16:
|
||||
setValue(&I,
|
||||
DAG.getNode(ISD::FP_EXTEND, sdl, TLI.getValueType(I.getType()),
|
||||
DAG.getNode(ISD::BITCAST, sdl, MVT::f16,
|
||||
getValue(I.getArgOperand(0)))));
|
||||
setValue(&I, DAG.getNode(ISD::FP_EXTEND, sdl,
|
||||
TLI.getValueType(DAG.getDataLayout(), I.getType()),
|
||||
DAG.getNode(ISD::BITCAST, sdl, MVT::f16,
|
||||
getValue(I.getArgOperand(0)))));
|
||||
return nullptr;
|
||||
case Intrinsic::pcmarker: {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
@ -4642,8 +4682,9 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
}
|
||||
case Intrinsic::stacksave: {
|
||||
SDValue Op = getRoot();
|
||||
Res = DAG.getNode(ISD::STACKSAVE, sdl,
|
||||
DAG.getVTList(TLI.getPointerTy(), MVT::Other), Op);
|
||||
Res = DAG.getNode(
|
||||
ISD::STACKSAVE, sdl,
|
||||
DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Op);
|
||||
setValue(&I, Res);
|
||||
DAG.setRoot(Res.getValue(1));
|
||||
return nullptr;
|
||||
@ -4657,7 +4698,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
// Emit code into the DAG to store the stack guard onto the stack.
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
EVT PtrTy = TLI.getPointerTy();
|
||||
EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
|
||||
SDValue Src, Chain = getRoot();
|
||||
const Value *Ptr = cast<LoadInst>(I.getArgOperand(0))->getPointerOperand();
|
||||
const GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr);
|
||||
@ -4755,7 +4796,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
}
|
||||
case Intrinsic::adjust_trampoline: {
|
||||
setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
|
||||
TLI.getPointerTy(),
|
||||
TLI.getPointerTy(DAG.getDataLayout()),
|
||||
getValue(I.getArgOperand(0))));
|
||||
return nullptr;
|
||||
}
|
||||
@ -4796,10 +4837,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
TargetLowering::ArgListTy Args;
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot())
|
||||
.setCallee(CallingConv::C, I.getType(),
|
||||
DAG.getExternalSymbol(TrapFuncName.data(), TLI.getPointerTy()),
|
||||
std::move(Args), 0);
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setCallee(
|
||||
CallingConv::C, I.getType(),
|
||||
DAG.getExternalSymbol(TrapFuncName.data(),
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args), 0);
|
||||
|
||||
std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
|
||||
DAG.setRoot(Result.second);
|
||||
@ -4875,7 +4917,8 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
|
||||
SDValue Ops[2];
|
||||
Ops[0] = getRoot();
|
||||
Ops[1] = DAG.getFrameIndex(FI, TLI.getPointerTy(), true);
|
||||
Ops[1] =
|
||||
DAG.getFrameIndex(FI, TLI.getPointerTy(DAG.getDataLayout()), true);
|
||||
unsigned Opcode = (IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END);
|
||||
|
||||
Res = DAG.getNode(Opcode, sdl, MVT::Other, Ops);
|
||||
@ -4885,7 +4928,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
}
|
||||
case Intrinsic::invariant_start:
|
||||
// Discard region information.
|
||||
setValue(&I, DAG.getUNDEF(TLI.getPointerTy()));
|
||||
setValue(&I, DAG.getUNDEF(TLI.getPointerTy(DAG.getDataLayout())));
|
||||
return nullptr;
|
||||
case Intrinsic::invariant_end:
|
||||
// Discard region information.
|
||||
@ -4905,7 +4948,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::clear_cache:
|
||||
return TLI.getClearCacheBuiltinName();
|
||||
case Intrinsic::eh_actions:
|
||||
setValue(&I, DAG.getUNDEF(TLI.getPointerTy()));
|
||||
setValue(&I, DAG.getUNDEF(TLI.getPointerTy(DAG.getDataLayout())));
|
||||
return nullptr;
|
||||
case Intrinsic::donothing:
|
||||
// ignore
|
||||
@ -4966,7 +5009,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::localrecover: {
|
||||
// i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MVT PtrVT = TLI.getPointerTy(0);
|
||||
MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout(), 0);
|
||||
|
||||
// Get the symbol that defines the frame offset.
|
||||
auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
|
||||
@ -4996,7 +5039,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::eh_exceptioncode: {
|
||||
unsigned Reg = TLI.getExceptionPointerRegister();
|
||||
assert(Reg && "cannot get exception code on this platform");
|
||||
MVT PtrVT = TLI.getPointerTy();
|
||||
MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
|
||||
assert(FuncInfo.MBB->isLandingPad() && "eh.exceptioncode in non-lpad");
|
||||
unsigned VReg = FuncInfo.MBB->addLiveIn(Reg, PtrRC);
|
||||
@ -5180,7 +5223,8 @@ static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
|
||||
void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
|
||||
SDValue Value,
|
||||
bool IsSigned) {
|
||||
EVT VT = DAG.getTargetLoweringInfo().getValueType(I.getType(), true);
|
||||
EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType(), true);
|
||||
if (IsSigned)
|
||||
Value = DAG.getSExtOrTrunc(Value, getCurSDLoc(), VT);
|
||||
else
|
||||
@ -5205,7 +5249,8 @@ bool SelectionDAGBuilder::visitMemCmpCall(const CallInst &I) {
|
||||
const Value *Size = I.getArgOperand(2);
|
||||
const ConstantInt *CSize = dyn_cast<ConstantInt>(Size);
|
||||
if (CSize && CSize->getZExtValue() == 0) {
|
||||
EVT CallVT = DAG.getTargetLoweringInfo().getValueType(I.getType(), true);
|
||||
EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
|
||||
I.getType(), true);
|
||||
setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
|
||||
return true;
|
||||
}
|
||||
@ -5642,8 +5687,9 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
|
||||
if (!RenameFn)
|
||||
Callee = getValue(I.getCalledValue());
|
||||
else
|
||||
Callee = DAG.getExternalSymbol(RenameFn,
|
||||
DAG.getTargetLoweringInfo().getPointerTy());
|
||||
Callee = DAG.getExternalSymbol(
|
||||
RenameFn,
|
||||
DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
// Check if we can potentially perform a tail call. More detailed checking is
|
||||
// be done within LowerCallTo, after more information about the call is known.
|
||||
@ -5677,7 +5723,7 @@ public:
|
||||
if (!CallOperandVal) return MVT::Other;
|
||||
|
||||
if (isa<BasicBlock>(CallOperandVal))
|
||||
return TLI.getPointerTy();
|
||||
return TLI.getPointerTy(DL);
|
||||
|
||||
llvm::Type *OpTy = CallOperandVal->getType();
|
||||
|
||||
@ -5713,7 +5759,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
return TLI.getValueType(OpTy, true);
|
||||
return TLI.getValueType(DL, OpTy, true);
|
||||
}
|
||||
};
|
||||
|
||||
@ -5865,10 +5911,11 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
// corresponding argument.
|
||||
assert(!CS.getType()->isVoidTy() && "Bad inline asm!");
|
||||
if (StructType *STy = dyn_cast<StructType>(CS.getType())) {
|
||||
OpVT = TLI.getSimpleValueType(STy->getElementType(ResNo));
|
||||
OpVT = TLI.getSimpleValueType(DAG.getDataLayout(),
|
||||
STy->getElementType(ResNo));
|
||||
} else {
|
||||
assert(ResNo == 0 && "Asm only has one result!");
|
||||
OpVT = TLI.getSimpleValueType(CS.getType());
|
||||
OpVT = TLI.getSimpleValueType(DAG.getDataLayout(), CS.getType());
|
||||
}
|
||||
++ResNo;
|
||||
break;
|
||||
@ -5978,8 +6025,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
const Value *OpVal = OpInfo.CallOperandVal;
|
||||
if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
|
||||
isa<ConstantVector>(OpVal) || isa<ConstantDataVector>(OpVal)) {
|
||||
OpInfo.CallOperand = DAG.getConstantPool(cast<Constant>(OpVal),
|
||||
TLI.getPointerTy());
|
||||
OpInfo.CallOperand = DAG.getConstantPool(
|
||||
cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
|
||||
} else {
|
||||
// Otherwise, create a stack slot and emit a store to it before the
|
||||
// asm.
|
||||
@ -5989,7 +6036,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
unsigned Align = DL.getPrefTypeAlignment(Ty);
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
int SSFI = MF.getFrameInfo()->CreateStackObject(TySize, Align, false);
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy());
|
||||
SDValue StackSlot =
|
||||
DAG.getFrameIndex(SSFI, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
Chain = DAG.getStore(Chain, getCurSDLoc(),
|
||||
OpInfo.CallOperand, StackSlot,
|
||||
MachinePointerInfo::getFixedStack(SSFI),
|
||||
@ -6024,9 +6072,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
// AsmNodeOperands - The operands for the ISD::INLINEASM node.
|
||||
std::vector<SDValue> AsmNodeOperands;
|
||||
AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
|
||||
AsmNodeOperands.push_back(
|
||||
DAG.getTargetExternalSymbol(IA->getAsmString().c_str(),
|
||||
TLI.getPointerTy()));
|
||||
AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
|
||||
IA->getAsmString().c_str(), TLI.getPointerTy(DAG.getDataLayout())));
|
||||
|
||||
// If we have a !srcloc metadata node associated with it, we want to attach
|
||||
// this to the ultimately generated inline asm machineinstr. To do this, we
|
||||
@ -6066,8 +6113,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
}
|
||||
}
|
||||
|
||||
AsmNodeOperands.push_back(DAG.getTargetConstant(ExtraInfo, getCurSDLoc(),
|
||||
TLI.getPointerTy()));
|
||||
AsmNodeOperands.push_back(DAG.getTargetConstant(
|
||||
ExtraInfo, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
|
||||
|
||||
// Loop over all of the inputs, copying the operand values into the
|
||||
// appropriate registers and processing the output regs.
|
||||
@ -6203,8 +6250,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
OpFlag = InlineAsm::convertMemFlagWordToMatchingFlagWord(OpFlag);
|
||||
OpFlag = InlineAsm::getFlagWordForMatchingOp(OpFlag,
|
||||
OpInfo.getMatchedOperand());
|
||||
AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlag, getCurSDLoc(),
|
||||
TLI.getPointerTy()));
|
||||
AsmNodeOperands.push_back(DAG.getTargetConstant(
|
||||
OpFlag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
|
||||
AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
|
||||
break;
|
||||
}
|
||||
@ -6229,16 +6276,16 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
// Add information to the INLINEASM node to know about this input.
|
||||
unsigned ResOpType =
|
||||
InlineAsm::getFlagWord(InlineAsm::Kind_Imm, Ops.size());
|
||||
AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
|
||||
getCurSDLoc(),
|
||||
TLI.getPointerTy()));
|
||||
AsmNodeOperands.push_back(DAG.getTargetConstant(
|
||||
ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
|
||||
AsmNodeOperands.insert(AsmNodeOperands.end(), Ops.begin(), Ops.end());
|
||||
break;
|
||||
}
|
||||
|
||||
if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
|
||||
assert(OpInfo.isIndirect && "Operand must be indirect to be a mem!");
|
||||
assert(InOperandVal.getValueType() == TLI.getPointerTy() &&
|
||||
assert(InOperandVal.getValueType() ==
|
||||
TLI.getPointerTy(DAG.getDataLayout()) &&
|
||||
"Memory operands expect pointer values");
|
||||
|
||||
unsigned ConstraintID =
|
||||
@ -6316,7 +6363,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
|
||||
// FIXME: Why don't we do this for inline asms with MRVs?
|
||||
if (CS.getType()->isSingleValueType() && CS.getType()->isSized()) {
|
||||
EVT ResultType = TLI.getValueType(CS.getType());
|
||||
EVT ResultType = TLI.getValueType(DAG.getDataLayout(), CS.getType());
|
||||
|
||||
// If any of the results of the inline asm is a vector, it may have the
|
||||
// wrong width/num elts. This can happen for register classes that can
|
||||
@ -6383,8 +6430,8 @@ void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
|
||||
void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
const DataLayout &DL = DAG.getDataLayout();
|
||||
SDValue V = DAG.getVAArg(TLI.getValueType(I.getType()), getCurSDLoc(),
|
||||
getRoot(), getValue(I.getOperand(0)),
|
||||
SDValue V = DAG.getVAArg(TLI.getValueType(DAG.getDataLayout(), I.getType()),
|
||||
getCurSDLoc(), getRoot(), getValue(I.getOperand(0)),
|
||||
DAG.getSrcValue(I.getOperand(0)),
|
||||
DL.getABITypeAlignment(I.getType()));
|
||||
setValue(&I, V);
|
||||
@ -6475,8 +6522,8 @@ static void addStackMapLiveVars(ImmutableCallSite CS, unsigned StartIdx,
|
||||
Builder.DAG.getTargetConstant(C->getSExtValue(), DL, MVT::i64));
|
||||
} else if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(OpVal)) {
|
||||
const TargetLowering &TLI = Builder.DAG.getTargetLoweringInfo();
|
||||
Ops.push_back(
|
||||
Builder.DAG.getTargetFrameIndex(FI->getIndex(), TLI.getPointerTy()));
|
||||
Ops.push_back(Builder.DAG.getTargetFrameIndex(
|
||||
FI->getIndex(), TLI.getPointerTy(Builder.DAG.getDataLayout())));
|
||||
} else
|
||||
Ops.push_back(OpVal);
|
||||
}
|
||||
@ -6742,7 +6789,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
||||
DemoteStackIdx = MF.getFrameInfo()->CreateStackObject(TySize, Align, false);
|
||||
Type *StackSlotPtrType = PointerType::getUnqual(CLI.RetTy);
|
||||
|
||||
DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getPointerTy());
|
||||
DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getPointerTy(DL));
|
||||
ArgListEntry Entry;
|
||||
Entry.Node = DemoteStackSlot;
|
||||
Entry.Ty = StackSlotPtrType;
|
||||
@ -7656,8 +7703,9 @@ bool SelectionDAGBuilder::buildBitTests(CaseClusterVector &Clusters,
|
||||
APInt LowBound;
|
||||
APInt CmpRange;
|
||||
|
||||
const int BitWidth =
|
||||
DAG.getTargetLoweringInfo().getPointerTy().getSizeInBits();
|
||||
const int BitWidth = DAG.getTargetLoweringInfo()
|
||||
.getPointerTy(DAG.getDataLayout())
|
||||
.getSizeInBits();
|
||||
assert(rangeFitsInWord(Low, High) && "Case range must fit in bit mask!");
|
||||
|
||||
if (Low.isNonNegative() && High.slt(BitWidth)) {
|
||||
@ -7737,7 +7785,7 @@ void SelectionDAGBuilder::findBitTestClusters(CaseClusterVector &Clusters,
|
||||
|
||||
// If target does not have legal shift left, do not emit bit tests at all.
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT PTy = TLI.getPointerTy();
|
||||
EVT PTy = TLI.getPointerTy(DAG.getDataLayout());
|
||||
if (!TLI.isOperationLegal(ISD::SHL, PTy))
|
||||
return;
|
||||
|
||||
|
@ -921,7 +921,8 @@ void SelectionDAGISel::DoInstructionSelection() {
|
||||
bool SelectionDAGISel::PrepareEHLandingPad() {
|
||||
MachineBasicBlock *MBB = FuncInfo->MBB;
|
||||
|
||||
const TargetRegisterClass *PtrRC = TLI->getRegClassFor(TLI->getPointerTy());
|
||||
const TargetRegisterClass *PtrRC =
|
||||
TLI->getRegClassFor(TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
|
||||
// Add a label to mark the beginning of the landing pad. Deletion of the
|
||||
// landing pad can thus be detected via the MachineModuleInfo.
|
||||
@ -2329,21 +2330,23 @@ CheckOpcode(const unsigned char *MatcherTable, unsigned &MatcherIndex,
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
|
||||
CheckType(const unsigned char *MatcherTable, unsigned &MatcherIndex,
|
||||
SDValue N, const TargetLowering *TLI) {
|
||||
CheckType(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N,
|
||||
const TargetLowering *TLI, const DataLayout &DL) {
|
||||
MVT::SimpleValueType VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
|
||||
if (N.getValueType() == VT) return true;
|
||||
|
||||
// Handle the case when VT is iPTR.
|
||||
return VT == MVT::iPTR && N.getValueType() == TLI->getPointerTy();
|
||||
return VT == MVT::iPTR && N.getValueType() == TLI->getPointerTy(DL);
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
|
||||
CheckChildType(const unsigned char *MatcherTable, unsigned &MatcherIndex,
|
||||
SDValue N, const TargetLowering *TLI, unsigned ChildNo) {
|
||||
SDValue N, const TargetLowering *TLI, const DataLayout &DL,
|
||||
unsigned ChildNo) {
|
||||
if (ChildNo >= N.getNumOperands())
|
||||
return false; // Match fails if out of range child #.
|
||||
return ::CheckType(MatcherTable, MatcherIndex, N.getOperand(ChildNo), TLI);
|
||||
return ::CheckType(MatcherTable, MatcherIndex, N.getOperand(ChildNo), TLI,
|
||||
DL);
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
|
||||
@ -2355,13 +2358,13 @@ CheckCondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex,
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
|
||||
CheckValueType(const unsigned char *MatcherTable, unsigned &MatcherIndex,
|
||||
SDValue N, const TargetLowering *TLI) {
|
||||
SDValue N, const TargetLowering *TLI, const DataLayout &DL) {
|
||||
MVT::SimpleValueType VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
|
||||
if (cast<VTSDNode>(N)->getVT() == VT)
|
||||
return true;
|
||||
|
||||
// Handle the case when VT is iPTR.
|
||||
return VT == MVT::iPTR && cast<VTSDNode>(N)->getVT() == TLI->getPointerTy();
|
||||
return VT == MVT::iPTR && cast<VTSDNode>(N)->getVT() == TLI->getPointerTy(DL);
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
|
||||
@ -2444,7 +2447,8 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,
|
||||
Result = !::CheckOpcode(Table, Index, N.getNode());
|
||||
return Index;
|
||||
case SelectionDAGISel::OPC_CheckType:
|
||||
Result = !::CheckType(Table, Index, N, SDISel.TLI);
|
||||
Result = !::CheckType(Table, Index, N, SDISel.TLI,
|
||||
SDISel.CurDAG->getDataLayout());
|
||||
return Index;
|
||||
case SelectionDAGISel::OPC_CheckChild0Type:
|
||||
case SelectionDAGISel::OPC_CheckChild1Type:
|
||||
@ -2454,15 +2458,16 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,
|
||||
case SelectionDAGISel::OPC_CheckChild5Type:
|
||||
case SelectionDAGISel::OPC_CheckChild6Type:
|
||||
case SelectionDAGISel::OPC_CheckChild7Type:
|
||||
Result = !::CheckChildType(Table, Index, N, SDISel.TLI,
|
||||
Table[Index - 1] -
|
||||
SelectionDAGISel::OPC_CheckChild0Type);
|
||||
Result = !::CheckChildType(
|
||||
Table, Index, N, SDISel.TLI, SDISel.CurDAG->getDataLayout(),
|
||||
Table[Index - 1] - SelectionDAGISel::OPC_CheckChild0Type);
|
||||
return Index;
|
||||
case SelectionDAGISel::OPC_CheckCondCode:
|
||||
Result = !::CheckCondCode(Table, Index, N);
|
||||
return Index;
|
||||
case SelectionDAGISel::OPC_CheckValueType:
|
||||
Result = !::CheckValueType(Table, Index, N, SDISel.TLI);
|
||||
Result = !::CheckValueType(Table, Index, N, SDISel.TLI,
|
||||
SDISel.CurDAG->getDataLayout());
|
||||
return Index;
|
||||
case SelectionDAGISel::OPC_CheckInteger:
|
||||
Result = !::CheckInteger(Table, Index, N);
|
||||
@ -2816,7 +2821,8 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
continue;
|
||||
|
||||
case OPC_CheckType:
|
||||
if (!::CheckType(MatcherTable, MatcherIndex, N, TLI))
|
||||
if (!::CheckType(MatcherTable, MatcherIndex, N, TLI,
|
||||
CurDAG->getDataLayout()))
|
||||
break;
|
||||
continue;
|
||||
|
||||
@ -2864,7 +2870,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
|
||||
MVT CaseVT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
|
||||
if (CaseVT == MVT::iPTR)
|
||||
CaseVT = TLI->getPointerTy();
|
||||
CaseVT = TLI->getPointerTy(CurDAG->getDataLayout());
|
||||
|
||||
// If the VT matches, then we will execute this case.
|
||||
if (CurNodeVT == CaseVT)
|
||||
@ -2887,14 +2893,16 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
case OPC_CheckChild4Type: case OPC_CheckChild5Type:
|
||||
case OPC_CheckChild6Type: case OPC_CheckChild7Type:
|
||||
if (!::CheckChildType(MatcherTable, MatcherIndex, N, TLI,
|
||||
Opcode-OPC_CheckChild0Type))
|
||||
CurDAG->getDataLayout(),
|
||||
Opcode - OPC_CheckChild0Type))
|
||||
break;
|
||||
continue;
|
||||
case OPC_CheckCondCode:
|
||||
if (!::CheckCondCode(MatcherTable, MatcherIndex, N)) break;
|
||||
continue;
|
||||
case OPC_CheckValueType:
|
||||
if (!::CheckValueType(MatcherTable, MatcherIndex, N, TLI))
|
||||
if (!::CheckValueType(MatcherTable, MatcherIndex, N, TLI,
|
||||
CurDAG->getDataLayout()))
|
||||
break;
|
||||
continue;
|
||||
case OPC_CheckInteger:
|
||||
@ -3097,7 +3105,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
MVT::SimpleValueType VT =
|
||||
(MVT::SimpleValueType)MatcherTable[MatcherIndex++];
|
||||
if (VT == MVT::iPTR)
|
||||
VT = TLI->getPointerTy().SimpleTy;
|
||||
VT = TLI->getPointerTy(CurDAG->getDataLayout()).SimpleTy;
|
||||
VTs.push_back(VT);
|
||||
}
|
||||
|
||||
|
@ -102,7 +102,8 @@ TargetLowering::makeLibCall(SelectionDAG &DAG,
|
||||
}
|
||||
if (LC == RTLIB::UNKNOWN_LIBCALL)
|
||||
report_fatal_error("Unsupported library call operation!");
|
||||
SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC), getPointerTy());
|
||||
SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
@ -206,14 +207,16 @@ void TargetLowering::softenSetCCOperands(SelectionDAG &DAG, EVT VT,
|
||||
NewRHS = DAG.getConstant(0, dl, RetVT);
|
||||
CCCode = getCmpLibcallCC(LC1);
|
||||
if (LC2 != RTLIB::UNKNOWN_LIBCALL) {
|
||||
SDValue Tmp = DAG.getNode(ISD::SETCC, dl,
|
||||
getSetCCResultType(*DAG.getContext(), RetVT),
|
||||
NewLHS, NewRHS, DAG.getCondCode(CCCode));
|
||||
SDValue Tmp = DAG.getNode(
|
||||
ISD::SETCC, dl,
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), RetVT),
|
||||
NewLHS, NewRHS, DAG.getCondCode(CCCode));
|
||||
NewLHS = makeLibCall(DAG, LC2, RetVT, Ops, 2, false/*sign irrelevant*/,
|
||||
dl).first;
|
||||
NewLHS = DAG.getNode(ISD::SETCC, dl,
|
||||
getSetCCResultType(*DAG.getContext(), RetVT), NewLHS,
|
||||
NewRHS, DAG.getCondCode(getCmpLibcallCC(LC2)));
|
||||
NewLHS = DAG.getNode(
|
||||
ISD::SETCC, dl,
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), RetVT),
|
||||
NewLHS, NewRHS, DAG.getCondCode(getCmpLibcallCC(LC2)));
|
||||
NewLHS = DAG.getNode(ISD::OR, dl, Tmp.getValueType(), Tmp, NewLHS);
|
||||
NewRHS = SDValue();
|
||||
}
|
||||
@ -242,7 +245,7 @@ SDValue TargetLowering::getPICJumpTableRelocBase(SDValue Table,
|
||||
|
||||
if ((JTEncoding == MachineJumpTableInfo::EK_GPRel64BlockAddress) ||
|
||||
(JTEncoding == MachineJumpTableInfo::EK_GPRel32BlockAddress))
|
||||
return DAG.getGLOBAL_OFFSET_TABLE(getPointerTy(0));
|
||||
return DAG.getGLOBAL_OFFSET_TABLE(getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
return Table;
|
||||
}
|
||||
@ -1471,7 +1474,8 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
if (DCI.isBeforeLegalizeOps() ||
|
||||
(isOperationLegal(ISD::SETCC, newVT) &&
|
||||
getCondCodeAction(Cond, newVT.getSimpleVT()) == Legal)) {
|
||||
EVT NewSetCCVT = getSetCCResultType(*DAG.getContext(), newVT);
|
||||
EVT NewSetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), newVT);
|
||||
SDValue NewConst = DAG.getConstant(C1.trunc(InSize), dl, newVT);
|
||||
|
||||
SDValue NewSetCC = DAG.getSetCC(dl, NewSetCCVT, N0.getOperand(0),
|
||||
@ -1690,11 +1694,13 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
|
||||
(VT == N0.getValueType() ||
|
||||
(isTypeLegal(VT) && VT.bitsLE(N0.getValueType()))) &&
|
||||
N0.getOpcode() == ISD::AND)
|
||||
N0.getOpcode() == ISD::AND) {
|
||||
auto &DL = DAG.getDataLayout();
|
||||
if (ConstantSDNode *AndRHS =
|
||||
dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
|
||||
EVT ShiftTy = DCI.isBeforeLegalize() ?
|
||||
getPointerTy() : getShiftAmountTy(N0.getValueType());
|
||||
EVT ShiftTy = DCI.isBeforeLegalize()
|
||||
? getPointerTy(DL)
|
||||
: getShiftAmountTy(N0.getValueType());
|
||||
if (Cond == ISD::SETNE && C1 == 0) {// (X & 8) != 0 --> (X & 8) >> 3
|
||||
// Perform the xform if the AND RHS is a single bit.
|
||||
if (AndRHS->getAPIntValue().isPowerOf2()) {
|
||||
@ -1714,6 +1720,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (C1.getMinSignedBits() <= 64 &&
|
||||
!isLegalICmpImmediate(C1.getSExtValue())) {
|
||||
@ -1725,8 +1732,10 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
const APInt &AndRHSC = AndRHS->getAPIntValue();
|
||||
if ((-AndRHSC).isPowerOf2() && (AndRHSC & C1) == C1) {
|
||||
unsigned ShiftBits = AndRHSC.countTrailingZeros();
|
||||
EVT ShiftTy = DCI.isBeforeLegalize() ?
|
||||
getPointerTy() : getShiftAmountTy(N0.getValueType());
|
||||
auto &DL = DAG.getDataLayout();
|
||||
EVT ShiftTy = DCI.isBeforeLegalize()
|
||||
? getPointerTy(DL)
|
||||
: getShiftAmountTy(N0.getValueType());
|
||||
EVT CmpTy = N0.getValueType();
|
||||
SDValue Shift = DAG.getNode(ISD::SRL, dl, CmpTy, N0.getOperand(0),
|
||||
DAG.getConstant(ShiftBits, dl,
|
||||
@ -1755,8 +1764,10 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
NewC = NewC.lshr(ShiftBits);
|
||||
if (ShiftBits && NewC.getMinSignedBits() <= 64 &&
|
||||
isLegalICmpImmediate(NewC.getSExtValue())) {
|
||||
EVT ShiftTy = DCI.isBeforeLegalize() ?
|
||||
getPointerTy() : getShiftAmountTy(N0.getValueType());
|
||||
auto &DL = DAG.getDataLayout();
|
||||
EVT ShiftTy = DCI.isBeforeLegalize()
|
||||
? getPointerTy(DL)
|
||||
: getShiftAmountTy(N0.getValueType());
|
||||
EVT CmpTy = N0.getValueType();
|
||||
SDValue Shift = DAG.getNode(ISD::SRL, dl, CmpTy, N0,
|
||||
DAG.getConstant(ShiftBits, dl, ShiftTy));
|
||||
@ -2327,10 +2338,11 @@ TargetLowering::ParseConstraints(const DataLayout &DL,
|
||||
assert(!CS.getType()->isVoidTy() &&
|
||||
"Bad inline asm!");
|
||||
if (StructType *STy = dyn_cast<StructType>(CS.getType())) {
|
||||
OpInfo.ConstraintVT = getSimpleValueType(STy->getElementType(ResNo));
|
||||
OpInfo.ConstraintVT =
|
||||
getSimpleValueType(DL, STy->getElementType(ResNo));
|
||||
} else {
|
||||
assert(ResNo == 0 && "Asm only has one result!");
|
||||
OpInfo.ConstraintVT = getSimpleValueType(CS.getType());
|
||||
OpInfo.ConstraintVT = getSimpleValueType(DL, CS.getType());
|
||||
}
|
||||
++ResNo;
|
||||
break;
|
||||
|
@ -878,19 +878,6 @@ void TargetLoweringBase::initActions() {
|
||||
setOperationAction(ISD::DEBUGTRAP, MVT::Other, Expand);
|
||||
}
|
||||
|
||||
MVT TargetLoweringBase::getPointerTy(uint32_t AS) const {
|
||||
return MVT::getIntegerVT(getPointerSizeInBits(AS));
|
||||
}
|
||||
|
||||
unsigned TargetLoweringBase::getPointerSizeInBits(uint32_t AS) const {
|
||||
return getDataLayout()->getPointerSizeInBits(AS);
|
||||
}
|
||||
|
||||
unsigned TargetLoweringBase::getPointerTypeSizeInBits(Type *Ty) const {
|
||||
assert(Ty->isPointerTy());
|
||||
return getPointerSizeInBits(Ty->getPointerAddressSpace());
|
||||
}
|
||||
|
||||
MVT TargetLoweringBase::getScalarShiftAmountTy(EVT LHSTy) const {
|
||||
return MVT::getIntegerVT(8 * getDataLayout()->getPointerSize(0));
|
||||
}
|
||||
@ -1397,9 +1384,10 @@ void TargetLoweringBase::computeRegisterProperties(
|
||||
}
|
||||
}
|
||||
|
||||
EVT TargetLoweringBase::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
EVT TargetLoweringBase::getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
||||
EVT VT) const {
|
||||
assert(!VT.isVector() && "No default SetCC type for vectors!");
|
||||
return getPointerTy(0).SimpleTy;
|
||||
return getPointerTy(DL).SimpleTy;
|
||||
}
|
||||
|
||||
MVT::SimpleValueType TargetLoweringBase::getCmpLibcallReturnType() const {
|
||||
@ -1613,9 +1601,10 @@ int TargetLoweringBase::InstructionOpcodeToISD(unsigned Opcode) const {
|
||||
}
|
||||
|
||||
std::pair<unsigned, MVT>
|
||||
TargetLoweringBase::getTypeLegalizationCost(Type *Ty) const {
|
||||
TargetLoweringBase::getTypeLegalizationCost(const DataLayout &DL,
|
||||
Type *Ty) const {
|
||||
LLVMContext &C = Ty->getContext();
|
||||
EVT MTy = getValueType(Ty);
|
||||
EVT MTy = getValueType(DL, Ty);
|
||||
|
||||
unsigned Cost = 1;
|
||||
// We keep legalizing the type until we find a legal kind. We assume that
|
||||
|
@ -310,7 +310,7 @@ CCAssignFn *AArch64FastISel::CCAssignFnForCall(CallingConv::ID CC) const {
|
||||
}
|
||||
|
||||
unsigned AArch64FastISel::fastMaterializeAlloca(const AllocaInst *AI) {
|
||||
assert(TLI.getValueType(AI->getType(), true) == MVT::i64 &&
|
||||
assert(TLI.getValueType(DL, AI->getType(), true) == MVT::i64 &&
|
||||
"Alloca should always return a pointer.");
|
||||
|
||||
// Don't handle dynamic allocas.
|
||||
@ -420,7 +420,7 @@ unsigned AArch64FastISel::materializeGV(const GlobalValue *GV) {
|
||||
|
||||
unsigned char OpFlags = Subtarget->ClassifyGlobalReference(GV, TM);
|
||||
|
||||
EVT DestEVT = TLI.getValueType(GV->getType(), true);
|
||||
EVT DestEVT = TLI.getValueType(DL, GV->getType(), true);
|
||||
if (!DestEVT.isSimple())
|
||||
return 0;
|
||||
|
||||
@ -459,7 +459,7 @@ unsigned AArch64FastISel::materializeGV(const GlobalValue *GV) {
|
||||
}
|
||||
|
||||
unsigned AArch64FastISel::fastMaterializeConstant(const Constant *C) {
|
||||
EVT CEVT = TLI.getValueType(C->getType(), true);
|
||||
EVT CEVT = TLI.getValueType(DL, C->getType(), true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (!CEVT.isSimple())
|
||||
@ -538,13 +538,14 @@ bool AArch64FastISel::computeAddress(const Value *Obj, Address &Addr, Type *Ty)
|
||||
}
|
||||
case Instruction::IntToPtr: {
|
||||
// Look past no-op inttoptrs.
|
||||
if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(DL))
|
||||
return computeAddress(U->getOperand(0), Addr, Ty);
|
||||
break;
|
||||
}
|
||||
case Instruction::PtrToInt: {
|
||||
// Look past no-op ptrtoints.
|
||||
if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
|
||||
return computeAddress(U->getOperand(0), Addr, Ty);
|
||||
break;
|
||||
}
|
||||
@ -879,13 +880,13 @@ bool AArch64FastISel::computeCallAddress(const Value *V, Address &Addr) {
|
||||
case Instruction::IntToPtr:
|
||||
// Look past no-op inttoptrs if its operand is in the same BB.
|
||||
if (InMBB &&
|
||||
TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
|
||||
TLI.getValueType(DL, U->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(DL))
|
||||
return computeCallAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
case Instruction::PtrToInt:
|
||||
// Look past no-op ptrtoints if its operand is in the same BB.
|
||||
if (InMBB &&
|
||||
TLI.getValueType(U->getType()) == TLI.getPointerTy())
|
||||
if (InMBB && TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
|
||||
return computeCallAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
}
|
||||
@ -906,7 +907,7 @@ bool AArch64FastISel::computeCallAddress(const Value *V, Address &Addr) {
|
||||
|
||||
|
||||
bool AArch64FastISel::isTypeLegal(Type *Ty, MVT &VT) {
|
||||
EVT evt = TLI.getValueType(Ty, true);
|
||||
EVT evt = TLI.getValueType(DL, Ty, true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (evt == MVT::Other || !evt.isSimple())
|
||||
@ -1390,7 +1391,7 @@ unsigned AArch64FastISel::emitAddSub_rx(bool UseAdd, MVT RetVT, unsigned LHSReg,
|
||||
|
||||
bool AArch64FastISel::emitCmp(const Value *LHS, const Value *RHS, bool IsZExt) {
|
||||
Type *Ty = LHS->getType();
|
||||
EVT EVT = TLI.getValueType(Ty, true);
|
||||
EVT EVT = TLI.getValueType(DL, Ty, true);
|
||||
if (!EVT.isSimple())
|
||||
return false;
|
||||
MVT VT = EVT.getSimpleVT();
|
||||
@ -2761,7 +2762,7 @@ bool AArch64FastISel::selectFPToInt(const Instruction *I, bool Signed) {
|
||||
if (SrcReg == 0)
|
||||
return false;
|
||||
|
||||
EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType(), true);
|
||||
EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType(), true);
|
||||
if (SrcVT == MVT::f128)
|
||||
return false;
|
||||
|
||||
@ -2797,7 +2798,7 @@ bool AArch64FastISel::selectIntToFP(const Instruction *I, bool Signed) {
|
||||
return false;
|
||||
bool SrcIsKill = hasTrivialKill(I->getOperand(0));
|
||||
|
||||
EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType(), true);
|
||||
EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType(), true);
|
||||
|
||||
// Handle sign-extension.
|
||||
if (SrcVT == MVT::i16 || SrcVT == MVT::i8 || SrcVT == MVT::i1) {
|
||||
@ -2856,7 +2857,7 @@ bool AArch64FastISel::fastLowerArguments() {
|
||||
if (ArgTy->isStructTy() || ArgTy->isArrayTy())
|
||||
return false;
|
||||
|
||||
EVT ArgVT = TLI.getValueType(ArgTy);
|
||||
EVT ArgVT = TLI.getValueType(DL, ArgTy);
|
||||
if (!ArgVT.isSimple())
|
||||
return false;
|
||||
|
||||
@ -2898,7 +2899,7 @@ bool AArch64FastISel::fastLowerArguments() {
|
||||
unsigned GPRIdx = 0;
|
||||
unsigned FPRIdx = 0;
|
||||
for (auto const &Arg : F->args()) {
|
||||
MVT VT = TLI.getSimpleValueType(Arg.getType());
|
||||
MVT VT = TLI.getSimpleValueType(DL, Arg.getType());
|
||||
unsigned SrcReg;
|
||||
const TargetRegisterClass *RC;
|
||||
if (VT >= MVT::i1 && VT <= MVT::i32) {
|
||||
@ -3724,7 +3725,7 @@ bool AArch64FastISel::selectRet(const Instruction *I) {
|
||||
if (!MRI.getRegClass(SrcReg)->contains(DestReg))
|
||||
return false;
|
||||
|
||||
EVT RVEVT = TLI.getValueType(RV->getType());
|
||||
EVT RVEVT = TLI.getValueType(DL, RV->getType());
|
||||
if (!RVEVT.isSimple())
|
||||
return false;
|
||||
|
||||
@ -3772,8 +3773,8 @@ bool AArch64FastISel::selectTrunc(const Instruction *I) {
|
||||
Value *Op = I->getOperand(0);
|
||||
Type *SrcTy = Op->getType();
|
||||
|
||||
EVT SrcEVT = TLI.getValueType(SrcTy, true);
|
||||
EVT DestEVT = TLI.getValueType(DestTy, true);
|
||||
EVT SrcEVT = TLI.getValueType(DL, SrcTy, true);
|
||||
EVT DestEVT = TLI.getValueType(DL, DestTy, true);
|
||||
if (!SrcEVT.isSimple())
|
||||
return false;
|
||||
if (!DestEVT.isSimple())
|
||||
@ -4459,7 +4460,7 @@ bool AArch64FastISel::selectIntExt(const Instruction *I) {
|
||||
}
|
||||
|
||||
bool AArch64FastISel::selectRem(const Instruction *I, unsigned ISDOpcode) {
|
||||
EVT DestEVT = TLI.getValueType(I->getType(), true);
|
||||
EVT DestEVT = TLI.getValueType(DL, I->getType(), true);
|
||||
if (!DestEVT.isSimple())
|
||||
return false;
|
||||
|
||||
@ -4825,7 +4826,7 @@ std::pair<unsigned, bool> AArch64FastISel::getRegForGEPIndex(const Value *Idx) {
|
||||
bool IdxNIsKill = hasTrivialKill(Idx);
|
||||
|
||||
// If the index is smaller or larger than intptr_t, truncate or extend it.
|
||||
MVT PtrVT = TLI.getPointerTy();
|
||||
MVT PtrVT = TLI.getPointerTy(DL);
|
||||
EVT IdxVT = EVT::getEVT(Idx->getType(), /*HandleUnknown=*/false);
|
||||
if (IdxVT.bitsLT(PtrVT)) {
|
||||
IdxN = emitIntExt(IdxVT.getSimpleVT(), IdxN, PtrVT, /*IsZExt=*/false);
|
||||
@ -4849,7 +4850,7 @@ bool AArch64FastISel::selectGetElementPtr(const Instruction *I) {
|
||||
// into a single N = N + TotalOffset.
|
||||
uint64_t TotalOffs = 0;
|
||||
Type *Ty = I->getOperand(0)->getType();
|
||||
MVT VT = TLI.getPointerTy();
|
||||
MVT VT = TLI.getPointerTy(DL);
|
||||
for (auto OI = std::next(I->op_begin()), E = I->op_end(); OI != E; ++OI) {
|
||||
const Value *Idx = *OI;
|
||||
if (auto *StTy = dyn_cast<StructType>(Ty)) {
|
||||
|
@ -610,10 +610,11 @@ static bool isWorthFoldingADDlow(SDValue N) {
|
||||
bool AArch64DAGToDAGISel::SelectAddrModeIndexed(SDValue N, unsigned Size,
|
||||
SDValue &Base, SDValue &OffImm) {
|
||||
SDLoc dl(N);
|
||||
const DataLayout &DL = CurDAG->getDataLayout();
|
||||
const TargetLowering *TLI = getTargetLowering();
|
||||
if (N.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy(DL));
|
||||
OffImm = CurDAG->getTargetConstant(0, dl, MVT::i64);
|
||||
return true;
|
||||
}
|
||||
@ -628,10 +629,9 @@ bool AArch64DAGToDAGISel::SelectAddrModeIndexed(SDValue N, unsigned Size,
|
||||
|
||||
const GlobalValue *GV = GAN->getGlobal();
|
||||
unsigned Alignment = GV->getAlignment();
|
||||
const DataLayout *DL = TLI->getDataLayout();
|
||||
Type *Ty = GV->getType()->getElementType();
|
||||
if (Alignment == 0 && Ty->isSized())
|
||||
Alignment = DL->getABITypeAlignment(Ty);
|
||||
Alignment = DL.getABITypeAlignment(Ty);
|
||||
|
||||
if (Alignment >= Size)
|
||||
return true;
|
||||
@ -645,7 +645,7 @@ bool AArch64DAGToDAGISel::SelectAddrModeIndexed(SDValue N, unsigned Size,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy(DL));
|
||||
}
|
||||
OffImm = CurDAG->getTargetConstant(RHSC >> Scale, dl, MVT::i64);
|
||||
return true;
|
||||
@ -688,7 +688,8 @@ bool AArch64DAGToDAGISel::SelectAddrModeUnscaled(SDValue N, unsigned Size,
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
const TargetLowering *TLI = getTargetLowering();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
OffImm = CurDAG->getTargetConstant(RHSC, SDLoc(N), MVT::i64);
|
||||
return true;
|
||||
@ -2351,7 +2352,8 @@ SDNode *AArch64DAGToDAGISel::Select(SDNode *Node) {
|
||||
int FI = cast<FrameIndexSDNode>(Node)->getIndex();
|
||||
unsigned Shifter = AArch64_AM::getShifterImm(AArch64_AM::LSL, 0);
|
||||
const TargetLowering *TLI = getTargetLowering();
|
||||
SDValue TFI = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
SDValue TFI = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
SDLoc DL(Node);
|
||||
SDValue Ops[] = { TFI, CurDAG->getTargetConstant(0, DL, MVT::i32),
|
||||
CurDAG->getTargetConstant(Shifter, DL, MVT::i32) };
|
||||
|
@ -705,7 +705,8 @@ void AArch64TargetLowering::addQRTypeForNEON(MVT VT) {
|
||||
addTypeForNEON(VT, MVT::v4i32);
|
||||
}
|
||||
|
||||
EVT AArch64TargetLowering::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
EVT AArch64TargetLowering::getSetCCResultType(const DataLayout &, LLVMContext &,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return MVT::i32;
|
||||
return VT.changeVectorElementTypeToInteger();
|
||||
@ -1710,7 +1711,8 @@ SDValue AArch64TargetLowering::LowerFSINCOS(SDValue Op,
|
||||
|
||||
const char *LibcallName =
|
||||
(ArgVT == MVT::f64) ? "__sincos_stret" : "__sincosf_stret";
|
||||
SDValue Callee = DAG.getExternalSymbol(LibcallName, getPointerTy());
|
||||
SDValue Callee =
|
||||
DAG.getExternalSymbol(LibcallName, getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
StructType *RetTy = StructType::get(ArgTy, ArgTy, nullptr);
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
@ -2089,7 +2091,8 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
|
||||
CurArgIdx = Ins[i].getOrigArgIndex();
|
||||
|
||||
// Get type of the original argument.
|
||||
EVT ActualVT = getValueType(CurOrigArg->getType(), /*AllowUnknown*/ true);
|
||||
EVT ActualVT = getValueType(DAG.getDataLayout(), CurOrigArg->getType(),
|
||||
/*AllowUnknown*/ true);
|
||||
MVT ActualMVT = ActualVT.isSimple() ? ActualVT.getSimpleVT() : MVT::Other;
|
||||
// If ActualMVT is i1/i8/i16, we should set LocVT to i8/i8/i16.
|
||||
if (ActualMVT == MVT::i1 || ActualMVT == MVT::i8)
|
||||
@ -2111,7 +2114,7 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
|
||||
if (Ins[i].Flags.isByVal()) {
|
||||
// Byval is used for HFAs in the PCS, but the system should work in a
|
||||
// non-compliant manner for larger structs.
|
||||
EVT PtrTy = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
int Size = Ins[i].Flags.getByValSize();
|
||||
unsigned NumRegs = (Size + 7) / 8;
|
||||
|
||||
@ -2119,7 +2122,7 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
|
||||
// case. It should also work for fundamental types too.
|
||||
unsigned FrameIdx =
|
||||
MFI->CreateFixedObject(8 * NumRegs, VA.getLocMemOffset(), false);
|
||||
SDValue FrameIdxN = DAG.getFrameIndex(FrameIdx, PtrTy);
|
||||
SDValue FrameIdxN = DAG.getFrameIndex(FrameIdx, PtrVT);
|
||||
InVals.push_back(FrameIdxN);
|
||||
|
||||
continue;
|
||||
@ -2186,7 +2189,7 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
|
||||
int FI = MFI->CreateFixedObject(ArgSize, ArgOffset + BEAlign, true);
|
||||
|
||||
// Create load nodes to retrieve arguments from the stack.
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
SDValue ArgValue;
|
||||
|
||||
// For NON_EXTLOAD, generic code in getLoad assert(ValVT == MemVT)
|
||||
@ -2265,6 +2268,7 @@ void AArch64TargetLowering::saveVarArgRegisters(CCState &CCInfo,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
SmallVector<SDValue, 8> MemOps;
|
||||
|
||||
@ -2279,7 +2283,7 @@ void AArch64TargetLowering::saveVarArgRegisters(CCState &CCInfo,
|
||||
if (GPRSaveSize != 0) {
|
||||
GPRIdx = MFI->CreateStackObject(GPRSaveSize, 8, false);
|
||||
|
||||
SDValue FIN = DAG.getFrameIndex(GPRIdx, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(GPRIdx, PtrVT);
|
||||
|
||||
for (unsigned i = FirstVariadicGPR; i < NumGPRArgRegs; ++i) {
|
||||
unsigned VReg = MF.addLiveIn(GPRArgRegs[i], &AArch64::GPR64RegClass);
|
||||
@ -2288,8 +2292,8 @@ void AArch64TargetLowering::saveVarArgRegisters(CCState &CCInfo,
|
||||
DAG.getStore(Val.getValue(1), DL, Val, FIN,
|
||||
MachinePointerInfo::getStack(i * 8), false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
FIN = DAG.getNode(ISD::ADD, DL, getPointerTy(), FIN,
|
||||
DAG.getConstant(8, DL, getPointerTy()));
|
||||
FIN =
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT, FIN, DAG.getConstant(8, DL, PtrVT));
|
||||
}
|
||||
}
|
||||
FuncInfo->setVarArgsGPRIndex(GPRIdx);
|
||||
@ -2307,7 +2311,7 @@ void AArch64TargetLowering::saveVarArgRegisters(CCState &CCInfo,
|
||||
if (FPRSaveSize != 0) {
|
||||
FPRIdx = MFI->CreateStackObject(FPRSaveSize, 16, false);
|
||||
|
||||
SDValue FIN = DAG.getFrameIndex(FPRIdx, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FPRIdx, PtrVT);
|
||||
|
||||
for (unsigned i = FirstVariadicFPR; i < NumFPRArgRegs; ++i) {
|
||||
unsigned VReg = MF.addLiveIn(FPRArgRegs[i], &AArch64::FPR128RegClass);
|
||||
@ -2317,8 +2321,8 @@ void AArch64TargetLowering::saveVarArgRegisters(CCState &CCInfo,
|
||||
DAG.getStore(Val.getValue(1), DL, Val, FIN,
|
||||
MachinePointerInfo::getStack(i * 16), false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
FIN = DAG.getNode(ISD::ADD, DL, getPointerTy(), FIN,
|
||||
DAG.getConstant(16, DL, getPointerTy()));
|
||||
FIN = DAG.getNode(ISD::ADD, DL, PtrVT, FIN,
|
||||
DAG.getConstant(16, DL, PtrVT));
|
||||
}
|
||||
}
|
||||
FuncInfo->setVarArgsFPRIndex(FPRIdx);
|
||||
@ -2614,7 +2618,8 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
|
||||
for (unsigned i = 0; i != NumArgs; ++i) {
|
||||
MVT ValVT = Outs[i].VT;
|
||||
// Get type of the original argument.
|
||||
EVT ActualVT = getValueType(CLI.getArgs()[Outs[i].OrigArgIndex].Ty,
|
||||
EVT ActualVT = getValueType(DAG.getDataLayout(),
|
||||
CLI.getArgs()[Outs[i].OrigArgIndex].Ty,
|
||||
/*AllowUnknown*/ true);
|
||||
MVT ActualMVT = ActualVT.isSimple() ? ActualVT.getSimpleVT() : ValVT;
|
||||
ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
|
||||
@ -2674,10 +2679,12 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
|
||||
true),
|
||||
DL);
|
||||
|
||||
SDValue StackPtr = DAG.getCopyFromReg(Chain, DL, AArch64::SP, getPointerTy());
|
||||
SDValue StackPtr = DAG.getCopyFromReg(Chain, DL, AArch64::SP,
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
|
||||
SmallVector<SDValue, 8> MemOpChains;
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Walk the register/memloc assignments, inserting copies/loads.
|
||||
for (unsigned i = 0, realArgIdx = 0, e = ArgLocs.size(); i != e;
|
||||
@ -2743,13 +2750,13 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
|
||||
unsigned LocMemOffset = VA.getLocMemOffset();
|
||||
int32_t Offset = LocMemOffset + BEAlign;
|
||||
SDValue PtrOff = DAG.getIntPtrConstant(Offset, DL);
|
||||
PtrOff = DAG.getNode(ISD::ADD, DL, getPointerTy(), StackPtr, PtrOff);
|
||||
PtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, PtrOff);
|
||||
|
||||
if (IsTailCall) {
|
||||
Offset = Offset + FPDiff;
|
||||
int FI = MF.getFrameInfo()->CreateFixedObject(OpSize, Offset, true);
|
||||
|
||||
DstAddr = DAG.getFrameIndex(FI, getPointerTy());
|
||||
DstAddr = DAG.getFrameIndex(FI, PtrVT);
|
||||
DstInfo = MachinePointerInfo::getFixedStack(FI);
|
||||
|
||||
// Make sure any stack arguments overlapping with where we're storing
|
||||
@ -2759,7 +2766,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
|
||||
} else {
|
||||
SDValue PtrOff = DAG.getIntPtrConstant(Offset, DL);
|
||||
|
||||
DstAddr = DAG.getNode(ISD::ADD, DL, getPointerTy(), StackPtr, PtrOff);
|
||||
DstAddr = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, PtrOff);
|
||||
DstInfo = MachinePointerInfo::getStack(LocMemOffset);
|
||||
}
|
||||
|
||||
@ -2809,25 +2816,24 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
|
||||
const GlobalValue *GV = G->getGlobal();
|
||||
bool InternalLinkage = GV->hasInternalLinkage();
|
||||
if (InternalLinkage)
|
||||
Callee = DAG.getTargetGlobalAddress(GV, DL, getPointerTy(), 0, 0);
|
||||
Callee = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, 0);
|
||||
else {
|
||||
Callee = DAG.getTargetGlobalAddress(GV, DL, getPointerTy(), 0,
|
||||
AArch64II::MO_GOT);
|
||||
Callee = DAG.getNode(AArch64ISD::LOADgot, DL, getPointerTy(), Callee);
|
||||
Callee =
|
||||
DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, AArch64II::MO_GOT);
|
||||
Callee = DAG.getNode(AArch64ISD::LOADgot, DL, PtrVT, Callee);
|
||||
}
|
||||
} else if (ExternalSymbolSDNode *S =
|
||||
dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
const char *Sym = S->getSymbol();
|
||||
Callee =
|
||||
DAG.getTargetExternalSymbol(Sym, getPointerTy(), AArch64II::MO_GOT);
|
||||
Callee = DAG.getNode(AArch64ISD::LOADgot, DL, getPointerTy(), Callee);
|
||||
Callee = DAG.getTargetExternalSymbol(Sym, PtrVT, AArch64II::MO_GOT);
|
||||
Callee = DAG.getNode(AArch64ISD::LOADgot, DL, PtrVT, Callee);
|
||||
}
|
||||
} else if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||
const GlobalValue *GV = G->getGlobal();
|
||||
Callee = DAG.getTargetGlobalAddress(GV, DL, getPointerTy(), 0, 0);
|
||||
Callee = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, 0);
|
||||
} else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
const char *Sym = S->getSymbol();
|
||||
Callee = DAG.getTargetExternalSymbol(Sym, getPointerTy(), 0);
|
||||
Callee = DAG.getTargetExternalSymbol(Sym, PtrVT, 0);
|
||||
}
|
||||
|
||||
// We don't usually want to end the call-sequence here because we would tidy
|
||||
@ -2977,7 +2983,7 @@ AArch64TargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
|
||||
|
||||
SDValue AArch64TargetLowering::LowerGlobalAddress(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc DL(Op);
|
||||
const GlobalAddressSDNode *GN = cast<GlobalAddressSDNode>(Op);
|
||||
const GlobalValue *GV = GN->getGlobal();
|
||||
@ -3069,7 +3075,7 @@ AArch64TargetLowering::LowerDarwinGlobalTLSAddress(SDValue Op,
|
||||
assert(Subtarget->isTargetDarwin() && "TLS only supported on Darwin");
|
||||
|
||||
SDLoc DL(Op);
|
||||
MVT PtrVT = getPointerTy();
|
||||
MVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
|
||||
SDValue TLVPAddr =
|
||||
@ -3124,7 +3130,7 @@ AArch64TargetLowering::LowerDarwinGlobalTLSAddress(SDValue Op,
|
||||
/// the sequence is produced as per above.
|
||||
SDValue AArch64TargetLowering::LowerELFTLSDescCallSeq(SDValue SymAddr, SDLoc DL,
|
||||
SelectionDAG &DAG) const {
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
SDValue Chain = DAG.getEntryNode();
|
||||
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
|
||||
@ -3159,7 +3165,7 @@ AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op,
|
||||
}
|
||||
|
||||
SDValue TPOff;
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc DL(Op);
|
||||
const GlobalValue *GV = GA->getGlobal();
|
||||
|
||||
@ -3786,7 +3792,7 @@ SDValue AArch64TargetLowering::LowerJumpTable(SDValue Op,
|
||||
// Jump table entries as PC relative offsets. No additional tweaking
|
||||
// is necessary here. Just get the address of the jump table.
|
||||
JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc DL(Op);
|
||||
|
||||
if (getTargetMachine().getCodeModel() == CodeModel::Large &&
|
||||
@ -3812,7 +3818,7 @@ SDValue AArch64TargetLowering::LowerJumpTable(SDValue Op,
|
||||
SDValue AArch64TargetLowering::LowerConstantPool(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc DL(Op);
|
||||
|
||||
if (getTargetMachine().getCodeModel() == CodeModel::Large) {
|
||||
@ -3853,7 +3859,7 @@ SDValue AArch64TargetLowering::LowerConstantPool(SDValue Op,
|
||||
SDValue AArch64TargetLowering::LowerBlockAddress(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc DL(Op);
|
||||
if (getTargetMachine().getCodeModel() == CodeModel::Large &&
|
||||
!Subtarget->isTargetMachO()) {
|
||||
@ -3879,8 +3885,8 @@ SDValue AArch64TargetLowering::LowerDarwin_VASTART(SDValue Op,
|
||||
DAG.getMachineFunction().getInfo<AArch64FunctionInfo>();
|
||||
|
||||
SDLoc DL(Op);
|
||||
SDValue FR =
|
||||
DAG.getFrameIndex(FuncInfo->getVarArgsStackIndex(), getPointerTy());
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsStackIndex(),
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
return DAG.getStore(Op.getOperand(0), DL, FR, Op.getOperand(1),
|
||||
MachinePointerInfo(SV), false, false, 0);
|
||||
@ -3892,6 +3898,7 @@ SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
|
||||
// Standard, section B.3.
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc DL(Op);
|
||||
|
||||
SDValue Chain = Op.getOperand(0);
|
||||
@ -3900,8 +3907,7 @@ SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
|
||||
SmallVector<SDValue, 4> MemOps;
|
||||
|
||||
// void *__stack at offset 0
|
||||
SDValue Stack =
|
||||
DAG.getFrameIndex(FuncInfo->getVarArgsStackIndex(), getPointerTy());
|
||||
SDValue Stack = DAG.getFrameIndex(FuncInfo->getVarArgsStackIndex(), PtrVT);
|
||||
MemOps.push_back(DAG.getStore(Chain, DL, Stack, VAList,
|
||||
MachinePointerInfo(SV), false, false, 8));
|
||||
|
||||
@ -3910,12 +3916,12 @@ SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
|
||||
if (GPRSize > 0) {
|
||||
SDValue GRTop, GRTopAddr;
|
||||
|
||||
GRTopAddr = DAG.getNode(ISD::ADD, DL, getPointerTy(), VAList,
|
||||
DAG.getConstant(8, DL, getPointerTy()));
|
||||
GRTopAddr =
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(8, DL, PtrVT));
|
||||
|
||||
GRTop = DAG.getFrameIndex(FuncInfo->getVarArgsGPRIndex(), getPointerTy());
|
||||
GRTop = DAG.getNode(ISD::ADD, DL, getPointerTy(), GRTop,
|
||||
DAG.getConstant(GPRSize, DL, getPointerTy()));
|
||||
GRTop = DAG.getFrameIndex(FuncInfo->getVarArgsGPRIndex(), PtrVT);
|
||||
GRTop = DAG.getNode(ISD::ADD, DL, PtrVT, GRTop,
|
||||
DAG.getConstant(GPRSize, DL, PtrVT));
|
||||
|
||||
MemOps.push_back(DAG.getStore(Chain, DL, GRTop, GRTopAddr,
|
||||
MachinePointerInfo(SV, 8), false, false, 8));
|
||||
@ -3925,28 +3931,28 @@ SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
|
||||
int FPRSize = FuncInfo->getVarArgsFPRSize();
|
||||
if (FPRSize > 0) {
|
||||
SDValue VRTop, VRTopAddr;
|
||||
VRTopAddr = DAG.getNode(ISD::ADD, DL, getPointerTy(), VAList,
|
||||
DAG.getConstant(16, DL, getPointerTy()));
|
||||
VRTopAddr = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
|
||||
DAG.getConstant(16, DL, PtrVT));
|
||||
|
||||
VRTop = DAG.getFrameIndex(FuncInfo->getVarArgsFPRIndex(), getPointerTy());
|
||||
VRTop = DAG.getNode(ISD::ADD, DL, getPointerTy(), VRTop,
|
||||
DAG.getConstant(FPRSize, DL, getPointerTy()));
|
||||
VRTop = DAG.getFrameIndex(FuncInfo->getVarArgsFPRIndex(), PtrVT);
|
||||
VRTop = DAG.getNode(ISD::ADD, DL, PtrVT, VRTop,
|
||||
DAG.getConstant(FPRSize, DL, PtrVT));
|
||||
|
||||
MemOps.push_back(DAG.getStore(Chain, DL, VRTop, VRTopAddr,
|
||||
MachinePointerInfo(SV, 16), false, false, 8));
|
||||
}
|
||||
|
||||
// int __gr_offs at offset 24
|
||||
SDValue GROffsAddr = DAG.getNode(ISD::ADD, DL, getPointerTy(), VAList,
|
||||
DAG.getConstant(24, DL, getPointerTy()));
|
||||
SDValue GROffsAddr =
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(24, DL, PtrVT));
|
||||
MemOps.push_back(DAG.getStore(Chain, DL,
|
||||
DAG.getConstant(-GPRSize, DL, MVT::i32),
|
||||
GROffsAddr, MachinePointerInfo(SV, 24), false,
|
||||
false, 4));
|
||||
|
||||
// int __vr_offs at offset 28
|
||||
SDValue VROffsAddr = DAG.getNode(ISD::ADD, DL, getPointerTy(), VAList,
|
||||
DAG.getConstant(28, DL, getPointerTy()));
|
||||
SDValue VROffsAddr =
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(28, DL, PtrVT));
|
||||
MemOps.push_back(DAG.getStore(Chain, DL,
|
||||
DAG.getConstant(-FPRSize, DL, MVT::i32),
|
||||
VROffsAddr, MachinePointerInfo(SV, 28), false,
|
||||
@ -3987,21 +3993,22 @@ SDValue AArch64TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Chain = Op.getOperand(0);
|
||||
SDValue Addr = Op.getOperand(1);
|
||||
unsigned Align = Op.getConstantOperandVal(3);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
SDValue VAList = DAG.getLoad(getPointerTy(), DL, Chain, Addr,
|
||||
MachinePointerInfo(V), false, false, false, 0);
|
||||
SDValue VAList = DAG.getLoad(PtrVT, DL, Chain, Addr, MachinePointerInfo(V),
|
||||
false, false, false, 0);
|
||||
Chain = VAList.getValue(1);
|
||||
|
||||
if (Align > 8) {
|
||||
assert(((Align & (Align - 1)) == 0) && "Expected Align to be a power of 2");
|
||||
VAList = DAG.getNode(ISD::ADD, DL, getPointerTy(), VAList,
|
||||
DAG.getConstant(Align - 1, DL, getPointerTy()));
|
||||
VAList = DAG.getNode(ISD::AND, DL, getPointerTy(), VAList,
|
||||
DAG.getConstant(-(int64_t)Align, DL, getPointerTy()));
|
||||
VAList = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
|
||||
DAG.getConstant(Align - 1, DL, PtrVT));
|
||||
VAList = DAG.getNode(ISD::AND, DL, PtrVT, VAList,
|
||||
DAG.getConstant(-(int64_t)Align, DL, PtrVT));
|
||||
}
|
||||
|
||||
Type *ArgTy = VT.getTypeForEVT(*DAG.getContext());
|
||||
uint64_t ArgSize = getDataLayout()->getTypeAllocSize(ArgTy);
|
||||
uint64_t ArgSize = DAG.getDataLayout().getTypeAllocSize(ArgTy);
|
||||
|
||||
// Scalar integer and FP values smaller than 64 bits are implicitly extended
|
||||
// up to 64 bits. At the very least, we have to increase the striding of the
|
||||
@ -4016,8 +4023,8 @@ SDValue AArch64TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
|
||||
}
|
||||
|
||||
// Increment the pointer, VAList, to the next vaarg
|
||||
SDValue VANext = DAG.getNode(ISD::ADD, DL, getPointerTy(), VAList,
|
||||
DAG.getConstant(ArgSize, DL, getPointerTy()));
|
||||
SDValue VANext = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
|
||||
DAG.getConstant(ArgSize, DL, PtrVT));
|
||||
// Store the incremented VAList to the legalized pointer
|
||||
SDValue APStore = DAG.getStore(Chain, DL, VANext, Addr, MachinePointerInfo(V),
|
||||
false, false, 0);
|
||||
@ -4079,7 +4086,7 @@ SDValue AArch64TargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
if (Depth) {
|
||||
SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
|
||||
SDValue Offset = DAG.getConstant(8, DL, getPointerTy());
|
||||
SDValue Offset = DAG.getConstant(8, DL, getPointerTy(DAG.getDataLayout()));
|
||||
return DAG.getLoad(VT, DL, DAG.getEntryNode(),
|
||||
DAG.getNode(ISD::ADD, DL, VT, FrameAddr, Offset),
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
@ -6570,7 +6577,8 @@ bool AArch64TargetLowering::isProfitableToHoist(Instruction *I) const {
|
||||
return true;
|
||||
|
||||
const TargetOptions &Options = getTargetMachine().Options;
|
||||
EVT VT = getValueType(User->getOperand(0)->getType());
|
||||
const DataLayout &DL = I->getModule()->getDataLayout();
|
||||
EVT VT = getValueType(DL, User->getOperand(0)->getType());
|
||||
|
||||
if (isFMAFasterThanFMulAndFAdd(VT) &&
|
||||
isOperationLegalOrCustom(ISD::FMA, VT) &&
|
||||
|
@ -278,7 +278,8 @@ public:
|
||||
bool isShuffleMaskLegal(const SmallVectorImpl<int> &M, EVT VT) const override;
|
||||
|
||||
/// getSetCCResultType - Return the ISD::SETCC ValueType
|
||||
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const override;
|
||||
|
||||
SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -37,8 +37,8 @@ SDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
|
||||
if (bzeroEntry && (!SizeValue || SizeValue->getZExtValue() > 256)) {
|
||||
const AArch64TargetLowering &TLI = *STI.getTargetLowering();
|
||||
|
||||
EVT IntPtr = TLI.getPointerTy();
|
||||
Type *IntPtrTy = getDataLayout()->getIntPtrType(*DAG.getContext());
|
||||
EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout());
|
||||
Type *IntPtrTy = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Node = Dst;
|
||||
|
@ -181,8 +181,8 @@ unsigned AArch64TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
assert(ISD && "Invalid opcode");
|
||||
|
||||
EVT SrcTy = TLI->getValueType(Src);
|
||||
EVT DstTy = TLI->getValueType(Dst);
|
||||
EVT SrcTy = TLI->getValueType(DL, Src);
|
||||
EVT DstTy = TLI->getValueType(DL, Dst);
|
||||
|
||||
if (!SrcTy.isSimple() || !DstTy.isSimple())
|
||||
return BaseT::getCastInstrCost(Opcode, Dst, Src);
|
||||
@ -265,7 +265,7 @@ unsigned AArch64TTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val,
|
||||
|
||||
if (Index != -1U) {
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Val);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Val);
|
||||
|
||||
// This type is legalized to a scalar type.
|
||||
if (!LT.second.isVector())
|
||||
@ -289,7 +289,7 @@ unsigned AArch64TTIImpl::getArithmeticInstrCost(
|
||||
TTI::OperandValueKind Opd2Info, TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo) {
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Ty);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
|
||||
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
|
||||
@ -364,8 +364,8 @@ unsigned AArch64TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
{ ISD::SELECT, MVT::v16i1, MVT::v16i64, 16 * AmortizationCost }
|
||||
};
|
||||
|
||||
EVT SelCondTy = TLI->getValueType(CondTy);
|
||||
EVT SelValTy = TLI->getValueType(ValTy);
|
||||
EVT SelCondTy = TLI->getValueType(DL, CondTy);
|
||||
EVT SelValTy = TLI->getValueType(DL, ValTy);
|
||||
if (SelCondTy.isSimple() && SelValTy.isSimple()) {
|
||||
int Idx =
|
||||
ConvertCostTableLookup(VectorSelectTbl, ISD, SelCondTy.getSimpleVT(),
|
||||
@ -380,7 +380,7 @@ unsigned AArch64TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
unsigned AArch64TTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src,
|
||||
unsigned Alignment,
|
||||
unsigned AddressSpace) {
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Src);
|
||||
|
||||
if (Opcode == Instruction::Store && Src->isVectorTy() && Alignment != 16 &&
|
||||
Src->getVectorElementType()->isIntegerTy(64)) {
|
||||
|
@ -444,7 +444,7 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM,
|
||||
// Target Information
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
MVT AMDGPUTargetLowering::getVectorIdxTy() const {
|
||||
MVT AMDGPUTargetLowering::getVectorIdxTy(const DataLayout &) const {
|
||||
return MVT::i32;
|
||||
}
|
||||
|
||||
@ -785,7 +785,7 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
||||
SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
|
||||
const DataLayout *TD = getDataLayout();
|
||||
const DataLayout &DL = DAG.getDataLayout();
|
||||
GlobalAddressSDNode *G = cast<GlobalAddressSDNode>(Op);
|
||||
const GlobalValue *GV = G->getGlobal();
|
||||
|
||||
@ -801,7 +801,7 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
||||
|
||||
unsigned Offset;
|
||||
if (MFI->LocalMemoryObjects.count(GV) == 0) {
|
||||
uint64_t Size = TD->getTypeAllocSize(GV->getType()->getElementType());
|
||||
uint64_t Size = DL.getTypeAllocSize(GV->getType()->getElementType());
|
||||
Offset = MFI->LDSSize;
|
||||
MFI->LocalMemoryObjects[GV] = Offset;
|
||||
// XXX: Account for alignment?
|
||||
@ -811,16 +811,16 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
||||
}
|
||||
|
||||
return DAG.getConstant(Offset, SDLoc(Op),
|
||||
getPointerTy(AMDGPUAS::LOCAL_ADDRESS));
|
||||
getPointerTy(DL, AMDGPUAS::LOCAL_ADDRESS));
|
||||
}
|
||||
case AMDGPUAS::CONSTANT_ADDRESS: {
|
||||
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
||||
Type *EltType = GV->getType()->getElementType();
|
||||
unsigned Size = TD->getTypeAllocSize(EltType);
|
||||
unsigned Alignment = TD->getPrefTypeAlignment(EltType);
|
||||
unsigned Size = DL.getTypeAllocSize(EltType);
|
||||
unsigned Alignment = DL.getPrefTypeAlignment(EltType);
|
||||
|
||||
MVT PrivPtrVT = getPointerTy(AMDGPUAS::PRIVATE_ADDRESS);
|
||||
MVT ConstPtrVT = getPointerTy(AMDGPUAS::CONSTANT_ADDRESS);
|
||||
MVT PrivPtrVT = getPointerTy(DL, AMDGPUAS::PRIVATE_ADDRESS);
|
||||
MVT ConstPtrVT = getPointerTy(DL, AMDGPUAS::CONSTANT_ADDRESS);
|
||||
|
||||
int FI = FrameInfo->CreateStackObject(Size, Alignment, false);
|
||||
SDValue InitPtr = DAG.getFrameIndex(FI, PrivPtrVT);
|
||||
@ -1653,7 +1653,7 @@ SDValue AMDGPUTargetLowering::LowerDIVREM24(SDValue Op, SelectionDAG &DAG, bool
|
||||
// fb = fabs(fb);
|
||||
fb = DAG.getNode(ISD::FABS, DL, FltVT, fb);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), VT);
|
||||
EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
|
||||
|
||||
// int cv = fr >= fb;
|
||||
SDValue cv = DAG.getSetCC(DL, SetCCVT, fr, fb, ISD::SETOGE);
|
||||
@ -1960,7 +1960,8 @@ SDValue AMDGPUTargetLowering::LowerFCEIL(SDValue Op, SelectionDAG &DAG) const {
|
||||
const SDValue Zero = DAG.getConstantFP(0.0, SL, MVT::f64);
|
||||
const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f64);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::f64);
|
||||
EVT SetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::f64);
|
||||
|
||||
SDValue Lt0 = DAG.getSetCC(SL, SetCCVT, Src, Zero, ISD::SETOGT);
|
||||
SDValue NeTrunc = DAG.getSetCC(SL, SetCCVT, Src, Trunc, ISD::SETONE);
|
||||
@ -2020,7 +2021,8 @@ SDValue AMDGPUTargetLowering::LowerFTRUNC(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Not = DAG.getNOT(SL, Shr, MVT::i64);
|
||||
SDValue Tmp0 = DAG.getNode(ISD::AND, SL, MVT::i64, BcInt, Not);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::i32);
|
||||
EVT SetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i32);
|
||||
|
||||
const SDValue FiftyOne = DAG.getConstant(FractBits - 1, SL, MVT::i32);
|
||||
|
||||
@ -2051,7 +2053,8 @@ SDValue AMDGPUTargetLowering::LowerFRINT(SDValue Op, SelectionDAG &DAG) const {
|
||||
APFloat C2Val(APFloat::IEEEdouble, "0x1.fffffffffffffp+51");
|
||||
SDValue C2 = DAG.getConstantFP(C2Val, SL, MVT::f64);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::f64);
|
||||
EVT SetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::f64);
|
||||
SDValue Cond = DAG.getSetCC(SL, SetCCVT, Fabs, C2, ISD::SETOGT);
|
||||
|
||||
return DAG.getSelect(SL, MVT::f64, Cond, Src, Tmp2);
|
||||
@ -2081,7 +2084,8 @@ SDValue AMDGPUTargetLowering::LowerFROUND32(SDValue Op, SelectionDAG &DAG) const
|
||||
|
||||
SDValue SignOne = DAG.getNode(ISD::FCOPYSIGN, SL, MVT::f32, One, X);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::f32);
|
||||
EVT SetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::f32);
|
||||
|
||||
SDValue Cmp = DAG.getSetCC(SL, SetCCVT, AbsDiff, Half, ISD::SETOGE);
|
||||
|
||||
@ -2100,8 +2104,8 @@ SDValue AMDGPUTargetLowering::LowerFROUND64(SDValue Op, SelectionDAG &DAG) const
|
||||
const SDValue One = DAG.getConstant(1, SL, MVT::i32);
|
||||
const SDValue NegOne = DAG.getConstant(-1, SL, MVT::i32);
|
||||
const SDValue FiftyOne = DAG.getConstant(51, SL, MVT::i32);
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::i32);
|
||||
|
||||
EVT SetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i32);
|
||||
|
||||
SDValue BC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, X);
|
||||
|
||||
@ -2172,7 +2176,8 @@ SDValue AMDGPUTargetLowering::LowerFFLOOR(SDValue Op, SelectionDAG &DAG) const {
|
||||
const SDValue Zero = DAG.getConstantFP(0.0, SL, MVT::f64);
|
||||
const SDValue NegOne = DAG.getConstantFP(-1.0, SL, MVT::f64);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::f64);
|
||||
EVT SetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::f64);
|
||||
|
||||
SDValue Lt0 = DAG.getSetCC(SL, SetCCVT, Src, Zero, ISD::SETOLT);
|
||||
SDValue NeTrunc = DAG.getSetCC(SL, SetCCVT, Src, Trunc, ISD::SETONE);
|
||||
|
@ -123,7 +123,7 @@ public:
|
||||
|
||||
bool isNarrowingProfitable(EVT VT1, EVT VT2) const override;
|
||||
|
||||
MVT getVectorIdxTy() const override;
|
||||
MVT getVectorIdxTy(const DataLayout &) const override;
|
||||
bool isSelectSupported(SelectSupportKind) const override;
|
||||
|
||||
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
||||
|
@ -897,8 +897,9 @@ SDValue R600TargetLowering::vectorToVerticalVector(SelectionDAG &DAG,
|
||||
|
||||
for (unsigned i = 0, e = VecVT.getVectorNumElements();
|
||||
i != e; ++i) {
|
||||
Args.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Vector,
|
||||
DAG.getConstant(i, DL, getVectorIdxTy())));
|
||||
Args.push_back(DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Vector,
|
||||
DAG.getConstant(i, DL, getVectorIdxTy(DAG.getDataLayout()))));
|
||||
}
|
||||
|
||||
return DAG.getNode(AMDGPUISD::BUILD_VERTICAL_VECTOR, DL, VecVT, Args);
|
||||
@ -1471,10 +1472,11 @@ SDValue R600TargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const
|
||||
// Lower loads constant address space global variable loads
|
||||
if (LoadNode->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS &&
|
||||
isa<GlobalVariable>(GetUnderlyingObject(
|
||||
LoadNode->getMemOperand()->getValue(), *getDataLayout()))) {
|
||||
LoadNode->getMemOperand()->getValue(), DAG.getDataLayout()))) {
|
||||
|
||||
SDValue Ptr = DAG.getZExtOrTrunc(LoadNode->getBasePtr(), DL,
|
||||
getPointerTy(AMDGPUAS::PRIVATE_ADDRESS));
|
||||
SDValue Ptr = DAG.getZExtOrTrunc(
|
||||
LoadNode->getBasePtr(), DL,
|
||||
getPointerTy(DAG.getDataLayout(), AMDGPUAS::PRIVATE_ADDRESS));
|
||||
Ptr = DAG.getNode(ISD::SRL, DL, MVT::i32, Ptr,
|
||||
DAG.getConstant(2, DL, MVT::i32));
|
||||
return DAG.getNode(AMDGPUISD::REGISTER_LOAD, DL, Op->getVTList(),
|
||||
@ -1702,7 +1704,8 @@ SDValue R600TargetLowering::LowerFormalArguments(
|
||||
return Chain;
|
||||
}
|
||||
|
||||
EVT R600TargetLowering::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
EVT R600TargetLowering::getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return MVT::i32;
|
||||
return VT.changeVectorElementTypeToInteger();
|
||||
|
@ -38,7 +38,9 @@ public:
|
||||
const SmallVectorImpl<ISD::InputArg> &Ins,
|
||||
SDLoc DL, SelectionDAG &DAG,
|
||||
SmallVectorImpl<SDValue> &InVals) const override;
|
||||
EVT getSetCCResultType(LLVMContext &, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
||||
EVT VT) const override;
|
||||
|
||||
private:
|
||||
unsigned Gen;
|
||||
/// Each OpenCL kernel has nine implicit parameters that are stored in the
|
||||
|
@ -425,13 +425,13 @@ SDValue SITargetLowering::LowerParameter(SelectionDAG &DAG, EVT VT, EVT MemVT,
|
||||
Type *Ty = VT.getTypeForEVT(*DAG.getContext());
|
||||
|
||||
MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
|
||||
MVT PtrVT = getPointerTy(AMDGPUAS::CONSTANT_ADDRESS);
|
||||
MVT PtrVT = getPointerTy(DAG.getDataLayout(), AMDGPUAS::CONSTANT_ADDRESS);
|
||||
PointerType *PtrTy = PointerType::get(Ty, AMDGPUAS::CONSTANT_ADDRESS);
|
||||
SDValue BasePtr = DAG.getCopyFromReg(Chain, SL,
|
||||
MRI.getLiveInVirtReg(InputPtrReg), PtrVT);
|
||||
SDValue Ptr = DAG.getNode(ISD::ADD, SL, PtrVT, BasePtr,
|
||||
DAG.getConstant(Offset, SL, PtrVT));
|
||||
SDValue PtrOffset = DAG.getUNDEF(getPointerTy(AMDGPUAS::CONSTANT_ADDRESS));
|
||||
SDValue PtrOffset = DAG.getUNDEF(PtrVT);
|
||||
MachinePointerInfo PtrInfo(UndefValue::get(PtrTy));
|
||||
|
||||
unsigned Align = DL->getABITypeAlignment(Ty);
|
||||
@ -695,7 +695,8 @@ bool SITargetLowering::enableAggressiveFMAFusion(EVT VT) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
EVT SITargetLowering::getSetCCResultType(LLVMContext &Ctx, EVT VT) const {
|
||||
EVT SITargetLowering::getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector()) {
|
||||
return MVT::i1;
|
||||
}
|
||||
@ -888,7 +889,7 @@ SDValue SITargetLowering::LowerGlobalAddress(AMDGPUMachineFunction *MFI,
|
||||
|
||||
SDLoc DL(GSD);
|
||||
const GlobalValue *GV = GSD->getGlobal();
|
||||
MVT PtrVT = getPointerTy(GSD->getAddressSpace());
|
||||
MVT PtrVT = getPointerTy(DAG.getDataLayout(), GSD->getAddressSpace());
|
||||
|
||||
SDValue Ptr = DAG.getNode(AMDGPUISD::CONST_DATA_PTR, DL, PtrVT);
|
||||
SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i32);
|
||||
@ -1213,7 +1214,8 @@ SDValue SITargetLowering::LowerFDIV32(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f32);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::f32);
|
||||
EVT SetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::f32);
|
||||
|
||||
SDValue r2 = DAG.getSetCC(SL, SetCCVT, r1, K0, ISD::SETOGT);
|
||||
|
||||
|
@ -90,7 +90,8 @@ public:
|
||||
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr * MI,
|
||||
MachineBasicBlock * BB) const override;
|
||||
bool enableAggressiveFMAFusion(EVT VT) const override;
|
||||
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const override;
|
||||
MVT getScalarShiftAmountTy(EVT VT) const override;
|
||||
bool isFMAFasterThanFMulAndFAdd(EVT VT) const override;
|
||||
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
|
||||
|
@ -683,7 +683,7 @@ unsigned ARMFastISel::ARMMaterializeGV(const GlobalValue *GV, MVT VT) {
|
||||
}
|
||||
|
||||
unsigned ARMFastISel::fastMaterializeConstant(const Constant *C) {
|
||||
EVT CEVT = TLI.getValueType(C->getType(), true);
|
||||
EVT CEVT = TLI.getValueType(DL, C->getType(), true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (!CEVT.isSimple()) return 0;
|
||||
@ -730,7 +730,7 @@ unsigned ARMFastISel::fastMaterializeAlloca(const AllocaInst *AI) {
|
||||
}
|
||||
|
||||
bool ARMFastISel::isTypeLegal(Type *Ty, MVT &VT) {
|
||||
EVT evt = TLI.getValueType(Ty, true);
|
||||
EVT evt = TLI.getValueType(DL, Ty, true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (evt == MVT::Other || !evt.isSimple()) return false;
|
||||
@ -784,12 +784,13 @@ bool ARMFastISel::ARMComputeAddress(const Value *Obj, Address &Addr) {
|
||||
return ARMComputeAddress(U->getOperand(0), Addr);
|
||||
case Instruction::IntToPtr:
|
||||
// Look past no-op inttoptrs.
|
||||
if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(DL))
|
||||
return ARMComputeAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
case Instruction::PtrToInt:
|
||||
// Look past no-op ptrtoints.
|
||||
if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
|
||||
return ARMComputeAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
case Instruction::GetElementPtr: {
|
||||
@ -1363,7 +1364,7 @@ bool ARMFastISel::SelectIndirectBr(const Instruction *I) {
|
||||
bool ARMFastISel::ARMEmitCmp(const Value *Src1Value, const Value *Src2Value,
|
||||
bool isZExt) {
|
||||
Type *Ty = Src1Value->getType();
|
||||
EVT SrcEVT = TLI.getValueType(Ty, true);
|
||||
EVT SrcEVT = TLI.getValueType(DL, Ty, true);
|
||||
if (!SrcEVT.isSimple()) return false;
|
||||
MVT SrcVT = SrcEVT.getSimpleVT();
|
||||
|
||||
@ -1555,7 +1556,7 @@ bool ARMFastISel::SelectIToFP(const Instruction *I, bool isSigned) {
|
||||
return false;
|
||||
|
||||
Value *Src = I->getOperand(0);
|
||||
EVT SrcEVT = TLI.getValueType(Src->getType(), true);
|
||||
EVT SrcEVT = TLI.getValueType(DL, Src->getType(), true);
|
||||
if (!SrcEVT.isSimple())
|
||||
return false;
|
||||
MVT SrcVT = SrcEVT.getSimpleVT();
|
||||
@ -1748,7 +1749,7 @@ bool ARMFastISel::SelectRem(const Instruction *I, bool isSigned) {
|
||||
}
|
||||
|
||||
bool ARMFastISel::SelectBinaryIntOp(const Instruction *I, unsigned ISDOpcode) {
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
// We can get here in the case when we have a binary operation on a non-legal
|
||||
// type and the target independent selector doesn't know how to handle it.
|
||||
@ -1788,7 +1789,7 @@ bool ARMFastISel::SelectBinaryIntOp(const Instruction *I, unsigned ISDOpcode) {
|
||||
}
|
||||
|
||||
bool ARMFastISel::SelectBinaryFPOp(const Instruction *I, unsigned ISDOpcode) {
|
||||
EVT FPVT = TLI.getValueType(I->getType(), true);
|
||||
EVT FPVT = TLI.getValueType(DL, I->getType(), true);
|
||||
if (!FPVT.isSimple()) return false;
|
||||
MVT VT = FPVT.getSimpleVT();
|
||||
|
||||
@ -2120,7 +2121,7 @@ bool ARMFastISel::SelectRet(const Instruction *I) {
|
||||
return false;
|
||||
|
||||
unsigned SrcReg = Reg + VA.getValNo();
|
||||
EVT RVEVT = TLI.getValueType(RV->getType());
|
||||
EVT RVEVT = TLI.getValueType(DL, RV->getType());
|
||||
if (!RVEVT.isSimple()) return false;
|
||||
MVT RVVT = RVEVT.getSimpleVT();
|
||||
MVT DestVT = VA.getValVT();
|
||||
@ -2171,7 +2172,7 @@ unsigned ARMFastISel::ARMSelectCallOp(bool UseReg) {
|
||||
unsigned ARMFastISel::getLibcallReg(const Twine &Name) {
|
||||
// Manually compute the global's type to avoid building it when unnecessary.
|
||||
Type *GVTy = Type::getInt32PtrTy(*Context, /*AS=*/0);
|
||||
EVT LCREVT = TLI.getValueType(GVTy);
|
||||
EVT LCREVT = TLI.getValueType(DL, GVTy);
|
||||
if (!LCREVT.isSimple()) return 0;
|
||||
|
||||
GlobalValue *GV = new GlobalVariable(M, Type::getInt32Ty(*Context), false,
|
||||
@ -2574,8 +2575,8 @@ bool ARMFastISel::SelectTrunc(const Instruction *I) {
|
||||
Value *Op = I->getOperand(0);
|
||||
|
||||
EVT SrcVT, DestVT;
|
||||
SrcVT = TLI.getValueType(Op->getType(), true);
|
||||
DestVT = TLI.getValueType(I->getType(), true);
|
||||
SrcVT = TLI.getValueType(DL, Op->getType(), true);
|
||||
DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
if (SrcVT != MVT::i32 && SrcVT != MVT::i16 && SrcVT != MVT::i8)
|
||||
return false;
|
||||
@ -2740,8 +2741,8 @@ bool ARMFastISel::SelectIntExt(const Instruction *I) {
|
||||
if (!SrcReg) return false;
|
||||
|
||||
EVT SrcEVT, DestEVT;
|
||||
SrcEVT = TLI.getValueType(SrcTy, true);
|
||||
DestEVT = TLI.getValueType(DestTy, true);
|
||||
SrcEVT = TLI.getValueType(DL, SrcTy, true);
|
||||
DestEVT = TLI.getValueType(DL, DestTy, true);
|
||||
if (!SrcEVT.isSimple()) return false;
|
||||
if (!DestEVT.isSimple()) return false;
|
||||
|
||||
@ -2761,7 +2762,7 @@ bool ARMFastISel::SelectShift(const Instruction *I,
|
||||
return false;
|
||||
|
||||
// Only handle i32 now.
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
if (DestVT != MVT::i32)
|
||||
return false;
|
||||
|
||||
@ -3024,7 +3025,7 @@ bool ARMFastISel::fastLowerArguments() {
|
||||
if (ArgTy->isStructTy() || ArgTy->isArrayTy() || ArgTy->isVectorTy())
|
||||
return false;
|
||||
|
||||
EVT ArgVT = TLI.getValueType(ArgTy);
|
||||
EVT ArgVT = TLI.getValueType(DL, ArgTy);
|
||||
if (!ArgVT.isSimple()) return false;
|
||||
switch (ArgVT.getSimpleVT().SimpleTy) {
|
||||
case MVT::i8:
|
||||
|
@ -533,7 +533,8 @@ bool ARMDAGToDAGISel::SelectAddrModeImm12(SDValue N,
|
||||
if (N.getOpcode() == ISD::FrameIndex) {
|
||||
// Match frame index.
|
||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
OffImm = CurDAG->getTargetConstant(0, SDLoc(N), MVT::i32);
|
||||
return true;
|
||||
}
|
||||
@ -556,7 +557,8 @@ bool ARMDAGToDAGISel::SelectAddrModeImm12(SDValue N,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
OffImm = CurDAG->getTargetConstant(RHSC, SDLoc(N), MVT::i32);
|
||||
return true;
|
||||
@ -702,7 +704,8 @@ AddrMode2Type ARMDAGToDAGISel::SelectAddrMode2Worker(SDValue N,
|
||||
Base = N;
|
||||
if (N.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
} else if (N.getOpcode() == ARMISD::Wrapper &&
|
||||
N.getOperand(0).getOpcode() != ISD::TargetGlobalAddress) {
|
||||
Base = N.getOperand(0);
|
||||
@ -722,7 +725,8 @@ AddrMode2Type ARMDAGToDAGISel::SelectAddrMode2Worker(SDValue N,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
Offset = CurDAG->getRegister(0, MVT::i32);
|
||||
|
||||
@ -900,7 +904,8 @@ bool ARMDAGToDAGISel::SelectAddrMode3(SDValue N,
|
||||
Base = N;
|
||||
if (N.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
Offset = CurDAG->getRegister(0, MVT::i32);
|
||||
Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(ARM_AM::add, 0), SDLoc(N),
|
||||
@ -915,7 +920,8 @@ bool ARMDAGToDAGISel::SelectAddrMode3(SDValue N,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
Offset = CurDAG->getRegister(0, MVT::i32);
|
||||
|
||||
@ -964,7 +970,8 @@ bool ARMDAGToDAGISel::SelectAddrMode5(SDValue N,
|
||||
Base = N;
|
||||
if (N.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
} else if (N.getOpcode() == ARMISD::Wrapper &&
|
||||
N.getOperand(0).getOpcode() != ISD::TargetGlobalAddress) {
|
||||
Base = N.getOperand(0);
|
||||
@ -981,7 +988,8 @@ bool ARMDAGToDAGISel::SelectAddrMode5(SDValue N,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
|
||||
ARM_AM::AddrOpc AddSub = ARM_AM::add;
|
||||
@ -1215,7 +1223,8 @@ bool ARMDAGToDAGISel::SelectThumbAddrModeSP(SDValue N,
|
||||
MachineFrameInfo *MFI = MF->getFrameInfo();
|
||||
if (MFI->getObjectAlignment(FI) < 4)
|
||||
MFI->setObjectAlignment(FI, 4);
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
OffImm = CurDAG->getTargetConstant(0, SDLoc(N), MVT::i32);
|
||||
return true;
|
||||
}
|
||||
@ -1237,7 +1246,8 @@ bool ARMDAGToDAGISel::SelectThumbAddrModeSP(SDValue N,
|
||||
MachineFrameInfo *MFI = MF->getFrameInfo();
|
||||
if (MFI->getObjectAlignment(FI) < 4)
|
||||
MFI->setObjectAlignment(FI, 4);
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
OffImm = CurDAG->getTargetConstant(RHSC, SDLoc(N), MVT::i32);
|
||||
return true;
|
||||
@ -1285,7 +1295,8 @@ bool ARMDAGToDAGISel::SelectT2AddrModeImm12(SDValue N,
|
||||
if (N.getOpcode() == ISD::FrameIndex) {
|
||||
// Match frame index.
|
||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
OffImm = CurDAG->getTargetConstant(0, SDLoc(N), MVT::i32);
|
||||
return true;
|
||||
}
|
||||
@ -1314,7 +1325,8 @@ bool ARMDAGToDAGISel::SelectT2AddrModeImm12(SDValue N,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
OffImm = CurDAG->getTargetConstant(RHSC, SDLoc(N), MVT::i32);
|
||||
return true;
|
||||
@ -1343,7 +1355,8 @@ bool ARMDAGToDAGISel::SelectT2AddrModeImm8(SDValue N,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
OffImm = CurDAG->getTargetConstant(RHSC, SDLoc(N), MVT::i32);
|
||||
return true;
|
||||
@ -1438,7 +1451,8 @@ bool ARMDAGToDAGISel::SelectT2AddrModeExclusive(SDValue N, SDValue &Base,
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
|
||||
OffImm = CurDAG->getTargetConstant(RHSC/4, SDLoc(N), MVT::i32);
|
||||
@ -2510,7 +2524,7 @@ SDNode *ARMDAGToDAGISel::Select(SDNode *N) {
|
||||
if (UseCP) {
|
||||
SDValue CPIdx = CurDAG->getTargetConstantPool(
|
||||
ConstantInt::get(Type::getInt32Ty(*CurDAG->getContext()), Val),
|
||||
TLI->getPointerTy());
|
||||
TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
|
||||
SDNode *ResNode;
|
||||
if (Subtarget->isThumb()) {
|
||||
@ -2540,7 +2554,8 @@ SDNode *ARMDAGToDAGISel::Select(SDNode *N) {
|
||||
case ISD::FrameIndex: {
|
||||
// Selects to ADDri FI, 0 which in turn will become ADDri SP, imm.
|
||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||
SDValue TFI = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
|
||||
SDValue TFI = CurDAG->getTargetFrameIndex(
|
||||
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
if (Subtarget->isThumb1Only()) {
|
||||
// Set the alignment of the frame object to 4, to avoid having to generate
|
||||
// more than one ADD
|
||||
|
@ -1144,8 +1144,10 @@ const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
EVT ARMTargetLowering::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
if (!VT.isVector()) return getPointerTy();
|
||||
EVT ARMTargetLowering::getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return getPointerTy(DL);
|
||||
return VT.changeVectorElementTypeToInteger();
|
||||
}
|
||||
|
||||
@ -1424,7 +1426,8 @@ ARMTargetLowering::LowerMemOpCallTo(SDValue Chain,
|
||||
ISD::ArgFlagsTy Flags) const {
|
||||
unsigned LocMemOffset = VA.getLocMemOffset();
|
||||
SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(DAG.getDataLayout()),
|
||||
StackPtr, PtrOff);
|
||||
return DAG.getStore(Chain, dl, Arg, PtrOff,
|
||||
MachinePointerInfo::getStack(LocMemOffset),
|
||||
false, false, 0);
|
||||
@ -1448,7 +1451,8 @@ void ARMTargetLowering::PassF64ArgInRegs(SDLoc dl, SelectionDAG &DAG,
|
||||
else {
|
||||
assert(NextVA.isMemLoc());
|
||||
if (!StackPtr.getNode())
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl, ARM::SP, getPointerTy());
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl, ARM::SP,
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
MemOpChains.push_back(LowerMemOpCallTo(Chain, StackPtr, fmrrd.getValue(1-id),
|
||||
dl, DAG, NextVA,
|
||||
@ -1521,7 +1525,8 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
Chain = DAG.getCALLSEQ_START(Chain,
|
||||
DAG.getIntPtrConstant(NumBytes, dl, true), dl);
|
||||
|
||||
SDValue StackPtr = DAG.getCopyFromReg(Chain, dl, ARM::SP, getPointerTy());
|
||||
SDValue StackPtr =
|
||||
DAG.getCopyFromReg(Chain, dl, ARM::SP, getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
RegsToPassVector RegsToPass;
|
||||
SmallVector<SDValue, 8> MemOpChains;
|
||||
@ -1602,7 +1607,8 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
unsigned RegBegin, RegEnd;
|
||||
CCInfo.getInRegsParamInfo(CurByValIdx, RegBegin, RegEnd);
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT =
|
||||
DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
unsigned int i, j;
|
||||
for (i = 0, j = RegBegin; j < RegEnd; i++, j++) {
|
||||
SDValue Const = DAG.getConstant(4*i, dl, MVT::i32);
|
||||
@ -1623,12 +1629,12 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
}
|
||||
|
||||
if (Flags.getByValSize() > 4*offset) {
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
unsigned LocMemOffset = VA.getLocMemOffset();
|
||||
SDValue StkPtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
|
||||
SDValue Dst = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr,
|
||||
StkPtrOff);
|
||||
SDValue Dst = DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr, StkPtrOff);
|
||||
SDValue SrcOffset = DAG.getIntPtrConstant(4*offset, dl);
|
||||
SDValue Src = DAG.getNode(ISD::ADD, dl, getPointerTy(), Arg, SrcOffset);
|
||||
SDValue Src = DAG.getNode(ISD::ADD, dl, PtrVT, Arg, SrcOffset);
|
||||
SDValue SizeNode = DAG.getConstant(Flags.getByValSize() - 4*offset, dl,
|
||||
MVT::i32);
|
||||
SDValue AlignNode = DAG.getConstant(Flags.getByValAlign(), dl,
|
||||
@ -1688,6 +1694,7 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
bool isARMFunc = false;
|
||||
bool isLocalARMFunc = false;
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
auto PtrVt = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (Subtarget->genLongCalls()) {
|
||||
assert((Subtarget->isTargetWindows() ||
|
||||
@ -1704,12 +1711,11 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
ARMConstantPoolConstant::Create(GV, ARMPCLabelIndex, ARMCP::CPValue, 0);
|
||||
|
||||
// Get the address of the callee into a register
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVt, 4);
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
Callee = DAG.getLoad(getPointerTy(), dl,
|
||||
DAG.getEntryNode(), CPAddr,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
false, false, false, 0);
|
||||
Callee = DAG.getLoad(PtrVt, dl, DAG.getEntryNode(), CPAddr,
|
||||
MachinePointerInfo::getConstantPool(), false, false,
|
||||
false, 0);
|
||||
} else if (ExternalSymbolSDNode *S=dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
const char *Sym = S->getSymbol();
|
||||
|
||||
@ -1719,12 +1725,11 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
ARMConstantPoolSymbol::Create(*DAG.getContext(), Sym,
|
||||
ARMPCLabelIndex, 0);
|
||||
// Get the address of the callee into a register
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVt, 4);
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
Callee = DAG.getLoad(getPointerTy(), dl,
|
||||
DAG.getEntryNode(), CPAddr,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
false, false, false, 0);
|
||||
Callee = DAG.getLoad(PtrVt, dl, DAG.getEntryNode(), CPAddr,
|
||||
MachinePointerInfo::getConstantPool(), false, false,
|
||||
false, 0);
|
||||
}
|
||||
} else if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||
const GlobalValue *GV = G->getGlobal();
|
||||
@ -1738,10 +1743,10 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
// tBX takes a register source operand.
|
||||
if (isStub && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) {
|
||||
assert(Subtarget->isTargetMachO() && "WrapperPIC use on non-MachO?");
|
||||
Callee = DAG.getNode(ARMISD::WrapperPIC, dl, getPointerTy(),
|
||||
DAG.getTargetGlobalAddress(GV, dl, getPointerTy(),
|
||||
0, ARMII::MO_NONLAZY));
|
||||
Callee = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), Callee,
|
||||
Callee = DAG.getNode(
|
||||
ARMISD::WrapperPIC, dl, PtrVt,
|
||||
DAG.getTargetGlobalAddress(GV, dl, PtrVt, 0, ARMII::MO_NONLAZY));
|
||||
Callee = DAG.getLoad(PtrVt, dl, DAG.getEntryNode(), Callee,
|
||||
MachinePointerInfo::getGOT(), false, false, true, 0);
|
||||
} else if (Subtarget->isTargetCOFF()) {
|
||||
assert(Subtarget->isTargetWindows() &&
|
||||
@ -1749,20 +1754,20 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
unsigned TargetFlags = GV->hasDLLImportStorageClass()
|
||||
? ARMII::MO_DLLIMPORT
|
||||
: ARMII::MO_NO_FLAG;
|
||||
Callee = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(), /*Offset=*/0,
|
||||
TargetFlags);
|
||||
Callee =
|
||||
DAG.getTargetGlobalAddress(GV, dl, PtrVt, /*Offset=*/0, TargetFlags);
|
||||
if (GV->hasDLLImportStorageClass())
|
||||
Callee = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
|
||||
DAG.getNode(ARMISD::Wrapper, dl, getPointerTy(),
|
||||
Callee), MachinePointerInfo::getGOT(),
|
||||
false, false, false, 0);
|
||||
Callee =
|
||||
DAG.getLoad(PtrVt, dl, DAG.getEntryNode(),
|
||||
DAG.getNode(ARMISD::Wrapper, dl, PtrVt, Callee),
|
||||
MachinePointerInfo::getGOT(), false, false, false, 0);
|
||||
} else {
|
||||
// On ELF targets for PIC code, direct calls should go through the PLT
|
||||
unsigned OpFlags = 0;
|
||||
if (Subtarget->isTargetELF() &&
|
||||
getTargetMachine().getRelocationModel() == Reloc::PIC_)
|
||||
OpFlags = ARMII::MO_PLT;
|
||||
Callee = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(), 0, OpFlags);
|
||||
Callee = DAG.getTargetGlobalAddress(GV, dl, PtrVt, 0, OpFlags);
|
||||
}
|
||||
} else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
isDirect = true;
|
||||
@ -1776,22 +1781,20 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
ARMConstantPoolValue *CPV =
|
||||
ARMConstantPoolSymbol::Create(*DAG.getContext(), Sym,
|
||||
ARMPCLabelIndex, 4);
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVt, 4);
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
Callee = DAG.getLoad(getPointerTy(), dl,
|
||||
DAG.getEntryNode(), CPAddr,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
false, false, false, 0);
|
||||
Callee = DAG.getLoad(PtrVt, dl, DAG.getEntryNode(), CPAddr,
|
||||
MachinePointerInfo::getConstantPool(), false, false,
|
||||
false, 0);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, dl, MVT::i32);
|
||||
Callee = DAG.getNode(ARMISD::PIC_ADD, dl,
|
||||
getPointerTy(), Callee, PICLabel);
|
||||
Callee = DAG.getNode(ARMISD::PIC_ADD, dl, PtrVt, Callee, PICLabel);
|
||||
} else {
|
||||
unsigned OpFlags = 0;
|
||||
// On ELF targets for PIC code, direct calls should go through the PLT
|
||||
if (Subtarget->isTargetELF() &&
|
||||
getTargetMachine().getRelocationModel() == Reloc::PIC_)
|
||||
OpFlags = ARMII::MO_PLT;
|
||||
Callee = DAG.getTargetExternalSymbol(Sym, getPointerTy(), OpFlags);
|
||||
Callee = DAG.getTargetExternalSymbol(Sym, PtrVt, OpFlags);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2428,7 +2431,7 @@ SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op,
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = 0;
|
||||
SDLoc DL(Op);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
Reloc::Model RelocM = getTargetMachine().getRelocationModel();
|
||||
SDValue CPAddr;
|
||||
@ -2457,7 +2460,7 @@ SDValue
|
||||
ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc dl(GA);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
@ -2503,7 +2506,7 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
|
||||
SDLoc dl(GA);
|
||||
SDValue Offset;
|
||||
SDValue Chain = DAG.getEntryNode();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
// Get the Thread Pointer
|
||||
SDValue ThreadPointer = DAG.getNode(ARMISD::THREAD_POINTER, dl, PtrVT);
|
||||
|
||||
@ -2569,7 +2572,7 @@ ARMTargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc dl(Op);
|
||||
const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
if (getTargetMachine().getRelocationModel() == Reloc::PIC_) {
|
||||
@ -2612,7 +2615,7 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
|
||||
|
||||
SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc dl(Op);
|
||||
const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
Reloc::Model RelocM = getTargetMachine().getRelocationModel();
|
||||
@ -2643,7 +2646,7 @@ SDValue ARMTargetLowering::LowerGlobalAddressWindows(SDValue Op,
|
||||
const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
const ARMII::TOF TargetFlags =
|
||||
(GV->hasDLLImportStorageClass() ? ARMII::MO_DLLIMPORT : ARMII::MO_NO_FLAG);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result;
|
||||
SDLoc DL(Op);
|
||||
|
||||
@ -2667,7 +2670,7 @@ SDValue ARMTargetLowering::LowerGLOBAL_OFFSET_TABLE(SDValue Op,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDLoc dl(Op);
|
||||
unsigned PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
ARMConstantPoolValue *CPV =
|
||||
@ -2711,14 +2714,14 @@ ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG,
|
||||
return DAG.getNode(ARMISD::RBIT, dl, MVT::i32, Op.getOperand(1));
|
||||
}
|
||||
case Intrinsic::arm_thread_pointer: {
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
return DAG.getNode(ARMISD::THREAD_POINTER, dl, PtrVT);
|
||||
}
|
||||
case Intrinsic::eh_sjlj_lsda: {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
Reloc::Model RelocM = getTargetMachine().getRelocationModel();
|
||||
SDValue CPAddr;
|
||||
unsigned PCAdj = (RelocM != Reloc::PIC_)
|
||||
@ -2815,7 +2818,7 @@ static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
SDLoc dl(Op);
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1),
|
||||
@ -2845,7 +2848,7 @@ ARMTargetLowering::GetF64FormalArgument(CCValAssign &VA, CCValAssign &NextVA,
|
||||
int FI = MFI->CreateFixedObject(4, NextVA.getLocMemOffset(), true);
|
||||
|
||||
// Create load node to retrieve arguments from the stack.
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
ArgValue2 = DAG.getLoad(MVT::i32, dl, Root, FIN,
|
||||
MachinePointerInfo::getFixedStack(FI),
|
||||
false, false, false, 0);
|
||||
@ -2899,8 +2902,9 @@ ARMTargetLowering::StoreByValRegs(CCState &CCInfo, SelectionDAG &DAG,
|
||||
if (REnd != RBegin)
|
||||
ArgOffset = -4 * (ARM::R4 - RBegin);
|
||||
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
int FrameIndex = MFI->CreateFixedObject(ArgSize, ArgOffset, false);
|
||||
SDValue FIN = DAG.getFrameIndex(FrameIndex, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FrameIndex, PtrVT);
|
||||
|
||||
SmallVector<SDValue, 4> MemOps;
|
||||
const TargetRegisterClass *RC =
|
||||
@ -2913,8 +2917,7 @@ ARMTargetLowering::StoreByValRegs(CCState &CCInfo, SelectionDAG &DAG,
|
||||
DAG.getStore(Val.getValue(1), dl, Val, FIN,
|
||||
MachinePointerInfo(OrigArg, 4 * i), false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), FIN,
|
||||
DAG.getConstant(4, dl, getPointerTy()));
|
||||
FIN = DAG.getNode(ISD::ADD, dl, PtrVT, FIN, DAG.getConstant(4, dl, PtrVT));
|
||||
}
|
||||
|
||||
if (!MemOps.empty())
|
||||
@ -3008,6 +3011,7 @@ ARMTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
|
||||
unsigned TotalArgRegsSaveSize = 4 * (ARM::R4 - ArgRegBegin);
|
||||
AFI->setArgRegsSaveSize(TotalArgRegsSaveSize);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
|
||||
CCValAssign &VA = ArgLocs[i];
|
||||
@ -3030,7 +3034,7 @@ ARMTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
SDValue ArgValue2;
|
||||
if (VA.isMemLoc()) {
|
||||
int FI = MFI->CreateFixedObject(8, VA.getLocMemOffset(), true);
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
|
||||
ArgValue2 = DAG.getLoad(MVT::f64, dl, Chain, FIN,
|
||||
MachinePointerInfo::getFixedStack(FI),
|
||||
false, false, false, 0);
|
||||
@ -3117,7 +3121,7 @@ ARMTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
int FrameIndex = StoreByValRegs(CCInfo, DAG, dl, Chain, CurOrigArg,
|
||||
CurByValIndex, VA.getLocMemOffset(),
|
||||
Flags.getByValSize());
|
||||
InVals.push_back(DAG.getFrameIndex(FrameIndex, getPointerTy()));
|
||||
InVals.push_back(DAG.getFrameIndex(FrameIndex, PtrVT));
|
||||
CCInfo.nextInRegsParam();
|
||||
} else {
|
||||
unsigned FIOffset = VA.getLocMemOffset();
|
||||
@ -3125,7 +3129,7 @@ ARMTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
FIOffset, true);
|
||||
|
||||
// Create load nodes to retrieve arguments from the stack.
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
|
||||
InVals.push_back(DAG.getLoad(VA.getValVT(), dl, Chain, FIN,
|
||||
MachinePointerInfo::getFixedStack(FI),
|
||||
false, false, false, 0));
|
||||
@ -3850,7 +3854,7 @@ SDValue ARMTargetLowering::LowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Index = Op.getOperand(2);
|
||||
SDLoc dl(Op);
|
||||
|
||||
EVT PTy = getPointerTy();
|
||||
EVT PTy = getPointerTy(DAG.getDataLayout());
|
||||
JumpTableSDNode *JT = cast<JumpTableSDNode>(Table);
|
||||
SDValue JTI = DAG.getTargetJumpTable(JT->getIndex(), PTy);
|
||||
Table = DAG.getNode(ARMISD::WrapperJT, dl, MVT::i32, JTI);
|
||||
@ -6337,18 +6341,19 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Arg = Op.getOperand(0);
|
||||
EVT ArgVT = Arg.getValueType();
|
||||
Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
|
||||
// Pair of floats / doubles used to pass the result.
|
||||
StructType *RetTy = StructType::get(ArgTy, ArgTy, nullptr);
|
||||
|
||||
// Create stack object for sret.
|
||||
const uint64_t ByteSize = TLI.getDataLayout()->getTypeAllocSize(RetTy);
|
||||
const unsigned StackAlign = TLI.getDataLayout()->getPrefTypeAlignment(RetTy);
|
||||
auto &DL = DAG.getDataLayout();
|
||||
const uint64_t ByteSize = DL.getTypeAllocSize(RetTy);
|
||||
const unsigned StackAlign = DL.getPrefTypeAlignment(RetTy);
|
||||
int FrameIdx = FrameInfo->CreateStackObject(ByteSize, StackAlign, false);
|
||||
SDValue SRet = DAG.getFrameIndex(FrameIdx, TLI.getPointerTy());
|
||||
SDValue SRet = DAG.getFrameIndex(FrameIdx, getPointerTy(DL));
|
||||
|
||||
ArgListTy Args;
|
||||
ArgListEntry Entry;
|
||||
@ -6368,7 +6373,7 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
const char *LibcallName = (ArgVT == MVT::f64)
|
||||
? "__sincos_stret" : "__sincosf_stret";
|
||||
SDValue Callee = DAG.getExternalSymbol(LibcallName, getPointerTy());
|
||||
SDValue Callee = DAG.getExternalSymbol(LibcallName, getPointerTy(DL));
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())
|
||||
@ -6382,7 +6387,7 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
|
||||
// Address of cos field.
|
||||
SDValue Add = DAG.getNode(ISD::ADD, dl, getPointerTy(), SRet,
|
||||
SDValue Add = DAG.getNode(ISD::ADD, dl, PtrVT, SRet,
|
||||
DAG.getIntPtrConstant(ArgVT.getStoreSize(), dl));
|
||||
SDValue LoadCos = DAG.getLoad(ArgVT, dl, LoadSin.getValue(1), Add,
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
@ -7996,7 +8001,7 @@ static SDValue AddCombineToVPADDL(SDNode *N, SDValue N0, SDValue N1,
|
||||
// Build operand list.
|
||||
SmallVector<SDValue, 8> Ops;
|
||||
Ops.push_back(DAG.getConstant(Intrinsic::arm_neon_vpaddls, dl,
|
||||
TLI.getPointerTy()));
|
||||
TLI.getPointerTy(DAG.getDataLayout())));
|
||||
|
||||
// Input is the vector.
|
||||
Ops.push_back(Vec);
|
||||
@ -9336,8 +9341,8 @@ static SDValue PerformSTORECombine(SDNode *N,
|
||||
assert(StoreVecVT.getSizeInBits() == VT.getSizeInBits());
|
||||
SDValue ShuffWide = DAG.getNode(ISD::BITCAST, DL, StoreVecVT, Shuff);
|
||||
SmallVector<SDValue, 8> Chains;
|
||||
SDValue Increment = DAG.getConstant(StoreType.getSizeInBits()/8, DL,
|
||||
TLI.getPointerTy());
|
||||
SDValue Increment = DAG.getConstant(StoreType.getSizeInBits() / 8, DL,
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
SDValue BasePtr = St->getBasePtr();
|
||||
|
||||
// Perform one or more big stores into memory.
|
||||
@ -10317,7 +10322,7 @@ bool ARMTargetLowering::isLegalT2ScaledAddressingMode(const AddrMode &AM,
|
||||
bool ARMTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
||||
Type *Ty,
|
||||
unsigned AS) const {
|
||||
EVT VT = getValueType(Ty, true);
|
||||
EVT VT = getValueType(*getDataLayout(), Ty, true);
|
||||
if (!isLegalAddressImmediate(AM.BaseOffs, VT, Subtarget))
|
||||
return false;
|
||||
|
||||
@ -10969,7 +10974,7 @@ SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
|
||||
}
|
||||
|
||||
SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
|
||||
getPointerTy());
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = (Type*)StructType::get(Ty, Ty, nullptr);
|
||||
|
||||
|
@ -249,7 +249,8 @@ namespace llvm {
|
||||
}
|
||||
|
||||
/// getSetCCResultType - Return the value type to use for ISD::SETCC.
|
||||
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const override;
|
||||
|
||||
MachineBasicBlock *
|
||||
EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
|
@ -121,12 +121,14 @@ EmitSpecializedLibcall(SelectionDAG &DAG, SDLoc dl,
|
||||
{ "__aeabi_memclr", "__aeabi_memclr4", "__aeabi_memclr8" }
|
||||
};
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(LC),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant],
|
||||
TLI->getPointerTy()), std::move(Args), 0)
|
||||
.setDiscardResult();
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(
|
||||
TLI->getLibcallCallingConv(LC), Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant],
|
||||
TLI->getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args), 0)
|
||||
.setDiscardResult();
|
||||
std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
|
||||
|
||||
return CallResult.second;
|
||||
|
@ -61,14 +61,14 @@ unsigned ARMTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) {
|
||||
|
||||
if (Src->isVectorTy() && ST->hasNEON() && (ISD == ISD::FP_ROUND ||
|
||||
ISD == ISD::FP_EXTEND)) {
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Src);
|
||||
int Idx = CostTableLookup(NEONFltDblTbl, ISD, LT.second);
|
||||
if (Idx != -1)
|
||||
return LT.first * NEONFltDblTbl[Idx].Cost;
|
||||
}
|
||||
|
||||
EVT SrcTy = TLI->getValueType(Src);
|
||||
EVT DstTy = TLI->getValueType(Dst);
|
||||
EVT SrcTy = TLI->getValueType(DL, Src);
|
||||
EVT DstTy = TLI->getValueType(DL, Dst);
|
||||
|
||||
if (!SrcTy.isSimple() || !DstTy.isSimple())
|
||||
return BaseT::getCastInstrCost(Opcode, Dst, Src);
|
||||
@ -282,8 +282,8 @@ unsigned ARMTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
{ ISD::SELECT, MVT::v16i1, MVT::v16i64, 100 }
|
||||
};
|
||||
|
||||
EVT SelCondTy = TLI->getValueType(CondTy);
|
||||
EVT SelValTy = TLI->getValueType(ValTy);
|
||||
EVT SelCondTy = TLI->getValueType(DL, CondTy);
|
||||
EVT SelValTy = TLI->getValueType(DL, ValTy);
|
||||
if (SelCondTy.isSimple() && SelValTy.isSimple()) {
|
||||
int Idx = ConvertCostTableLookup(NEONVectorSelectTbl, ISD,
|
||||
SelCondTy.getSimpleVT(),
|
||||
@ -292,7 +292,7 @@ unsigned ARMTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
return NEONVectorSelectTbl[Idx].Cost;
|
||||
}
|
||||
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(ValTy);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, ValTy);
|
||||
return LT.first;
|
||||
}
|
||||
|
||||
@ -353,7 +353,7 @@ unsigned ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
|
||||
{ISD::VECTOR_SHUFFLE, MVT::v8i16, 2},
|
||||
{ISD::VECTOR_SHUFFLE, MVT::v16i8, 2}};
|
||||
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Tp);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
|
||||
|
||||
int Idx = CostTableLookup(NEONShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second);
|
||||
if (Idx == -1)
|
||||
@ -379,7 +379,7 @@ unsigned ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
|
||||
|
||||
{ISD::VECTOR_SHUFFLE, MVT::v16i8, 32}};
|
||||
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Tp);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
|
||||
int Idx =
|
||||
CostTableLookup(NEONAltShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second);
|
||||
if (Idx == -1)
|
||||
@ -395,7 +395,7 @@ unsigned ARMTTIImpl::getArithmeticInstrCost(
|
||||
TTI::OperandValueProperties Opd2PropInfo) {
|
||||
|
||||
int ISDOpcode = TLI->InstructionOpcodeToISD(Opcode);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Ty);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
|
||||
|
||||
const unsigned FunctionCallDivCost = 20;
|
||||
const unsigned ReciprocalDivCost = 10;
|
||||
@ -468,7 +468,7 @@ unsigned ARMTTIImpl::getArithmeticInstrCost(
|
||||
unsigned ARMTTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src,
|
||||
unsigned Alignment,
|
||||
unsigned AddressSpace) {
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Src);
|
||||
|
||||
if (Src->isVectorTy() && Alignment != 16 &&
|
||||
Src->getVectorElementType()->isDoubleTy()) {
|
||||
|
@ -302,8 +302,9 @@ SDValue BPFTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
DAG.getContext()->diagnose(Err);
|
||||
}
|
||||
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
Chain = DAG.getCALLSEQ_START(
|
||||
Chain, DAG.getConstant(NumBytes, CLI.DL, getPointerTy(), true), CLI.DL);
|
||||
Chain, DAG.getConstant(NumBytes, CLI.DL, PtrVT, true), CLI.DL);
|
||||
|
||||
SmallVector<std::pair<unsigned, SDValue>, 5> RegsToPass;
|
||||
|
||||
@ -350,10 +351,10 @@ SDValue BPFTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
// turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
|
||||
// Likewise ExternalSymbol -> TargetExternalSymbol.
|
||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), CLI.DL, getPointerTy(),
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), CLI.DL, PtrVT,
|
||||
G->getOffset(), 0);
|
||||
else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee))
|
||||
Callee = DAG.getTargetExternalSymbol(E->getSymbol(), getPointerTy(), 0);
|
||||
Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT, 0);
|
||||
|
||||
// Returns a chain & a flag for retval copy to use.
|
||||
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
|
||||
@ -374,8 +375,8 @@ SDValue BPFTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
|
||||
// Create the CALLSEQ_END node.
|
||||
Chain = DAG.getCALLSEQ_END(
|
||||
Chain, DAG.getConstant(NumBytes, CLI.DL, getPointerTy(), true),
|
||||
DAG.getConstant(0, CLI.DL, getPointerTy(), true), InFlag, CLI.DL);
|
||||
Chain, DAG.getConstant(NumBytes, CLI.DL, PtrVT, true),
|
||||
DAG.getConstant(0, CLI.DL, PtrVT, true), InFlag, CLI.DL);
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Handle result values, copying them out of physregs into vregs that we
|
||||
|
@ -459,6 +459,7 @@ HexagonTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
|
||||
bool IsStructRet = (Outs.empty()) ? false : Outs[0].Flags.isSRet();
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
|
||||
// Check for varargs.
|
||||
int NumNamedVarArgParams = -1;
|
||||
@ -515,8 +516,8 @@ HexagonTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
SmallVector<SDValue, 8> MemOpChains;
|
||||
|
||||
auto &HRI = *Subtarget.getRegisterInfo();
|
||||
SDValue StackPtr = DAG.getCopyFromReg(Chain, dl, HRI.getStackRegister(),
|
||||
getPointerTy());
|
||||
SDValue StackPtr =
|
||||
DAG.getCopyFromReg(Chain, dl, HRI.getStackRegister(), PtrVT);
|
||||
|
||||
// Walk the register/memloc assignments, inserting copies/loads.
|
||||
for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
|
||||
@ -574,7 +575,7 @@ HexagonTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, MemOpChains);
|
||||
|
||||
if (!isTailCall) {
|
||||
SDValue C = DAG.getConstant(NumBytes, dl, getPointerTy(), true);
|
||||
SDValue C = DAG.getConstant(NumBytes, dl, PtrVT, true);
|
||||
Chain = DAG.getCALLSEQ_START(Chain, C, dl);
|
||||
}
|
||||
|
||||
@ -615,13 +616,13 @@ HexagonTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
if (flag_aligned_memcpy) {
|
||||
const char *MemcpyName =
|
||||
"__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes";
|
||||
Callee = DAG.getTargetExternalSymbol(MemcpyName, getPointerTy());
|
||||
Callee = DAG.getTargetExternalSymbol(MemcpyName, PtrVT);
|
||||
flag_aligned_memcpy = false;
|
||||
} else if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, getPointerTy());
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, PtrVT);
|
||||
} else if (ExternalSymbolSDNode *S =
|
||||
dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
|
||||
Callee = DAG.getTargetExternalSymbol(S->getSymbol(), PtrVT);
|
||||
}
|
||||
|
||||
// Returns a chain & a flag for retval copy to use.
|
||||
@ -811,8 +812,8 @@ LowerBR_JT(SDValue Op, SelectionDAG &DAG) const
|
||||
BlockAddress::get(const_cast<BasicBlock *>(MBB->getBasicBlock()));
|
||||
}
|
||||
|
||||
SDValue JumpTableBase = DAG.getNode(HexagonISD::JT, dl,
|
||||
getPointerTy(), TargetJT);
|
||||
SDValue JumpTableBase = DAG.getNode(
|
||||
HexagonISD::JT, dl, getPointerTy(DAG.getDataLayout()), TargetJT);
|
||||
SDValue ShiftIndex = DAG.getNode(ISD::SHL, dl, MVT::i32, Index,
|
||||
DAG.getConstant(2, dl, MVT::i32));
|
||||
SDValue JTAddress = DAG.getNode(ISD::ADD, dl, MVT::i32, JumpTableBase,
|
||||
@ -1231,16 +1232,17 @@ SDValue HexagonTargetLowering::LowerGLOBALADDRESS(SDValue Op,
|
||||
const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
int64_t Offset = cast<GlobalAddressSDNode>(Op)->getOffset();
|
||||
SDLoc dl(Op);
|
||||
Result = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(), Offset);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
Result = DAG.getTargetGlobalAddress(GV, dl, PtrVT, Offset);
|
||||
|
||||
const HexagonTargetObjectFile *TLOF =
|
||||
static_cast<const HexagonTargetObjectFile *>(
|
||||
getTargetMachine().getObjFileLowering());
|
||||
if (TLOF->IsGlobalInSmallSection(GV, getTargetMachine())) {
|
||||
return DAG.getNode(HexagonISD::CONST32_GP, dl, getPointerTy(), Result);
|
||||
return DAG.getNode(HexagonISD::CONST32_GP, dl, PtrVT, Result);
|
||||
}
|
||||
|
||||
return DAG.getNode(HexagonISD::CONST32, dl, getPointerTy(), Result);
|
||||
return DAG.getNode(HexagonISD::CONST32, dl, PtrVT, Result);
|
||||
}
|
||||
|
||||
// Specifies that for loads and stores VT can be promoted to PromotedLdStVT.
|
||||
@ -1261,7 +1263,8 @@ HexagonTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
SDValue BA_SD = DAG.getTargetBlockAddress(BA, MVT::i32);
|
||||
SDLoc dl(Op);
|
||||
return DAG.getNode(HexagonISD::CONST32_GP, dl, getPointerTy(), BA_SD);
|
||||
return DAG.getNode(HexagonISD::CONST32_GP, dl,
|
||||
getPointerTy(DAG.getDataLayout()), BA_SD);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -2254,6 +2257,7 @@ HexagonTargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Offset = Op.getOperand(1);
|
||||
SDValue Handler = Op.getOperand(2);
|
||||
SDLoc dl(Op);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Mark function as containing a call to EH_RETURN.
|
||||
HexagonMachineFunctionInfo *FuncInfo =
|
||||
@ -2262,9 +2266,9 @@ HexagonTargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
unsigned OffsetReg = Hexagon::R28;
|
||||
|
||||
SDValue StoreAddr = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
DAG.getRegister(Hexagon::R30, getPointerTy()),
|
||||
DAG.getIntPtrConstant(4, dl));
|
||||
SDValue StoreAddr =
|
||||
DAG.getNode(ISD::ADD, dl, PtrVT, DAG.getRegister(Hexagon::R30, PtrVT),
|
||||
DAG.getIntPtrConstant(4, dl));
|
||||
Chain = DAG.getStore(Chain, dl, Handler, StoreAddr, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
Chain = DAG.getCopyToReg(Chain, dl, OffsetReg, Offset);
|
||||
|
@ -165,7 +165,8 @@ bool isPositiveHalfWord(SDNode *N);
|
||||
|
||||
SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
|
||||
EVT getSetCCResultType(LLVMContext &C, EVT VT) const override {
|
||||
EVT getSetCCResultType(const DataLayout &, LLVMContext &C,
|
||||
EVT VT) const override {
|
||||
if (!VT.isVector())
|
||||
return MVT::i1;
|
||||
else
|
||||
|
@ -254,10 +254,11 @@ bool MSP430DAGToDAGISel::SelectAddr(SDValue N,
|
||||
AM.Base.Reg = CurDAG->getRegister(0, VT);
|
||||
}
|
||||
|
||||
Base = (AM.BaseType == MSP430ISelAddressMode::FrameIndexBase) ?
|
||||
CurDAG->getTargetFrameIndex(AM.Base.FrameIndex,
|
||||
getTargetLowering()->getPointerTy()) :
|
||||
AM.Base.Reg;
|
||||
Base = (AM.BaseType == MSP430ISelAddressMode::FrameIndexBase)
|
||||
? CurDAG->getTargetFrameIndex(
|
||||
AM.Base.FrameIndex,
|
||||
getTargetLowering()->getPointerTy(CurDAG->getDataLayout()))
|
||||
: AM.Base.Reg;
|
||||
|
||||
if (AM.GV)
|
||||
Disp = CurDAG->getTargetGlobalAddress(AM.GV, SDLoc(N),
|
||||
|
@ -493,7 +493,7 @@ MSP430TargetLowering::LowerCCCArguments(SDValue Chain,
|
||||
if (Flags.isByVal()) {
|
||||
int FI = MFI->CreateFixedObject(Flags.getByValSize(),
|
||||
VA.getLocMemOffset(), true);
|
||||
InVal = DAG.getFrameIndex(FI, getPointerTy());
|
||||
InVal = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
} else {
|
||||
// Load the argument to a virtual register
|
||||
unsigned ObjSize = VA.getLocVT().getSizeInBits()/8;
|
||||
@ -591,10 +591,10 @@ MSP430TargetLowering::LowerCCCCallTo(SDValue Chain, SDValue Callee,
|
||||
|
||||
// Get a count of how many bytes are to be pushed on the stack.
|
||||
unsigned NumBytes = CCInfo.getNextStackOffset();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getConstant(NumBytes, dl,
|
||||
getPointerTy(), true),
|
||||
dl);
|
||||
Chain = DAG.getCALLSEQ_START(Chain,
|
||||
DAG.getConstant(NumBytes, dl, PtrVT, true), dl);
|
||||
|
||||
SmallVector<std::pair<unsigned, SDValue>, 4> RegsToPass;
|
||||
SmallVector<SDValue, 12> MemOpChains;
|
||||
@ -629,12 +629,11 @@ MSP430TargetLowering::LowerCCCCallTo(SDValue Chain, SDValue Callee,
|
||||
assert(VA.isMemLoc());
|
||||
|
||||
if (!StackPtr.getNode())
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl, MSP430::SP, getPointerTy());
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl, MSP430::SP, PtrVT);
|
||||
|
||||
SDValue PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
StackPtr,
|
||||
DAG.getIntPtrConstant(VA.getLocMemOffset(),
|
||||
dl));
|
||||
SDValue PtrOff =
|
||||
DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr,
|
||||
DAG.getIntPtrConstant(VA.getLocMemOffset(), dl));
|
||||
|
||||
SDValue MemOp;
|
||||
ISD::ArgFlagsTy Flags = Outs[i].Flags;
|
||||
@ -699,11 +698,8 @@ MSP430TargetLowering::LowerCCCCallTo(SDValue Chain, SDValue Callee,
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Create the CALLSEQ_END node.
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumBytes, dl, getPointerTy(),
|
||||
true),
|
||||
DAG.getConstant(0, dl, getPointerTy(), true),
|
||||
InFlag, dl);
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getConstant(NumBytes, dl, PtrVT, true),
|
||||
DAG.getConstant(0, dl, PtrVT, true), InFlag, dl);
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Handle result values, copying them out of physregs into vregs that we
|
||||
@ -787,30 +783,31 @@ SDValue MSP430TargetLowering::LowerGlobalAddress(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
int64_t Offset = cast<GlobalAddressSDNode>(Op)->getOffset();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Create the TargetGlobalAddress node, folding in the constant offset.
|
||||
SDValue Result = DAG.getTargetGlobalAddress(GV, SDLoc(Op),
|
||||
getPointerTy(), Offset);
|
||||
return DAG.getNode(MSP430ISD::Wrapper, SDLoc(Op),
|
||||
getPointerTy(), Result);
|
||||
SDValue Result = DAG.getTargetGlobalAddress(GV, SDLoc(Op), PtrVT, Offset);
|
||||
return DAG.getNode(MSP430ISD::Wrapper, SDLoc(Op), PtrVT, Result);
|
||||
}
|
||||
|
||||
SDValue MSP430TargetLowering::LowerExternalSymbol(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc dl(Op);
|
||||
const char *Sym = cast<ExternalSymbolSDNode>(Op)->getSymbol();
|
||||
SDValue Result = DAG.getTargetExternalSymbol(Sym, getPointerTy());
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result = DAG.getTargetExternalSymbol(Sym, PtrVT);
|
||||
|
||||
return DAG.getNode(MSP430ISD::Wrapper, dl, getPointerTy(), Result);
|
||||
return DAG.getNode(MSP430ISD::Wrapper, dl, PtrVT, Result);
|
||||
}
|
||||
|
||||
SDValue MSP430TargetLowering::LowerBlockAddress(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc dl(Op);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
SDValue Result = DAG.getTargetBlockAddress(BA, getPointerTy());
|
||||
SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT);
|
||||
|
||||
return DAG.getNode(MSP430ISD::Wrapper, dl, getPointerTy(), Result);
|
||||
return DAG.getNode(MSP430ISD::Wrapper, dl, PtrVT, Result);
|
||||
}
|
||||
|
||||
static SDValue EmitCMP(SDValue &LHS, SDValue &RHS, SDValue &TargetCC,
|
||||
@ -1023,16 +1020,17 @@ MSP430TargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) const {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MSP430MachineFunctionInfo *FuncInfo = MF.getInfo<MSP430MachineFunctionInfo>();
|
||||
int ReturnAddrIndex = FuncInfo->getRAIndex();
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
|
||||
if (ReturnAddrIndex == 0) {
|
||||
// Set up a frame object for the return address.
|
||||
uint64_t SlotSize = getDataLayout()->getPointerSize();
|
||||
uint64_t SlotSize = MF.getDataLayout().getPointerSize();
|
||||
ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(SlotSize, -SlotSize,
|
||||
true);
|
||||
FuncInfo->setRAIndex(ReturnAddrIndex);
|
||||
}
|
||||
|
||||
return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy());
|
||||
return DAG.getFrameIndex(ReturnAddrIndex, PtrVT);
|
||||
}
|
||||
|
||||
SDValue MSP430TargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
@ -1045,21 +1043,21 @@ SDValue MSP430TargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
SDLoc dl(Op);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (Depth > 0) {
|
||||
SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
|
||||
SDValue Offset =
|
||||
DAG.getConstant(getDataLayout()->getPointerSize(), dl, MVT::i16);
|
||||
return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
|
||||
DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
FrameAddr, Offset),
|
||||
DAG.getConstant(DAG.getDataLayout().getPointerSize(), dl, MVT::i16);
|
||||
return DAG.getLoad(PtrVT, dl, DAG.getEntryNode(),
|
||||
DAG.getNode(ISD::ADD, dl, PtrVT, FrameAddr, Offset),
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
}
|
||||
|
||||
// Just load the return address.
|
||||
SDValue RetAddrFI = getReturnAddressFrameIndex(DAG);
|
||||
return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
|
||||
RetAddrFI, MachinePointerInfo(), false, false, false, 0);
|
||||
return DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), RetAddrFI,
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
}
|
||||
|
||||
SDValue MSP430TargetLowering::LowerFRAMEADDR(SDValue Op,
|
||||
@ -1083,10 +1081,11 @@ SDValue MSP430TargetLowering::LowerVASTART(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MSP430MachineFunctionInfo *FuncInfo = MF.getInfo<MSP430MachineFunctionInfo>();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Frame index of first vararg argument
|
||||
SDValue FrameIndex = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
SDValue FrameIndex =
|
||||
DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
|
||||
// Create a store of the frame index to the location operand
|
||||
@ -1098,9 +1097,9 @@ SDValue MSP430TargetLowering::LowerVASTART(SDValue Op,
|
||||
SDValue MSP430TargetLowering::LowerJumpTable(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
|
||||
SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy());
|
||||
return DAG.getNode(MSP430ISD::Wrapper, SDLoc(JT),
|
||||
getPointerTy(), Result);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT);
|
||||
return DAG.getNode(MSP430ISD::Wrapper, SDLoc(JT), PtrVT, Result);
|
||||
}
|
||||
|
||||
/// getPostIndexedAddressParts - returns true by value, base pointer and
|
||||
|
@ -120,13 +120,13 @@ void Mips16DAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) {
|
||||
SDValue Mips16DAGToDAGISel::getMips16SPAliasReg() {
|
||||
unsigned Mips16SPAliasReg =
|
||||
MF->getInfo<MipsFunctionInfo>()->getMips16SPAliasReg();
|
||||
return CurDAG->getRegister(Mips16SPAliasReg,
|
||||
getTargetLowering()->getPointerTy());
|
||||
auto PtrVT = getTargetLowering()->getPointerTy(CurDAG->getDataLayout());
|
||||
return CurDAG->getRegister(Mips16SPAliasReg, PtrVT);
|
||||
}
|
||||
|
||||
void Mips16DAGToDAGISel::getMips16SPRefReg(SDNode *Parent, SDValue &AliasReg) {
|
||||
SDValue AliasFPReg = CurDAG->getRegister(Mips::S0,
|
||||
getTargetLowering()->getPointerTy());
|
||||
auto PtrVT = getTargetLowering()->getPointerTy(CurDAG->getDataLayout());
|
||||
SDValue AliasFPReg = CurDAG->getRegister(Mips::S0, PtrVT);
|
||||
if (Parent) {
|
||||
switch (Parent->getOpcode()) {
|
||||
case ISD::LOAD: {
|
||||
@ -155,7 +155,7 @@ void Mips16DAGToDAGISel::getMips16SPRefReg(SDNode *Parent, SDValue &AliasReg) {
|
||||
}
|
||||
}
|
||||
}
|
||||
AliasReg = CurDAG->getRegister(Mips::SP, getTargetLowering()->getPointerTy());
|
||||
AliasReg = CurDAG->getRegister(Mips::SP, PtrVT);
|
||||
return;
|
||||
|
||||
}
|
||||
|
@ -502,7 +502,8 @@ getOpndList(SmallVectorImpl<SDValue> &Ops,
|
||||
unsigned V0Reg = Mips::V0;
|
||||
if (NeedMips16Helper) {
|
||||
RegsToPass.push_front(std::make_pair(V0Reg, Callee));
|
||||
JumpTarget = DAG.getExternalSymbol(Mips16HelperFunction, getPointerTy());
|
||||
JumpTarget = DAG.getExternalSymbol(Mips16HelperFunction,
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
ExternalSymbolSDNode *S = cast<ExternalSymbolSDNode>(JumpTarget);
|
||||
JumpTarget = getAddrGlobal(S, CLI.DL, JumpTarget.getValueType(), DAG,
|
||||
MipsII::MO_GOT, Chain,
|
||||
|
@ -267,7 +267,7 @@ unsigned MipsFastISel::emitLogicalOp(unsigned ISDOpc, MVT RetVT,
|
||||
}
|
||||
|
||||
unsigned MipsFastISel::fastMaterializeAlloca(const AllocaInst *AI) {
|
||||
assert(TLI.getValueType(AI->getType(), true) == MVT::i32 &&
|
||||
assert(TLI.getValueType(DL, AI->getType(), true) == MVT::i32 &&
|
||||
"Alloca should always return a pointer.");
|
||||
|
||||
DenseMap<const AllocaInst *, int>::iterator SI =
|
||||
@ -382,7 +382,7 @@ unsigned MipsFastISel::materializeExternalCallSym(MCSymbol *Sym) {
|
||||
// Materialize a constant into a register, and return the register
|
||||
// number (or zero if we failed to handle it).
|
||||
unsigned MipsFastISel::fastMaterializeConstant(const Constant *C) {
|
||||
EVT CEVT = TLI.getValueType(C->getType(), true);
|
||||
EVT CEVT = TLI.getValueType(DL, C->getType(), true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (!CEVT.isSimple())
|
||||
@ -507,12 +507,13 @@ bool MipsFastISel::computeCallAddress(const Value *V, Address &Addr) {
|
||||
break;
|
||||
case Instruction::IntToPtr:
|
||||
// Look past no-op inttoptrs if its operand is in the same BB.
|
||||
if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(DL))
|
||||
return computeCallAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
case Instruction::PtrToInt:
|
||||
// Look past no-op ptrtoints if its operand is in the same BB.
|
||||
if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
|
||||
return computeCallAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
}
|
||||
@ -532,7 +533,7 @@ bool MipsFastISel::computeCallAddress(const Value *V, Address &Addr) {
|
||||
}
|
||||
|
||||
bool MipsFastISel::isTypeLegal(Type *Ty, MVT &VT) {
|
||||
EVT evt = TLI.getValueType(Ty, true);
|
||||
EVT evt = TLI.getValueType(DL, Ty, true);
|
||||
// Only handle simple types.
|
||||
if (evt == MVT::Other || !evt.isSimple())
|
||||
return false;
|
||||
@ -931,8 +932,8 @@ bool MipsFastISel::selectFPExt(const Instruction *I) {
|
||||
if (UnsupportedFPMode)
|
||||
return false;
|
||||
Value *Src = I->getOperand(0);
|
||||
EVT SrcVT = TLI.getValueType(Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT SrcVT = TLI.getValueType(DL, Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
if (SrcVT != MVT::f32 || DestVT != MVT::f64)
|
||||
return false;
|
||||
@ -998,8 +999,8 @@ bool MipsFastISel::selectFPTrunc(const Instruction *I) {
|
||||
if (UnsupportedFPMode)
|
||||
return false;
|
||||
Value *Src = I->getOperand(0);
|
||||
EVT SrcVT = TLI.getValueType(Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT SrcVT = TLI.getValueType(DL, Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
if (SrcVT != MVT::f64 || DestVT != MVT::f32)
|
||||
return false;
|
||||
@ -1450,7 +1451,7 @@ bool MipsFastISel::selectRet(const Instruction *I) {
|
||||
if (!MRI.getRegClass(SrcReg)->contains(DestReg))
|
||||
return false;
|
||||
|
||||
EVT RVEVT = TLI.getValueType(RV->getType());
|
||||
EVT RVEVT = TLI.getValueType(DL, RV->getType());
|
||||
if (!RVEVT.isSimple())
|
||||
return false;
|
||||
|
||||
@ -1494,8 +1495,8 @@ bool MipsFastISel::selectTrunc(const Instruction *I) {
|
||||
Value *Op = I->getOperand(0);
|
||||
|
||||
EVT SrcVT, DestVT;
|
||||
SrcVT = TLI.getValueType(Op->getType(), true);
|
||||
DestVT = TLI.getValueType(I->getType(), true);
|
||||
SrcVT = TLI.getValueType(DL, Op->getType(), true);
|
||||
DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
if (SrcVT != MVT::i32 && SrcVT != MVT::i16 && SrcVT != MVT::i8)
|
||||
return false;
|
||||
@ -1522,8 +1523,8 @@ bool MipsFastISel::selectIntExt(const Instruction *I) {
|
||||
return false;
|
||||
|
||||
EVT SrcEVT, DestEVT;
|
||||
SrcEVT = TLI.getValueType(SrcTy, true);
|
||||
DestEVT = TLI.getValueType(DestTy, true);
|
||||
SrcEVT = TLI.getValueType(DL, SrcTy, true);
|
||||
DestEVT = TLI.getValueType(DL, DestTy, true);
|
||||
if (!SrcEVT.isSimple())
|
||||
return false;
|
||||
if (!DestEVT.isSimple())
|
||||
@ -1621,7 +1622,7 @@ unsigned MipsFastISel::emitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
|
||||
}
|
||||
|
||||
bool MipsFastISel::selectDivRem(const Instruction *I, unsigned ISDOpcode) {
|
||||
EVT DestEVT = TLI.getValueType(I->getType(), true);
|
||||
EVT DestEVT = TLI.getValueType(DL, I->getType(), true);
|
||||
if (!DestEVT.isSimple())
|
||||
return false;
|
||||
|
||||
@ -1686,7 +1687,7 @@ bool MipsFastISel::selectShift(const Instruction *I) {
|
||||
if (!TempReg)
|
||||
return false;
|
||||
|
||||
MVT Op0MVT = TLI.getValueType(Op0->getType(), true).getSimpleVT();
|
||||
MVT Op0MVT = TLI.getValueType(DL, Op0->getType(), true).getSimpleVT();
|
||||
bool IsZExt = Opcode == Instruction::LShr;
|
||||
if (!emitIntExt(Op0MVT, Op0Reg, MVT::i32, TempReg, IsZExt))
|
||||
return false;
|
||||
@ -1804,7 +1805,7 @@ unsigned MipsFastISel::getRegEnsuringSimpleIntegerWidening(const Value *V,
|
||||
unsigned VReg = getRegForValue(V);
|
||||
if (VReg == 0)
|
||||
return 0;
|
||||
MVT VMVT = TLI.getValueType(V->getType(), true).getSimpleVT();
|
||||
MVT VMVT = TLI.getValueType(DL, V->getType(), true).getSimpleVT();
|
||||
if ((VMVT == MVT::i8) || (VMVT == MVT::i16)) {
|
||||
unsigned TempReg = createResultReg(&Mips::GPR32RegClass);
|
||||
if (!emitIntExt(VMVT, VReg, MVT::i32, TempReg, IsUnsigned))
|
||||
|
@ -59,8 +59,9 @@ bool MipsDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||
/// GOT address into a register.
|
||||
SDNode *MipsDAGToDAGISel::getGlobalBaseReg() {
|
||||
unsigned GlobalBaseReg = MF->getInfo<MipsFunctionInfo>()->getGlobalBaseReg();
|
||||
return CurDAG->getRegister(GlobalBaseReg,
|
||||
getTargetLowering()->getPointerTy()).getNode();
|
||||
return CurDAG->getRegister(GlobalBaseReg, getTargetLowering()->getPointerTy(
|
||||
CurDAG->getDataLayout()))
|
||||
.getNode();
|
||||
}
|
||||
|
||||
/// ComplexPattern used on MipsInstrInfo
|
||||
|
@ -466,7 +466,8 @@ MipsTargetLowering::createFastISel(FunctionLoweringInfo &funcInfo,
|
||||
return Mips::createFastISel(funcInfo, libInfo);
|
||||
}
|
||||
|
||||
EVT MipsTargetLowering::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
EVT MipsTargetLowering::getSetCCResultType(const DataLayout &, LLVMContext &,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return MVT::i32;
|
||||
return VT.changeVectorElementTypeToInteger();
|
||||
@ -1579,7 +1580,8 @@ SDValue MipsTargetLowering::lowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Table = Op.getOperand(1);
|
||||
SDValue Index = Op.getOperand(2);
|
||||
SDLoc DL(Op);
|
||||
EVT PTy = getPointerTy();
|
||||
auto &TD = DAG.getDataLayout();
|
||||
EVT PTy = getPointerTy(TD);
|
||||
unsigned EntrySize =
|
||||
DAG.getMachineFunction().getJumpTableInfo()->getEntrySize(*getDataLayout());
|
||||
|
||||
@ -1647,10 +1649,10 @@ lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const
|
||||
{
|
||||
SDLoc DL(Op);
|
||||
EVT Ty = Op.getOperand(0).getValueType();
|
||||
SDValue Cond = DAG.getNode(ISD::SETCC, DL,
|
||||
getSetCCResultType(*DAG.getContext(), Ty),
|
||||
Op.getOperand(0), Op.getOperand(1),
|
||||
Op.getOperand(4));
|
||||
SDValue Cond =
|
||||
DAG.getNode(ISD::SETCC, DL, getSetCCResultType(DAG.getDataLayout(),
|
||||
*DAG.getContext(), Ty),
|
||||
Op.getOperand(0), Op.getOperand(1), Op.getOperand(4));
|
||||
|
||||
return DAG.getNode(ISD::SELECT, DL, Op.getValueType(), Cond, Op.getOperand(2),
|
||||
Op.getOperand(3));
|
||||
@ -1723,7 +1725,7 @@ lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
|
||||
GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
|
||||
SDLoc DL(GA);
|
||||
const GlobalValue *GV = GA->getGlobal();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
TLSModel::Model model = getTargetMachine().getTLSModel(GV);
|
||||
|
||||
@ -1831,7 +1833,7 @@ SDValue MipsTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
SDLoc DL(Op);
|
||||
SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
getPointerTy(MF.getDataLayout()));
|
||||
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
@ -1850,9 +1852,9 @@ SDValue MipsTargetLowering::lowerVAARG(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDLoc DL(Node);
|
||||
unsigned ArgSlotSizeInBytes = (ABI.IsN32() || ABI.IsN64()) ? 8 : 4;
|
||||
|
||||
SDValue VAListLoad = DAG.getLoad(getPointerTy(), DL, Chain, VAListPtr,
|
||||
MachinePointerInfo(SV), false, false, false,
|
||||
0);
|
||||
SDValue VAListLoad =
|
||||
DAG.getLoad(getPointerTy(DAG.getDataLayout()), DL, Chain, VAListPtr,
|
||||
MachinePointerInfo(SV), false, false, false, 0);
|
||||
SDValue VAList = VAListLoad;
|
||||
|
||||
// Re-align the pointer if necessary.
|
||||
@ -2062,7 +2064,7 @@ SDValue MipsTargetLowering::lowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
|
||||
Chain = DAG.getCopyToReg(Chain, DL, AddrReg, Handler, Chain.getValue(1));
|
||||
return DAG.getNode(MipsISD::EH_RETURN, DL, MVT::Other, Chain,
|
||||
DAG.getRegister(OffsetReg, Ty),
|
||||
DAG.getRegister(AddrReg, getPointerTy()),
|
||||
DAG.getRegister(AddrReg, getPointerTy(MF.getDataLayout())),
|
||||
Chain.getValue(1));
|
||||
}
|
||||
|
||||
@ -2479,15 +2481,16 @@ MipsTargetLowering::passArgOnStack(SDValue StackPtr, unsigned Offset,
|
||||
SDValue Chain, SDValue Arg, SDLoc DL,
|
||||
bool IsTailCall, SelectionDAG &DAG) const {
|
||||
if (!IsTailCall) {
|
||||
SDValue PtrOff = DAG.getNode(ISD::ADD, DL, getPointerTy(), StackPtr,
|
||||
DAG.getIntPtrConstant(Offset, DL));
|
||||
SDValue PtrOff =
|
||||
DAG.getNode(ISD::ADD, DL, getPointerTy(DAG.getDataLayout()), StackPtr,
|
||||
DAG.getIntPtrConstant(Offset, DL));
|
||||
return DAG.getStore(Chain, DL, Arg, PtrOff, MachinePointerInfo(), false,
|
||||
false, 0);
|
||||
}
|
||||
|
||||
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
int FI = MFI->CreateFixedObject(Arg.getValueSizeInBits() / 8, Offset, false);
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
return DAG.getStore(Chain, DL, Arg, FIN, MachinePointerInfo(),
|
||||
/*isVolatile=*/ true, false, 0);
|
||||
}
|
||||
@ -2611,8 +2614,9 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
if (!IsTailCall)
|
||||
Chain = DAG.getCALLSEQ_START(Chain, NextStackOffsetVal, DL);
|
||||
|
||||
SDValue StackPtr = DAG.getCopyFromReg(
|
||||
Chain, DL, ABI.IsN64() ? Mips::SP_64 : Mips::SP, getPointerTy());
|
||||
SDValue StackPtr =
|
||||
DAG.getCopyFromReg(Chain, DL, ABI.IsN64() ? Mips::SP_64 : Mips::SP,
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
// With EABI is it possible to have 16 args on registers.
|
||||
std::deque< std::pair<unsigned, SDValue> > RegsToPass;
|
||||
@ -2750,7 +2754,8 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
IsCallReloc = true;
|
||||
}
|
||||
} else
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, getPointerTy(), 0,
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL,
|
||||
getPointerTy(DAG.getDataLayout()), 0,
|
||||
MipsII::MO_NO_FLAG);
|
||||
GlobalOrExternal = true;
|
||||
}
|
||||
@ -2758,8 +2763,8 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
const char *Sym = S->getSymbol();
|
||||
|
||||
if (!ABI.IsN64() && !IsPIC) // !N64 && static
|
||||
Callee =
|
||||
DAG.getTargetExternalSymbol(Sym, getPointerTy(), MipsII::MO_NO_FLAG);
|
||||
Callee = DAG.getTargetExternalSymbol(
|
||||
Sym, getPointerTy(DAG.getDataLayout()), MipsII::MO_NO_FLAG);
|
||||
else if (LargeGOT) {
|
||||
Callee = getAddrGlobalLargeGOT(S, DL, Ty, DAG, MipsII::MO_CALL_HI16,
|
||||
MipsII::MO_CALL_LO16, Chain,
|
||||
@ -3029,7 +3034,7 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
VA.getLocMemOffset(), true);
|
||||
|
||||
// Create load nodes to retrieve arguments from the stack
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
SDValue ArgValue = DAG.getLoad(LocVT, DL, Chain, FIN,
|
||||
MachinePointerInfo::getFixedStack(FI),
|
||||
false, false, false, 0);
|
||||
@ -3174,12 +3179,13 @@ MipsTargetLowering::LowerReturn(SDValue Chain,
|
||||
|
||||
if (!Reg)
|
||||
llvm_unreachable("sret virtual register not created in the entry block");
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, getPointerTy());
|
||||
SDValue Val =
|
||||
DAG.getCopyFromReg(Chain, DL, Reg, getPointerTy(DAG.getDataLayout()));
|
||||
unsigned V0 = ABI.IsN64() ? Mips::V0_64 : Mips::V0;
|
||||
|
||||
Chain = DAG.getCopyToReg(Chain, DL, V0, Val, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
RetOps.push_back(DAG.getRegister(V0, getPointerTy()));
|
||||
RetOps.push_back(DAG.getRegister(V0, getPointerTy(DAG.getDataLayout())));
|
||||
}
|
||||
|
||||
RetOps[0] = Chain; // Update chain.
|
||||
@ -3623,7 +3629,7 @@ void MipsTargetLowering::copyByValRegs(
|
||||
FrameObjOffset = VA.getLocMemOffset();
|
||||
|
||||
// Create frame object.
|
||||
EVT PtrTy = getPointerTy();
|
||||
EVT PtrTy = getPointerTy(DAG.getDataLayout());
|
||||
int FI = MFI->CreateFixedObject(FrameObjSize, FrameObjOffset, true);
|
||||
SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
|
||||
InVals.push_back(FIN);
|
||||
@ -3660,7 +3666,8 @@ void MipsTargetLowering::passByValArg(
|
||||
unsigned OffsetInBytes = 0; // From beginning of struct
|
||||
unsigned RegSizeInBytes = Subtarget.getGPRSizeInBytes();
|
||||
unsigned Alignment = std::min(Flags.getByValAlign(), RegSizeInBytes);
|
||||
EVT PtrTy = getPointerTy(), RegTy = MVT::getIntegerVT(RegSizeInBytes * 8);
|
||||
EVT PtrTy = getPointerTy(DAG.getDataLayout()),
|
||||
RegTy = MVT::getIntegerVT(RegSizeInBytes * 8);
|
||||
unsigned NumRegs = LastReg - FirstReg;
|
||||
|
||||
if (NumRegs) {
|
||||
@ -3785,7 +3792,7 @@ void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
|
||||
unsigned Reg = addLiveIn(MF, ArgRegs[I], RC);
|
||||
SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegTy);
|
||||
FI = MFI->CreateFixedObject(RegSizeInBytes, VaArgOffset, true);
|
||||
SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
SDValue Store = DAG.getStore(Chain, DL, ArgValue, PtrOff,
|
||||
MachinePointerInfo(), false, false, 0);
|
||||
cast<StoreSDNode>(Store.getNode())->getMemOperand()->setValue(
|
||||
|
@ -247,7 +247,8 @@ namespace llvm {
|
||||
const char *getTargetNodeName(unsigned Opcode) const override;
|
||||
|
||||
/// getSetCCResultType - get the ISD::SETCC result ValueType
|
||||
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const override;
|
||||
|
||||
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
|
||||
|
||||
|
@ -841,7 +841,7 @@ std::pair<bool, SDNode*> MipsSEDAGToDAGISel::selectNode(SDNode *Node) {
|
||||
}
|
||||
|
||||
case MipsISD::ThreadPointer: {
|
||||
EVT PtrVT = getTargetLowering()->getPointerTy();
|
||||
EVT PtrVT = getTargetLowering()->getPointerTy(CurDAG->getDataLayout());
|
||||
unsigned RdhwrOpc, DestReg;
|
||||
|
||||
if (PtrVT == MVT::i32) {
|
||||
|
@ -366,7 +366,7 @@ void NVPTXAsmPrinter::printReturnValStr(const Function *F, raw_ostream &O) {
|
||||
|
||||
O << ".param .b" << size << " func_retval0";
|
||||
} else if (isa<PointerType>(Ty)) {
|
||||
O << ".param .b" << TLI->getPointerTy().getSizeInBits()
|
||||
O << ".param .b" << TLI->getPointerTy(DL).getSizeInBits()
|
||||
<< " func_retval0";
|
||||
} else if ((Ty->getTypeID() == Type::StructTyID) || isa<VectorType>(Ty)) {
|
||||
unsigned totalsz = DL.getTypeAllocSize(Ty);
|
||||
@ -1433,7 +1433,7 @@ void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) {
|
||||
bool first = true;
|
||||
bool isKernelFunc = llvm::isKernelFunction(*F);
|
||||
bool isABI = (nvptxSubtarget->getSmVersion() >= 20);
|
||||
MVT thePointerTy = TLI->getPointerTy();
|
||||
MVT thePointerTy = TLI->getPointerTy(*TD);
|
||||
|
||||
O << "(\n";
|
||||
|
||||
|
@ -885,8 +885,9 @@ SDValue
|
||||
NVPTXTargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDLoc dl(Op);
|
||||
const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
Op = DAG.getTargetGlobalAddress(GV, dl, getPointerTy());
|
||||
return DAG.getNode(NVPTXISD::Wrapper, dl, getPointerTy(), Op);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
Op = DAG.getTargetGlobalAddress(GV, dl, PtrVT);
|
||||
return DAG.getNode(NVPTXISD::Wrapper, dl, PtrVT, Op);
|
||||
}
|
||||
|
||||
std::string
|
||||
@ -894,7 +895,7 @@ NVPTXTargetLowering::getPrototype(Type *retTy, const ArgListTy &Args,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
unsigned retAlignment,
|
||||
const ImmutableCallSite *CS) const {
|
||||
|
||||
auto PtrVT = getPointerTy(*getDataLayout());
|
||||
bool isABI = (STI.getSmVersion() >= 20);
|
||||
assert(isABI && "Non-ABI compilation is not supported");
|
||||
if (!isABI)
|
||||
@ -921,7 +922,7 @@ NVPTXTargetLowering::getPrototype(Type *retTy, const ArgListTy &Args,
|
||||
|
||||
O << ".param .b" << size << " _";
|
||||
} else if (isa<PointerType>(retTy)) {
|
||||
O << ".param .b" << getPointerTy().getSizeInBits() << " _";
|
||||
O << ".param .b" << PtrVT.getSizeInBits() << " _";
|
||||
} else if ((retTy->getTypeID() == Type::StructTyID) ||
|
||||
isa<VectorType>(retTy)) {
|
||||
O << ".param .align "
|
||||
@ -936,7 +937,6 @@ NVPTXTargetLowering::getPrototype(Type *retTy, const ArgListTy &Args,
|
||||
O << "_ (";
|
||||
|
||||
bool first = true;
|
||||
MVT thePointerTy = getPointerTy();
|
||||
|
||||
unsigned OIdx = 0;
|
||||
for (unsigned i = 0, e = Args.size(); i != e; ++i, ++OIdx) {
|
||||
@ -947,10 +947,10 @@ NVPTXTargetLowering::getPrototype(Type *retTy, const ArgListTy &Args,
|
||||
first = false;
|
||||
|
||||
if (!Outs[OIdx].Flags.isByVal()) {
|
||||
const DataLayout *TD = getDataLayout();
|
||||
if (Ty->isAggregateType() || Ty->isVectorTy()) {
|
||||
unsigned align = 0;
|
||||
const CallInst *CallI = cast<CallInst>(CS->getInstruction());
|
||||
const DataLayout *TD = getDataLayout();
|
||||
// +1 because index 0 is reserved for return type alignment
|
||||
if (!llvm::getAlign(*CallI, i + 1, align))
|
||||
align = TD->getABITypeAlignment(Ty);
|
||||
@ -966,9 +966,10 @@ NVPTXTargetLowering::getPrototype(Type *retTy, const ArgListTy &Args,
|
||||
continue;
|
||||
}
|
||||
// i8 types in IR will be i16 types in SDAG
|
||||
assert((getValueType(Ty) == Outs[OIdx].VT ||
|
||||
(getValueType(Ty) == MVT::i8 && Outs[OIdx].VT == MVT::i16)) &&
|
||||
"type mismatch between callee prototype and arguments");
|
||||
assert(
|
||||
(getValueType(*TD, Ty) == Outs[OIdx].VT ||
|
||||
(getValueType(*TD, Ty) == MVT::i8 && Outs[OIdx].VT == MVT::i16)) &&
|
||||
"type mismatch between callee prototype and arguments");
|
||||
// scalar type
|
||||
unsigned sz = 0;
|
||||
if (isa<IntegerType>(Ty)) {
|
||||
@ -976,7 +977,7 @@ NVPTXTargetLowering::getPrototype(Type *retTy, const ArgListTy &Args,
|
||||
if (sz < 32)
|
||||
sz = 32;
|
||||
} else if (isa<PointerType>(Ty))
|
||||
sz = thePointerTy.getSizeInBits();
|
||||
sz = PtrVT.getSizeInBits();
|
||||
else
|
||||
sz = Ty->getPrimitiveSizeInBits();
|
||||
O << ".param .b" << sz << " ";
|
||||
@ -1137,7 +1138,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
continue;
|
||||
}
|
||||
if (Ty->isVectorTy()) {
|
||||
EVT ObjectVT = getValueType(Ty);
|
||||
EVT ObjectVT = getValueType(DL, Ty);
|
||||
unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1);
|
||||
// declare .param .align <align> .b8 .param<n>[<size>];
|
||||
unsigned sz = DL.getTypeAllocSize(Ty);
|
||||
@ -1342,9 +1343,9 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
EVT elemtype = vtparts[j];
|
||||
int curOffset = Offsets[j];
|
||||
unsigned PartAlign = GreatestCommonDivisor64(ArgAlign, curOffset);
|
||||
SDValue srcAddr =
|
||||
DAG.getNode(ISD::ADD, dl, getPointerTy(), OutVals[OIdx],
|
||||
DAG.getConstant(curOffset, dl, getPointerTy()));
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue srcAddr = DAG.getNode(ISD::ADD, dl, PtrVT, OutVals[OIdx],
|
||||
DAG.getConstant(curOffset, dl, PtrVT));
|
||||
SDValue theVal = DAG.getLoad(elemtype, dl, tempChain, srcAddr,
|
||||
MachinePointerInfo(), false, false, false,
|
||||
PartAlign);
|
||||
@ -1477,7 +1478,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
// Generate loads from param memory/moves from registers for result
|
||||
if (Ins.size() > 0) {
|
||||
if (retTy && retTy->isVectorTy()) {
|
||||
EVT ObjectVT = getValueType(retTy);
|
||||
EVT ObjectVT = getValueType(DL, retTy);
|
||||
unsigned NumElts = ObjectVT.getVectorNumElements();
|
||||
EVT EltVT = ObjectVT.getVectorElementType();
|
||||
assert(STI.getTargetLowering()->getNumRegisters(F->getContext(),
|
||||
@ -2064,6 +2065,7 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
SmallVectorImpl<SDValue> &InVals) const {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const DataLayout &DL = MF.getDataLayout();
|
||||
auto PtrVT = getPointerTy(DL);
|
||||
|
||||
const Function *F = MF.getFunction();
|
||||
const AttributeSet &PAL = F->getAttributes();
|
||||
@ -2129,7 +2131,7 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
continue;
|
||||
}
|
||||
if (Ty->isVectorTy()) {
|
||||
EVT ObjectVT = getValueType(Ty);
|
||||
EVT ObjectVT = getValueType(DL, Ty);
|
||||
unsigned NumRegs = TLI->getNumRegisters(F->getContext(), ObjectVT);
|
||||
for (unsigned parti = 0; parti < NumRegs; ++parti) {
|
||||
InVals.push_back(DAG.getNode(ISD::UNDEF, dl, Ins[InsIdx].VT));
|
||||
@ -2161,7 +2163,7 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
if (StructType *STy = llvm::dyn_cast<StructType>(Ty))
|
||||
aggregateIsPacked = STy->isPacked();
|
||||
|
||||
SDValue Arg = getParamSymbol(DAG, idx, getPointerTy());
|
||||
SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
|
||||
for (unsigned parti = 0, parte = vtparts.size(); parti != parte;
|
||||
++parti) {
|
||||
EVT partVT = vtparts[parti];
|
||||
@ -2169,8 +2171,8 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
PointerType::get(partVT.getTypeForEVT(F->getContext()),
|
||||
llvm::ADDRESS_SPACE_PARAM));
|
||||
SDValue srcAddr =
|
||||
DAG.getNode(ISD::ADD, dl, getPointerTy(), Arg,
|
||||
DAG.getConstant(offsets[parti], dl, getPointerTy()));
|
||||
DAG.getNode(ISD::ADD, dl, PtrVT, Arg,
|
||||
DAG.getConstant(offsets[parti], dl, PtrVT));
|
||||
unsigned partAlign = aggregateIsPacked
|
||||
? 1
|
||||
: DL.getABITypeAlignment(
|
||||
@ -2197,8 +2199,8 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
continue;
|
||||
}
|
||||
if (Ty->isVectorTy()) {
|
||||
EVT ObjectVT = getValueType(Ty);
|
||||
SDValue Arg = getParamSymbol(DAG, idx, getPointerTy());
|
||||
EVT ObjectVT = getValueType(DL, Ty);
|
||||
SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
|
||||
unsigned NumElts = ObjectVT.getVectorNumElements();
|
||||
assert(TLI->getNumRegisters(F->getContext(), ObjectVT) == NumElts &&
|
||||
"Vector was not scalarized");
|
||||
@ -2268,9 +2270,8 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
Value *SrcValue = Constant::getNullValue(
|
||||
PointerType::get(VecVT.getTypeForEVT(F->getContext()),
|
||||
llvm::ADDRESS_SPACE_PARAM));
|
||||
SDValue SrcAddr =
|
||||
DAG.getNode(ISD::ADD, dl, getPointerTy(), Arg,
|
||||
DAG.getConstant(Ofst, dl, getPointerTy()));
|
||||
SDValue SrcAddr = DAG.getNode(ISD::ADD, dl, PtrVT, Arg,
|
||||
DAG.getConstant(Ofst, dl, PtrVT));
|
||||
SDValue P = DAG.getLoad(
|
||||
VecVT, dl, Root, SrcAddr, MachinePointerInfo(SrcValue), false,
|
||||
false, true,
|
||||
@ -2297,9 +2298,9 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
continue;
|
||||
}
|
||||
// A plain scalar.
|
||||
EVT ObjectVT = getValueType(Ty);
|
||||
EVT ObjectVT = getValueType(DL, Ty);
|
||||
// If ABI, load from the param symbol
|
||||
SDValue Arg = getParamSymbol(DAG, idx, getPointerTy());
|
||||
SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
|
||||
Value *srcValue = Constant::getNullValue(PointerType::get(
|
||||
ObjectVT.getTypeForEVT(F->getContext()), llvm::ADDRESS_SPACE_PARAM));
|
||||
SDValue p;
|
||||
@ -2329,10 +2330,10 @@ SDValue NVPTXTargetLowering::LowerFormalArguments(
|
||||
// machine instruction fails because TargetExternalSymbol
|
||||
// (not lowered) is target dependent, and CopyToReg assumes
|
||||
// the source is lowered.
|
||||
EVT ObjectVT = getValueType(Ty);
|
||||
EVT ObjectVT = getValueType(DL, Ty);
|
||||
assert(ObjectVT == Ins[InsIdx].VT &&
|
||||
"Ins type did not match function type");
|
||||
SDValue Arg = getParamSymbol(DAG, idx, getPointerTy());
|
||||
SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
|
||||
SDValue p = DAG.getNode(NVPTXISD::MoveParam, dl, ObjectVT, Arg);
|
||||
if (p.getNode())
|
||||
p.getNode()->setIROrder(idx + 1);
|
||||
@ -2370,7 +2371,7 @@ NVPTXTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const Function *F = MF.getFunction();
|
||||
Type *RetTy = F->getReturnType();
|
||||
const DataLayout *TD = getDataLayout();
|
||||
const DataLayout &TD = DAG.getDataLayout();
|
||||
|
||||
bool isABI = (STI.getSmVersion() >= 20);
|
||||
assert(isABI && "Non-ABI compilation is not supported");
|
||||
@ -2384,7 +2385,7 @@ NVPTXTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
|
||||
assert(NumElts == Outs.size() && "Bad scalarization of return value");
|
||||
|
||||
// const_cast can be removed in later LLVM versions
|
||||
EVT EltVT = getValueType(RetTy).getVectorElementType();
|
||||
EVT EltVT = getValueType(TD, RetTy).getVectorElementType();
|
||||
bool NeedExtend = false;
|
||||
if (EltVT.getSizeInBits() < 16)
|
||||
NeedExtend = true;
|
||||
@ -2435,7 +2436,7 @@ NVPTXTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
|
||||
EVT VecVT =
|
||||
EVT::getVectorVT(F->getContext(), EltVT, VecSize);
|
||||
unsigned PerStoreOffset =
|
||||
TD->getTypeAllocSize(VecVT.getTypeForEVT(F->getContext()));
|
||||
TD.getTypeAllocSize(VecVT.getTypeForEVT(F->getContext()));
|
||||
|
||||
for (unsigned i = 0; i < NumElts; i += VecSize) {
|
||||
// Get values
|
||||
@ -2509,8 +2510,7 @@ NVPTXTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
|
||||
TheValType.getVectorElementType(), TmpVal,
|
||||
DAG.getIntPtrConstant(j, dl));
|
||||
EVT TheStoreType = ValVTs[i];
|
||||
if (RetTy->isIntegerTy() &&
|
||||
TD->getTypeAllocSizeInBits(RetTy) < 32) {
|
||||
if (RetTy->isIntegerTy() && TD.getTypeAllocSizeInBits(RetTy) < 32) {
|
||||
// The following zero-extension is for integer types only, and
|
||||
// specifically not for aggregates.
|
||||
TmpVal = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, TmpVal);
|
||||
@ -3291,14 +3291,14 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic(
|
||||
case Intrinsic::nvvm_ldu_global_i:
|
||||
case Intrinsic::nvvm_ldu_global_f:
|
||||
case Intrinsic::nvvm_ldu_global_p: {
|
||||
|
||||
auto &DL = I.getModule()->getDataLayout();
|
||||
Info.opc = ISD::INTRINSIC_W_CHAIN;
|
||||
if (Intrinsic == Intrinsic::nvvm_ldu_global_i)
|
||||
Info.memVT = getValueType(I.getType());
|
||||
Info.memVT = getValueType(DL, I.getType());
|
||||
else if(Intrinsic == Intrinsic::nvvm_ldu_global_p)
|
||||
Info.memVT = getPointerTy();
|
||||
Info.memVT = getPointerTy(DL);
|
||||
else
|
||||
Info.memVT = getValueType(I.getType());
|
||||
Info.memVT = getValueType(DL, I.getType());
|
||||
Info.ptrVal = I.getArgOperand(0);
|
||||
Info.offset = 0;
|
||||
Info.vol = 0;
|
||||
@ -3311,14 +3311,15 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic(
|
||||
case Intrinsic::nvvm_ldg_global_i:
|
||||
case Intrinsic::nvvm_ldg_global_f:
|
||||
case Intrinsic::nvvm_ldg_global_p: {
|
||||
auto &DL = I.getModule()->getDataLayout();
|
||||
|
||||
Info.opc = ISD::INTRINSIC_W_CHAIN;
|
||||
if (Intrinsic == Intrinsic::nvvm_ldg_global_i)
|
||||
Info.memVT = getValueType(I.getType());
|
||||
Info.memVT = getValueType(DL, I.getType());
|
||||
else if(Intrinsic == Intrinsic::nvvm_ldg_global_p)
|
||||
Info.memVT = getPointerTy();
|
||||
Info.memVT = getPointerTy(DL);
|
||||
else
|
||||
Info.memVT = getValueType(I.getType());
|
||||
Info.memVT = getValueType(DL, I.getType());
|
||||
Info.ptrVal = I.getArgOperand(0);
|
||||
Info.offset = 0;
|
||||
Info.vol = 0;
|
||||
|
@ -462,7 +462,8 @@ public:
|
||||
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
||||
unsigned getFunctionAlignment(const Function *F) const;
|
||||
|
||||
EVT getSetCCResultType(LLVMContext &Ctx, EVT VT) const override {
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx,
|
||||
EVT VT) const override {
|
||||
if (VT.isVector())
|
||||
return EVT::getVectorVT(Ctx, MVT::i1, VT.getVectorNumElements());
|
||||
return MVT::i1;
|
||||
|
@ -94,7 +94,7 @@ unsigned NVPTXTTIImpl::getArithmeticInstrCost(
|
||||
TTI::OperandValueKind Opd2Info, TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo) {
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Ty);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
|
||||
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
|
||||
|
@ -351,8 +351,9 @@ bool PPCCTRLoops::mightUseCTR(const Triple &TT, BasicBlock *BB) {
|
||||
Opcode = ISD::FTRUNC; break;
|
||||
}
|
||||
|
||||
MVT VTy =
|
||||
TLI->getSimpleValueType(CI->getArgOperand(0)->getType(), true);
|
||||
auto &DL = CI->getModule()->getDataLayout();
|
||||
MVT VTy = TLI->getSimpleValueType(DL, CI->getArgOperand(0)->getType(),
|
||||
true);
|
||||
if (VTy == MVT::Other)
|
||||
return true;
|
||||
|
||||
|
@ -262,7 +262,7 @@ static Optional<PPC::Predicate> getComparePred(CmpInst::Predicate Pred) {
|
||||
// fast-isel, and return its equivalent machine type in VT.
|
||||
// FIXME: Copied directly from ARM -- factor into base class?
|
||||
bool PPCFastISel::isTypeLegal(Type *Ty, MVT &VT) {
|
||||
EVT Evt = TLI.getValueType(Ty, true);
|
||||
EVT Evt = TLI.getValueType(DL, Ty, true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (Evt == MVT::Other || !Evt.isSimple()) return false;
|
||||
@ -324,12 +324,13 @@ bool PPCFastISel::PPCComputeAddress(const Value *Obj, Address &Addr) {
|
||||
return PPCComputeAddress(U->getOperand(0), Addr);
|
||||
case Instruction::IntToPtr:
|
||||
// Look past no-op inttoptrs.
|
||||
if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(DL))
|
||||
return PPCComputeAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
case Instruction::PtrToInt:
|
||||
// Look past no-op ptrtoints.
|
||||
if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
|
||||
return PPCComputeAddress(U->getOperand(0), Addr);
|
||||
break;
|
||||
case Instruction::GetElementPtr: {
|
||||
@ -799,7 +800,7 @@ bool PPCFastISel::SelectBranch(const Instruction *I) {
|
||||
bool PPCFastISel::PPCEmitCmp(const Value *SrcValue1, const Value *SrcValue2,
|
||||
bool IsZExt, unsigned DestReg) {
|
||||
Type *Ty = SrcValue1->getType();
|
||||
EVT SrcEVT = TLI.getValueType(Ty, true);
|
||||
EVT SrcEVT = TLI.getValueType(DL, Ty, true);
|
||||
if (!SrcEVT.isSimple())
|
||||
return false;
|
||||
MVT SrcVT = SrcEVT.getSimpleVT();
|
||||
@ -893,8 +894,8 @@ bool PPCFastISel::PPCEmitCmp(const Value *SrcValue1, const Value *SrcValue2,
|
||||
// Attempt to fast-select a floating-point extend instruction.
|
||||
bool PPCFastISel::SelectFPExt(const Instruction *I) {
|
||||
Value *Src = I->getOperand(0);
|
||||
EVT SrcVT = TLI.getValueType(Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT SrcVT = TLI.getValueType(DL, Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
if (SrcVT != MVT::f32 || DestVT != MVT::f64)
|
||||
return false;
|
||||
@ -911,8 +912,8 @@ bool PPCFastISel::SelectFPExt(const Instruction *I) {
|
||||
// Attempt to fast-select a floating-point truncate instruction.
|
||||
bool PPCFastISel::SelectFPTrunc(const Instruction *I) {
|
||||
Value *Src = I->getOperand(0);
|
||||
EVT SrcVT = TLI.getValueType(Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT SrcVT = TLI.getValueType(DL, Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
if (SrcVT != MVT::f64 || DestVT != MVT::f32)
|
||||
return false;
|
||||
@ -992,7 +993,7 @@ bool PPCFastISel::SelectIToFP(const Instruction *I, bool IsSigned) {
|
||||
return false;
|
||||
|
||||
Value *Src = I->getOperand(0);
|
||||
EVT SrcEVT = TLI.getValueType(Src->getType(), true);
|
||||
EVT SrcEVT = TLI.getValueType(DL, Src->getType(), true);
|
||||
if (!SrcEVT.isSimple())
|
||||
return false;
|
||||
|
||||
@ -1157,7 +1158,7 @@ bool PPCFastISel::SelectFPToI(const Instruction *I, bool IsSigned) {
|
||||
// Attempt to fast-select a binary integer operation that isn't already
|
||||
// handled automatically.
|
||||
bool PPCFastISel::SelectBinaryIntOp(const Instruction *I, unsigned ISDOpcode) {
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
// We can get here in the case when we have a binary operation on a non-legal
|
||||
// type and the target independent selector doesn't know how to handle it.
|
||||
@ -1641,7 +1642,7 @@ bool PPCFastISel::SelectRet(const Instruction *I) {
|
||||
RetRegs.push_back(VA.getLocReg());
|
||||
unsigned SrcReg = Reg + VA.getValNo();
|
||||
|
||||
EVT RVEVT = TLI.getValueType(RV->getType());
|
||||
EVT RVEVT = TLI.getValueType(DL, RV->getType());
|
||||
if (!RVEVT.isSimple())
|
||||
return false;
|
||||
MVT RVVT = RVEVT.getSimpleVT();
|
||||
@ -1769,8 +1770,8 @@ bool PPCFastISel::SelectIndirectBr(const Instruction *I) {
|
||||
// Attempt to fast-select an integer truncate instruction.
|
||||
bool PPCFastISel::SelectTrunc(const Instruction *I) {
|
||||
Value *Src = I->getOperand(0);
|
||||
EVT SrcVT = TLI.getValueType(Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(I->getType(), true);
|
||||
EVT SrcVT = TLI.getValueType(DL, Src->getType(), true);
|
||||
EVT DestVT = TLI.getValueType(DL, I->getType(), true);
|
||||
|
||||
if (SrcVT != MVT::i64 && SrcVT != MVT::i32 && SrcVT != MVT::i16)
|
||||
return false;
|
||||
@ -1806,8 +1807,8 @@ bool PPCFastISel::SelectIntExt(const Instruction *I) {
|
||||
if (!SrcReg) return false;
|
||||
|
||||
EVT SrcEVT, DestEVT;
|
||||
SrcEVT = TLI.getValueType(SrcTy, true);
|
||||
DestEVT = TLI.getValueType(DestTy, true);
|
||||
SrcEVT = TLI.getValueType(DL, SrcTy, true);
|
||||
DestEVT = TLI.getValueType(DL, DestTy, true);
|
||||
if (!SrcEVT.isSimple())
|
||||
return false;
|
||||
if (!DestEVT.isSimple())
|
||||
@ -2127,7 +2128,7 @@ unsigned PPCFastISel::PPCMaterializeInt(const Constant *C, MVT VT,
|
||||
// Materialize a constant into a register, and return the register
|
||||
// number (or zero if we failed to handle it).
|
||||
unsigned PPCFastISel::fastMaterializeConstant(const Constant *C) {
|
||||
EVT CEVT = TLI.getValueType(C->getType(), true);
|
||||
EVT CEVT = TLI.getValueType(DL, C->getType(), true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (!CEVT.isSimple()) return 0;
|
||||
|
@ -102,7 +102,8 @@ namespace {
|
||||
|
||||
/// getSmallIPtrImm - Return a target constant of pointer type.
|
||||
inline SDValue getSmallIPtrImm(unsigned Imm, SDLoc dl) {
|
||||
return CurDAG->getTargetConstant(Imm, dl, PPCLowering->getPointerTy());
|
||||
return CurDAG->getTargetConstant(
|
||||
Imm, dl, PPCLowering->getPointerTy(CurDAG->getDataLayout()));
|
||||
}
|
||||
|
||||
/// isRotateAndMask - Returns true if Mask and Shift can be folded into a
|
||||
@ -313,7 +314,7 @@ SDNode *PPCDAGToDAGISel::getGlobalBaseReg() {
|
||||
const Module *M = MF->getFunction()->getParent();
|
||||
DebugLoc dl;
|
||||
|
||||
if (PPCLowering->getPointerTy() == MVT::i32) {
|
||||
if (PPCLowering->getPointerTy(CurDAG->getDataLayout()) == MVT::i32) {
|
||||
if (PPCSubTarget->isTargetELF()) {
|
||||
GlobalBaseReg = PPC::R30;
|
||||
if (M->getPICLevel() == PICLevel::Small) {
|
||||
@ -342,7 +343,8 @@ SDNode *PPCDAGToDAGISel::getGlobalBaseReg() {
|
||||
}
|
||||
}
|
||||
return CurDAG->getRegister(GlobalBaseReg,
|
||||
PPCLowering->getPointerTy()).getNode();
|
||||
PPCLowering->getPointerTy(CurDAG->getDataLayout()))
|
||||
.getNode();
|
||||
}
|
||||
|
||||
/// isIntS16Immediate - This method tests to see if the node is either a 32-bit
|
||||
@ -2205,7 +2207,8 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDNode *N) {
|
||||
SDLoc dl(N);
|
||||
unsigned Imm;
|
||||
ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
|
||||
EVT PtrVT = CurDAG->getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT =
|
||||
CurDAG->getTargetLoweringInfo().getPointerTy(CurDAG->getDataLayout());
|
||||
bool isPPC64 = (PtrVT == MVT::i64);
|
||||
|
||||
if (!PPCSubTarget->useCRBits() &&
|
||||
@ -2468,10 +2471,11 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
|
||||
SDValue Chain = LD->getChain();
|
||||
SDValue Base = LD->getBasePtr();
|
||||
SDValue Ops[] = { Offset, Base, Chain };
|
||||
return transferMemOperands(N, CurDAG->getMachineNode(Opcode, dl,
|
||||
LD->getValueType(0),
|
||||
PPCLowering->getPointerTy(),
|
||||
MVT::Other, Ops));
|
||||
return transferMemOperands(
|
||||
N, CurDAG->getMachineNode(
|
||||
Opcode, dl, LD->getValueType(0),
|
||||
PPCLowering->getPointerTy(CurDAG->getDataLayout()), MVT::Other,
|
||||
Ops));
|
||||
} else {
|
||||
unsigned Opcode;
|
||||
bool isSExt = LD->getExtensionType() == ISD::SEXTLOAD;
|
||||
@ -2506,10 +2510,11 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
|
||||
SDValue Chain = LD->getChain();
|
||||
SDValue Base = LD->getBasePtr();
|
||||
SDValue Ops[] = { Base, Offset, Chain };
|
||||
return transferMemOperands(N, CurDAG->getMachineNode(Opcode, dl,
|
||||
LD->getValueType(0),
|
||||
PPCLowering->getPointerTy(),
|
||||
MVT::Other, Ops));
|
||||
return transferMemOperands(
|
||||
N, CurDAG->getMachineNode(
|
||||
Opcode, dl, LD->getValueType(0),
|
||||
PPCLowering->getPointerTy(CurDAG->getDataLayout()), MVT::Other,
|
||||
Ops));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2662,7 +2667,8 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
|
||||
}
|
||||
case ISD::SELECT_CC: {
|
||||
ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(4))->get();
|
||||
EVT PtrVT = CurDAG->getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT =
|
||||
CurDAG->getTargetLoweringInfo().getPointerTy(CurDAG->getDataLayout());
|
||||
bool isPPC64 = (PtrVT == MVT::i64);
|
||||
|
||||
// If this is a select of i1 operands, we'll pattern match it.
|
||||
@ -2915,7 +2921,9 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
|
||||
// Generate a PIC-safe GOT reference.
|
||||
assert(!PPCSubTarget->isPPC64() && PPCSubTarget->isSVR4ABI() &&
|
||||
"PPCISD::PPC32_PICGOT is only supported for 32-bit SVR4");
|
||||
return CurDAG->SelectNodeTo(N, PPC::PPC32PICGOT, PPCLowering->getPointerTy(), MVT::i32);
|
||||
return CurDAG->SelectNodeTo(
|
||||
N, PPC::PPC32PICGOT, PPCLowering->getPointerTy(CurDAG->getDataLayout()),
|
||||
MVT::i32);
|
||||
}
|
||||
case PPCISD::VADD_SPLAT: {
|
||||
// This expands into one of three sequences, depending on whether
|
||||
|
@ -1055,7 +1055,8 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
EVT PPCTargetLowering::getSetCCResultType(LLVMContext &C, EVT VT) const {
|
||||
EVT PPCTargetLowering::getSetCCResultType(const DataLayout &DL, LLVMContext &C,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return Subtarget.useCRBits() ? MVT::i1 : MVT::i32;
|
||||
|
||||
@ -1796,7 +1797,7 @@ bool PPCTargetLowering::SelectAddressRegImm(SDValue N, SDValue &Disp,
|
||||
}
|
||||
}
|
||||
|
||||
Disp = DAG.getTargetConstant(0, dl, getPointerTy());
|
||||
Disp = DAG.getTargetConstant(0, dl, getPointerTy(DAG.getDataLayout()));
|
||||
if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) {
|
||||
Base = DAG.getTargetFrameIndex(FI->getIndex(), N.getValueType());
|
||||
fixupFuncForFI(DAG, FI->getIndex(), N.getValueType());
|
||||
@ -2084,7 +2085,7 @@ SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op,
|
||||
GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
|
||||
SDLoc dl(GA);
|
||||
const GlobalValue *GV = GA->getGlobal();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
bool is64bit = Subtarget.isPPC64();
|
||||
const Module *M = DAG.getMachineFunction().getFunction()->getParent();
|
||||
PICLevel::Level picLevel = M->getPICLevel();
|
||||
@ -2270,7 +2271,7 @@ SDValue PPCTargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG,
|
||||
const PPCSubtarget &Subtarget) const {
|
||||
SDNode *Node = Op.getNode();
|
||||
EVT VT = Node->getValueType(0);
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
SDValue InChain = Node->getOperand(0);
|
||||
SDValue VAListPtr = Node->getOperand(1);
|
||||
const Value *SV = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
|
||||
@ -2399,7 +2400,7 @@ SDValue PPCTargetLowering::LowerINIT_TRAMPOLINE(SDValue Op,
|
||||
SDValue Nest = Op.getOperand(3); // 'nest' parameter value
|
||||
SDLoc dl(Op);
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
bool isPPC64 = (PtrVT == MVT::i64);
|
||||
Type *IntPtrTy =
|
||||
DAG.getTargetLoweringInfo().getDataLayout()->getIntPtrType(
|
||||
@ -2440,7 +2441,7 @@ SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
if (Subtarget.isDarwinABI() || Subtarget.isPPC64()) {
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1),
|
||||
@ -2476,8 +2477,7 @@ SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
SDValue ArgGPR = DAG.getConstant(FuncInfo->getVarArgsNumGPR(), dl, MVT::i32);
|
||||
SDValue ArgFPR = DAG.getConstant(FuncInfo->getVarArgsNumFPR(), dl, MVT::i32);
|
||||
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
|
||||
SDValue StackOffsetFI = DAG.getFrameIndex(FuncInfo->getVarArgsStackOffset(),
|
||||
PtrVT);
|
||||
@ -2797,7 +2797,7 @@ PPCTargetLowering::LowerFormalArguments_32SVR4(
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
// Potential tail calls could cause overwriting of argument stack slots.
|
||||
bool isImmutable = !(getTargetMachine().Options.GuaranteedTailCallOpt &&
|
||||
(CallConv == CallingConv::Fast));
|
||||
@ -3023,7 +3023,7 @@ PPCTargetLowering::LowerFormalArguments_64SVR4(
|
||||
assert(!(CallConv == CallingConv::Fast && isVarArg) &&
|
||||
"fastcc not supported on varargs functions");
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
// Potential tail calls could cause overwriting of argument stack slots.
|
||||
bool isImmutable = !(getTargetMachine().Options.GuaranteedTailCallOpt &&
|
||||
(CallConv == CallingConv::Fast));
|
||||
@ -3425,7 +3425,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
bool isPPC64 = PtrVT == MVT::i64;
|
||||
// Potential tail calls could cause overwriting of argument stack slots.
|
||||
bool isImmutable = !(getTargetMachine().Options.GuaranteedTailCallOpt &&
|
||||
@ -3845,7 +3845,8 @@ static SDNode *isBLACompatibleAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
return nullptr; // Top 6 bits have to be sext of immediate.
|
||||
|
||||
return DAG.getConstant((int)C->getZExtValue() >> 2, SDLoc(Op),
|
||||
DAG.getTargetLoweringInfo().getPointerTy()).getNode();
|
||||
DAG.getTargetLoweringInfo().getPointerTy(
|
||||
DAG.getDataLayout())).getNode();
|
||||
}
|
||||
|
||||
namespace {
|
||||
@ -3991,7 +3992,7 @@ LowerMemOpCallTo(SelectionDAG &DAG, MachineFunction &MF, SDValue Chain,
|
||||
bool isVector, SmallVectorImpl<SDValue> &MemOpChains,
|
||||
SmallVectorImpl<TailCallArgumentInfo> &TailCallArguments,
|
||||
SDLoc dl) {
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
if (!isTailCall) {
|
||||
if (isVector) {
|
||||
SDValue StackPtr;
|
||||
@ -4062,7 +4063,7 @@ unsigned PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag,
|
||||
bool isSVR4ABI = Subtarget.isSVR4ABI();
|
||||
bool isELFv2ABI = Subtarget.isELFv2ABI();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
NodeTys.push_back(MVT::Other); // Returns a chain
|
||||
NodeTys.push_back(MVT::Glue); // Returns a flag for retval copy to use.
|
||||
|
||||
@ -4379,7 +4380,7 @@ PPCTargetLowering::FinishCall(CallingConv::ID CallConv, SDLoc dl,
|
||||
// allocated and an unnecessary move instruction being generated.
|
||||
CallOpc = PPCISD::BCTRL_LOAD_TOC;
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
SDValue StackPtr = DAG.getRegister(PPC::X1, PtrVT);
|
||||
unsigned TOCSaveOffset = Subtarget.getFrameLowering()->getTOCSaveOffset();
|
||||
SDValue TOCOff = DAG.getIntPtrConstant(TOCSaveOffset, dl);
|
||||
@ -4584,7 +4585,8 @@ PPCTargetLowering::LowerCall_32SVR4(SDValue Chain, SDValue Callee,
|
||||
unsigned LocMemOffset = ByValVA.getLocMemOffset();
|
||||
|
||||
SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(MF.getDataLayout()),
|
||||
StackPtr, PtrOff);
|
||||
|
||||
// Create a copy of the argument in the local area of the current
|
||||
// stack frame.
|
||||
@ -4621,7 +4623,8 @@ PPCTargetLowering::LowerCall_32SVR4(SDValue Chain, SDValue Callee,
|
||||
|
||||
if (!isTailCall) {
|
||||
SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(MF.getDataLayout()),
|
||||
StackPtr, PtrOff);
|
||||
|
||||
MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff,
|
||||
MachinePointerInfo(),
|
||||
@ -4702,7 +4705,7 @@ PPCTargetLowering::LowerCall_64SVR4(SDValue Chain, SDValue Callee,
|
||||
bool isLittleEndian = Subtarget.isLittleEndian();
|
||||
unsigned NumOps = Outs.size();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
unsigned PtrByteSize = 8;
|
||||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
@ -5318,7 +5321,7 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,
|
||||
|
||||
unsigned NumOps = Outs.size();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
bool isPPC64 = PtrVT == MVT::i64;
|
||||
unsigned PtrByteSize = isPPC64 ? 8 : 4;
|
||||
|
||||
@ -5762,7 +5765,7 @@ SDValue PPCTargetLowering::LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG,
|
||||
SDLoc dl(Op);
|
||||
|
||||
// Get the corect type for pointers.
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Construct the stack pointer operand.
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
@ -5792,7 +5795,7 @@ SDValue
|
||||
PPCTargetLowering::getReturnAddrFrameIndex(SelectionDAG & DAG) const {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
|
||||
// Get current frame pointer save index. The users of this index will be
|
||||
// primarily DYNALLOC instructions.
|
||||
@ -5815,7 +5818,7 @@ SDValue
|
||||
PPCTargetLowering::getFramePointerFrameIndex(SelectionDAG & DAG) const {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
|
||||
// Get current frame pointer save index. The users of this index will be
|
||||
// primarily DYNALLOC instructions.
|
||||
@ -5843,7 +5846,7 @@ SDValue PPCTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
SDLoc dl(Op);
|
||||
|
||||
// Get the corect type for pointers.
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
// Negate the size.
|
||||
SDValue NegSize = DAG.getNode(ISD::SUB, dl, PtrVT,
|
||||
DAG.getConstant(0, dl, PtrVT), Size);
|
||||
@ -5886,8 +5889,9 @@ SDValue PPCTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue BasePtr = LD->getBasePtr();
|
||||
MachineMemOperand *MMO = LD->getMemOperand();
|
||||
|
||||
SDValue NewLD = DAG.getExtLoad(ISD::EXTLOAD, dl, getPointerTy(), Chain,
|
||||
BasePtr, MVT::i8, MMO);
|
||||
SDValue NewLD =
|
||||
DAG.getExtLoad(ISD::EXTLOAD, dl, getPointerTy(DAG.getDataLayout()), Chain,
|
||||
BasePtr, MVT::i8, MMO);
|
||||
SDValue Result = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, NewLD);
|
||||
|
||||
SDValue Ops[] = { Result, SDValue(NewLD.getNode(), 1) };
|
||||
@ -5911,7 +5915,8 @@ SDValue PPCTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Value = ST->getValue();
|
||||
MachineMemOperand *MMO = ST->getMemOperand();
|
||||
|
||||
Value = DAG.getNode(ISD::ZERO_EXTEND, dl, getPointerTy(), Value);
|
||||
Value = DAG.getNode(ISD::ZERO_EXTEND, dl, getPointerTy(DAG.getDataLayout()),
|
||||
Value);
|
||||
return DAG.getTruncStore(Chain, dl, Value, BasePtr, MVT::i8, MMO);
|
||||
}
|
||||
|
||||
@ -6372,7 +6377,7 @@ SDValue PPCTargetLowering::LowerINT_TO_FP(SDValue Op,
|
||||
SINT.getOpcode() == ISD::ZERO_EXTEND)) &&
|
||||
SINT.getOperand(0).getValueType() == MVT::i32) {
|
||||
MachineFrameInfo *FrameInfo = MF.getFrameInfo();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
|
||||
int FrameIdx = FrameInfo->CreateStackObject(4, 4, false);
|
||||
SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
|
||||
@ -6417,7 +6422,7 @@ SDValue PPCTargetLowering::LowerINT_TO_FP(SDValue Op,
|
||||
// then lfd it and fcfid it.
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *FrameInfo = MF.getFrameInfo();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
|
||||
SDValue Ld;
|
||||
if (Subtarget.hasLFIWAX() || Subtarget.hasFPCVT()) {
|
||||
@ -6504,7 +6509,7 @@ SDValue PPCTargetLowering::LowerFLT_ROUNDS_(SDValue Op,
|
||||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
EVT VT = Op.getValueType();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
|
||||
// Save FP Control Word to register
|
||||
EVT NodeTys[] = {
|
||||
@ -6725,7 +6730,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,
|
||||
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
||||
int FrameIdx = FrameInfo->CreateStackObject(16, 16, false);
|
||||
MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(FrameIdx);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
|
||||
|
||||
assert(BVN->getNumOperands() == 4 &&
|
||||
@ -6758,9 +6763,9 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,
|
||||
}
|
||||
|
||||
Constant *CP = ConstantVector::get(CV);
|
||||
SDValue CPIdx = DAG.getConstantPool(CP, getPointerTy(),
|
||||
16 /* alignment */);
|
||||
|
||||
SDValue CPIdx = DAG.getConstantPool(CP, getPointerTy(DAG.getDataLayout()),
|
||||
16 /* alignment */);
|
||||
|
||||
SmallVector<SDValue, 2> Ops;
|
||||
Ops.push_back(DAG.getEntryNode());
|
||||
Ops.push_back(CPIdx);
|
||||
@ -7451,7 +7456,7 @@ SDValue PPCTargetLowering::LowerSCALAR_TO_VECTOR(SDValue Op,
|
||||
// Create a stack slot that is 16-byte aligned.
|
||||
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
||||
int FrameIdx = FrameInfo->CreateStackObject(16, 16, false);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
|
||||
|
||||
// Store the input value into Value#0 of the stack slot.
|
||||
@ -7497,7 +7502,7 @@ SDValue PPCTargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
|
||||
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
||||
int FrameIdx = FrameInfo->CreateStackObject(16, 16, false);
|
||||
MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(FrameIdx);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
|
||||
|
||||
SDValue StoreChain = DAG.getEntryNode();
|
||||
@ -7649,9 +7654,9 @@ SDValue PPCTargetLowering::LowerVectorStore(SDValue Op,
|
||||
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
for (unsigned Idx = 0; Idx < 4; ++Idx) {
|
||||
SDValue Ex =
|
||||
DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ScalarVT, Value,
|
||||
DAG.getConstant(Idx, dl, getVectorIdxTy()));
|
||||
SDValue Ex = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, ScalarVT, Value,
|
||||
DAG.getConstant(Idx, dl, getVectorIdxTy(DAG.getDataLayout())));
|
||||
SDValue Store;
|
||||
if (ScalarVT != ScalarMemVT)
|
||||
Store =
|
||||
@ -7713,7 +7718,7 @@ SDValue PPCTargetLowering::LowerVectorStore(SDValue Op,
|
||||
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
||||
int FrameIdx = FrameInfo->CreateStackObject(16, 16, false);
|
||||
MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(FrameIdx);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue FIdx = DAG.getFrameIndex(FrameIdx, PtrVT);
|
||||
|
||||
SmallVector<SDValue, 2> Ops;
|
||||
@ -7918,7 +7923,8 @@ void PPCTargetLowering::ReplaceNodeResults(SDNode *N,
|
||||
|
||||
assert(N->getValueType(0) == MVT::i1 &&
|
||||
"Unexpected result type for CTR decrement intrinsic");
|
||||
EVT SVT = getSetCCResultType(*DAG.getContext(), N->getValueType(0));
|
||||
EVT SVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
|
||||
N->getValueType(0));
|
||||
SDVTList VTs = DAG.getVTList(SVT, MVT::Other);
|
||||
SDValue NewInt = DAG.getNode(N->getOpcode(), dl, VTs, N->getOperand(0),
|
||||
N->getOperand(1));
|
||||
@ -8246,7 +8252,7 @@ PPCTargetLowering::emitEHSjLjSetJmp(MachineInstr *MI,
|
||||
unsigned mainDstReg = MRI.createVirtualRegister(RC);
|
||||
unsigned restoreDstReg = MRI.createVirtualRegister(RC);
|
||||
|
||||
MVT PVT = getPointerTy();
|
||||
MVT PVT = getPointerTy(MF->getDataLayout());
|
||||
assert((PVT == MVT::i64 || PVT == MVT::i32) &&
|
||||
"Invalid Pointer Size!");
|
||||
// For v = setjmp(buf), we generate
|
||||
@ -8384,7 +8390,7 @@ PPCTargetLowering::emitEHSjLjLongJmp(MachineInstr *MI,
|
||||
MachineInstr::mmo_iterator MMOBegin = MI->memoperands_begin();
|
||||
MachineInstr::mmo_iterator MMOEnd = MI->memoperands_end();
|
||||
|
||||
MVT PVT = getPointerTy();
|
||||
MVT PVT = getPointerTy(MF->getDataLayout());
|
||||
assert((PVT == MVT::i64 || PVT == MVT::i32) &&
|
||||
"Invalid Pointer Size!");
|
||||
|
||||
@ -10217,7 +10223,8 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
2*MemVT.getStoreSize()-1);
|
||||
|
||||
// Create the new base load.
|
||||
SDValue LDXIntID = DAG.getTargetConstant(IntrLD, dl, getPointerTy());
|
||||
SDValue LDXIntID =
|
||||
DAG.getTargetConstant(IntrLD, dl, getPointerTy(MF.getDataLayout()));
|
||||
SDValue BaseLoadOps[] = { Chain, LDXIntID, Ptr };
|
||||
SDValue BaseLoad =
|
||||
DAG.getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN, dl,
|
||||
@ -10241,7 +10248,8 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
if (!findConsecutiveLoad(LD, DAG))
|
||||
--IncValue;
|
||||
|
||||
SDValue Increment = DAG.getConstant(IncValue, dl, getPointerTy());
|
||||
SDValue Increment =
|
||||
DAG.getConstant(IncValue, dl, getPointerTy(MF.getDataLayout()));
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment);
|
||||
|
||||
MachineMemOperand *ExtraMMO =
|
||||
@ -10975,22 +10983,22 @@ SDValue PPCTargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
FuncInfo->setLRStoreRequired();
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
|
||||
if (Depth > 0) {
|
||||
SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
|
||||
SDValue Offset =
|
||||
DAG.getConstant(Subtarget.getFrameLowering()->getReturnSaveOffset(), dl,
|
||||
isPPC64 ? MVT::i64 : MVT::i32);
|
||||
return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
|
||||
DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
FrameAddr, Offset),
|
||||
return DAG.getLoad(PtrVT, dl, DAG.getEntryNode(),
|
||||
DAG.getNode(ISD::ADD, dl, PtrVT, FrameAddr, Offset),
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
}
|
||||
|
||||
// Just load the return address off the stack.
|
||||
SDValue RetAddrFI = getReturnAddrFrameIndex(DAG);
|
||||
return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
|
||||
RetAddrFI, MachinePointerInfo(), false, false, false, 0);
|
||||
return DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), RetAddrFI,
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
}
|
||||
|
||||
SDValue PPCTargetLowering::LowerFRAMEADDR(SDValue Op,
|
||||
@ -10998,13 +11006,13 @@ SDValue PPCTargetLowering::LowerFRAMEADDR(SDValue Op,
|
||||
SDLoc dl(Op);
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
bool isPPC64 = PtrVT == MVT::i64;
|
||||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->setFrameAddressIsTaken(true);
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(MF.getDataLayout());
|
||||
bool isPPC64 = PtrVT == MVT::i64;
|
||||
|
||||
// Naked functions never have a frame pointer, and so we use r1. For all
|
||||
// other functions, this decision must be delayed until during PEI.
|
||||
unsigned FrameReg;
|
||||
|
@ -434,7 +434,8 @@ namespace llvm {
|
||||
}
|
||||
|
||||
/// getSetCCResultType - Return the ISD::SETCC ValueType
|
||||
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const override;
|
||||
|
||||
/// Return true if target always beneficiates from combining into FMA for a
|
||||
/// given value type. This must typically return false on targets where FMA
|
||||
|
@ -317,7 +317,7 @@ unsigned PPCTTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src,
|
||||
unsigned Alignment,
|
||||
unsigned AddressSpace) {
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Src);
|
||||
assert((Opcode == Instruction::Load || Opcode == Instruction::Store) &&
|
||||
"Invalid Opcode");
|
||||
|
||||
|
@ -67,13 +67,16 @@ private:
|
||||
|
||||
SDNode* SparcDAGToDAGISel::getGlobalBaseReg() {
|
||||
unsigned GlobalBaseReg = Subtarget->getInstrInfo()->getGlobalBaseReg(MF);
|
||||
return CurDAG->getRegister(GlobalBaseReg, TLI->getPointerTy()).getNode();
|
||||
return CurDAG->getRegister(GlobalBaseReg,
|
||||
TLI->getPointerTy(CurDAG->getDataLayout()))
|
||||
.getNode();
|
||||
}
|
||||
|
||||
bool SparcDAGToDAGISel::SelectADDRri(SDValue Addr,
|
||||
SDValue &Base, SDValue &Offset) {
|
||||
if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
|
||||
Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FIN->getIndex(), TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32);
|
||||
return true;
|
||||
}
|
||||
@ -88,8 +91,8 @@ bool SparcDAGToDAGISel::SelectADDRri(SDValue Addr,
|
||||
if (FrameIndexSDNode *FIN =
|
||||
dyn_cast<FrameIndexSDNode>(Addr.getOperand(0))) {
|
||||
// Constant offset from frame ref.
|
||||
Base =
|
||||
CurDAG->getTargetFrameIndex(FIN->getIndex(), TLI->getPointerTy());
|
||||
Base = CurDAG->getTargetFrameIndex(
|
||||
FIN->getIndex(), TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
} else {
|
||||
Base = Addr.getOperand(0);
|
||||
}
|
||||
@ -134,7 +137,7 @@ bool SparcDAGToDAGISel::SelectADDRrr(SDValue Addr, SDValue &R1, SDValue &R2) {
|
||||
}
|
||||
|
||||
R1 = Addr;
|
||||
R2 = CurDAG->getRegister(SP::G0, TLI->getPointerTy());
|
||||
R2 = CurDAG->getRegister(SP::G0, TLI->getPointerTy(CurDAG->getDataLayout()));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -221,10 +221,11 @@ SparcTargetLowering::LowerReturn_32(SDValue Chain,
|
||||
unsigned Reg = SFI->getSRetReturnReg();
|
||||
if (!Reg)
|
||||
llvm_unreachable("sret virtual register not created in the entry block");
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, getPointerTy());
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, PtrVT);
|
||||
Chain = DAG.getCopyToReg(Chain, DL, SP::I0, Val, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
RetOps.push_back(DAG.getRegister(SP::I0, getPointerTy()));
|
||||
RetOps.push_back(DAG.getRegister(SP::I0, PtrVT));
|
||||
RetAddrOffset = 12; // CallInst + Delay Slot + Unimp
|
||||
}
|
||||
|
||||
@ -418,6 +419,7 @@ LowerFormalArguments_32(SDValue Chain,
|
||||
assert(VA.isMemLoc());
|
||||
|
||||
unsigned Offset = VA.getLocMemOffset()+StackOffset;
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (VA.needsCustom()) {
|
||||
assert(VA.getValVT() == MVT::f64);
|
||||
@ -426,7 +428,7 @@ LowerFormalArguments_32(SDValue Chain,
|
||||
int FI = MF.getFrameInfo()->CreateFixedObject(8,
|
||||
Offset,
|
||||
true);
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
|
||||
SDValue Load = DAG.getLoad(VA.getValVT(), dl, Chain, FIPtr,
|
||||
MachinePointerInfo(),
|
||||
false,false, false, 0);
|
||||
@ -437,14 +439,14 @@ LowerFormalArguments_32(SDValue Chain,
|
||||
int FI = MF.getFrameInfo()->CreateFixedObject(4,
|
||||
Offset,
|
||||
true);
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
|
||||
SDValue HiVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr,
|
||||
MachinePointerInfo(),
|
||||
false, false, false, 0);
|
||||
int FI2 = MF.getFrameInfo()->CreateFixedObject(4,
|
||||
Offset+4,
|
||||
true);
|
||||
SDValue FIPtr2 = DAG.getFrameIndex(FI2, getPointerTy());
|
||||
SDValue FIPtr2 = DAG.getFrameIndex(FI2, PtrVT);
|
||||
|
||||
SDValue LoVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr2,
|
||||
MachinePointerInfo(),
|
||||
@ -460,7 +462,7 @@ LowerFormalArguments_32(SDValue Chain,
|
||||
int FI = MF.getFrameInfo()->CreateFixedObject(4,
|
||||
Offset,
|
||||
true);
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
|
||||
SDValue Load ;
|
||||
if (VA.getValVT() == MVT::i32 || VA.getValVT() == MVT::f32) {
|
||||
Load = DAG.getLoad(VA.getValVT(), dl, Chain, FIPtr,
|
||||
@ -607,10 +609,10 @@ LowerFormalArguments_64(SDValue Chain,
|
||||
if (VA.isExtInLoc())
|
||||
Offset += 8 - ValSize;
|
||||
int FI = MF.getFrameInfo()->CreateFixedObject(ValSize, Offset, true);
|
||||
InVals.push_back(DAG.getLoad(VA.getValVT(), DL, Chain,
|
||||
DAG.getFrameIndex(FI, getPointerTy()),
|
||||
MachinePointerInfo::getFixedStack(FI),
|
||||
false, false, false, 0));
|
||||
InVals.push_back(DAG.getLoad(
|
||||
VA.getValVT(), DL, Chain,
|
||||
DAG.getFrameIndex(FI, getPointerTy(MF.getDataLayout())),
|
||||
MachinePointerInfo::getFixedStack(FI), false, false, false, 0));
|
||||
}
|
||||
|
||||
if (!IsVarArg)
|
||||
@ -637,10 +639,10 @@ LowerFormalArguments_64(SDValue Chain,
|
||||
unsigned VReg = MF.addLiveIn(SP::I0 + ArgOffset/8, &SP::I64RegsRegClass);
|
||||
SDValue VArg = DAG.getCopyFromReg(Chain, DL, VReg, MVT::i64);
|
||||
int FI = MF.getFrameInfo()->CreateFixedObject(8, ArgOffset + ArgArea, true);
|
||||
OutChains.push_back(DAG.getStore(Chain, DL, VArg,
|
||||
DAG.getFrameIndex(FI, getPointerTy()),
|
||||
MachinePointerInfo::getFixedStack(FI),
|
||||
false, false, 0));
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
OutChains.push_back(
|
||||
DAG.getStore(Chain, DL, VArg, DAG.getFrameIndex(FI, PtrVT),
|
||||
MachinePointerInfo::getFixedStack(FI), false, false, 0));
|
||||
}
|
||||
|
||||
if (!OutChains.empty())
|
||||
@ -722,7 +724,7 @@ SparcTargetLowering::LowerCall_32(TargetLowering::CallLoweringInfo &CLI,
|
||||
unsigned Align = Flags.getByValAlign();
|
||||
|
||||
int FI = MFI->CreateStackObject(Size, Align, false);
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
SDValue SizeNode = DAG.getConstant(Size, dl, MVT::i32);
|
||||
|
||||
Chain = DAG.getMemcpy(Chain, dl, FIPtr, Arg, SizeNode, Align,
|
||||
@ -1057,6 +1059,7 @@ SparcTargetLowering::LowerCall_64(TargetLowering::CallLoweringInfo &CLI,
|
||||
SelectionDAG &DAG = CLI.DAG;
|
||||
SDLoc DL = CLI.DL;
|
||||
SDValue Chain = CLI.Chain;
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Sparc target does not yet support tail call optimization.
|
||||
CLI.IsTailCall = false;
|
||||
@ -1130,13 +1133,11 @@ SparcTargetLowering::LowerCall_64(TargetLowering::CallLoweringInfo &CLI,
|
||||
// Store and reload into the interger register reg and reg+1.
|
||||
unsigned Offset = 8 * (VA.getLocReg() - SP::I0);
|
||||
unsigned StackOffset = Offset + Subtarget->getStackPointerBias() + 128;
|
||||
SDValue StackPtr = DAG.getRegister(SP::O6, getPointerTy());
|
||||
SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
|
||||
SDValue HiPtrOff = DAG.getIntPtrConstant(StackOffset, DL);
|
||||
HiPtrOff = DAG.getNode(ISD::ADD, DL, getPointerTy(), StackPtr,
|
||||
HiPtrOff);
|
||||
HiPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, HiPtrOff);
|
||||
SDValue LoPtrOff = DAG.getIntPtrConstant(StackOffset + 8, DL);
|
||||
LoPtrOff = DAG.getNode(ISD::ADD, DL, getPointerTy(), StackPtr,
|
||||
LoPtrOff);
|
||||
LoPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, LoPtrOff);
|
||||
|
||||
// Store to %sp+BIAS+128+Offset
|
||||
SDValue Store = DAG.getStore(Chain, DL, Arg, HiPtrOff,
|
||||
@ -1180,13 +1181,13 @@ SparcTargetLowering::LowerCall_64(TargetLowering::CallLoweringInfo &CLI,
|
||||
assert(VA.isMemLoc());
|
||||
|
||||
// Create a store off the stack pointer for this argument.
|
||||
SDValue StackPtr = DAG.getRegister(SP::O6, getPointerTy());
|
||||
SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
|
||||
// The argument area starts at %fp+BIAS+128 in the callee frame,
|
||||
// %sp+BIAS+128 in ours.
|
||||
SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset() +
|
||||
Subtarget->getStackPointerBias() +
|
||||
128, DL);
|
||||
PtrOff = DAG.getNode(ISD::ADD, DL, getPointerTy(), StackPtr, PtrOff);
|
||||
PtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, PtrOff);
|
||||
MemOpChains.push_back(DAG.getStore(Chain, DL, Arg, PtrOff,
|
||||
MachinePointerInfo(),
|
||||
false, false, 0));
|
||||
@ -1215,10 +1216,9 @@ SparcTargetLowering::LowerCall_64(TargetLowering::CallLoweringInfo &CLI,
|
||||
unsigned TF = ((getTargetMachine().getRelocationModel() == Reloc::PIC_)
|
||||
? SparcMCExpr::VK_Sparc_WPLT30 : 0);
|
||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, getPointerTy(), 0,
|
||||
TF);
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVT, 0, TF);
|
||||
else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee))
|
||||
Callee = DAG.getTargetExternalSymbol(E->getSymbol(), getPointerTy(), TF);
|
||||
Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT, TF);
|
||||
|
||||
// Build the operands for the call instruction itself.
|
||||
SmallVector<SDValue, 8> Ops;
|
||||
@ -1370,6 +1370,8 @@ static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC) {
|
||||
SparcTargetLowering::SparcTargetLowering(TargetMachine &TM,
|
||||
const SparcSubtarget &STI)
|
||||
: TargetLowering(TM), Subtarget(&STI) {
|
||||
auto &DL = *TM.getDataLayout();
|
||||
|
||||
// Set up the register classes.
|
||||
addRegisterClass(MVT::i32, &SP::IntRegsRegClass);
|
||||
addRegisterClass(MVT::f32, &SP::FPRegsRegClass);
|
||||
@ -1394,10 +1396,10 @@ SparcTargetLowering::SparcTargetLowering(TargetMachine &TM,
|
||||
setTruncStoreAction(MVT::f128, MVT::f64, Expand);
|
||||
|
||||
// Custom legalize GlobalAddress nodes into LO/HI parts.
|
||||
setOperationAction(ISD::GlobalAddress, getPointerTy(), Custom);
|
||||
setOperationAction(ISD::GlobalTLSAddress, getPointerTy(), Custom);
|
||||
setOperationAction(ISD::ConstantPool, getPointerTy(), Custom);
|
||||
setOperationAction(ISD::BlockAddress, getPointerTy(), Custom);
|
||||
setOperationAction(ISD::GlobalAddress, getPointerTy(DL), Custom);
|
||||
setOperationAction(ISD::GlobalTLSAddress, getPointerTy(DL), Custom);
|
||||
setOperationAction(ISD::ConstantPool, getPointerTy(DL), Custom);
|
||||
setOperationAction(ISD::BlockAddress, getPointerTy(DL), Custom);
|
||||
|
||||
// Sparc doesn't have sext_inreg, replace them with shl/sra
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Expand);
|
||||
@ -1704,7 +1706,8 @@ const char *SparcTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
EVT SparcTargetLowering::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
EVT SparcTargetLowering::getSetCCResultType(const DataLayout &, LLVMContext &,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return MVT::i32;
|
||||
return VT.changeVectorElementTypeToInteger();
|
||||
@ -1804,7 +1807,7 @@ SDValue SparcTargetLowering::makeHiLoPair(SDValue Op,
|
||||
// or ExternalSymbol SDNode.
|
||||
SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDLoc DL(Op);
|
||||
EVT VT = getPointerTy();
|
||||
EVT VT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Handle PIC mode first.
|
||||
if (getTargetMachine().getRelocationModel() == Reloc::PIC_) {
|
||||
@ -1871,7 +1874,7 @@ SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op,
|
||||
GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
|
||||
SDLoc DL(GA);
|
||||
const GlobalValue *GV = GA->getGlobal();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
TLSModel::Model model = getTargetMachine().getTLSModel(GV);
|
||||
|
||||
@ -1983,7 +1986,7 @@ SparcTargetLowering::LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args,
|
||||
if (ArgTy->isFP128Ty()) {
|
||||
// Create a stack object and pass the pointer to the library function.
|
||||
int FI = MFI->CreateStackObject(16, 8, false);
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
Chain = DAG.getStore(Chain,
|
||||
DL,
|
||||
Entry.Node,
|
||||
@ -2008,8 +2011,9 @@ SparcTargetLowering::LowerF128Op(SDValue Op, SelectionDAG &DAG,
|
||||
ArgListTy Args;
|
||||
|
||||
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
SDValue Callee = DAG.getExternalSymbol(LibFuncName, getPointerTy());
|
||||
SDValue Callee = DAG.getExternalSymbol(LibFuncName, PtrVT);
|
||||
Type *RetTy = Op.getValueType().getTypeForEVT(*DAG.getContext());
|
||||
Type *RetTyABI = RetTy;
|
||||
SDValue Chain = DAG.getEntryNode();
|
||||
@ -2019,7 +2023,7 @@ SparcTargetLowering::LowerF128Op(SDValue Op, SelectionDAG &DAG,
|
||||
// Create a Stack Object to receive the return value of type f128.
|
||||
ArgListEntry Entry;
|
||||
int RetFI = MFI->CreateStackObject(16, 8, false);
|
||||
RetPtr = DAG.getFrameIndex(RetFI, getPointerTy());
|
||||
RetPtr = DAG.getFrameIndex(RetFI, PtrVT);
|
||||
Entry.Node = RetPtr;
|
||||
Entry.Ty = PointerType::getUnqual(RetTy);
|
||||
if (!Subtarget->is64Bit())
|
||||
@ -2082,7 +2086,8 @@ SparcTargetLowering::LowerF128Compare(SDValue LHS, SDValue RHS,
|
||||
case SPCC::FCC_UE : LibCall = is64Bit? "_Qp_cmp" : "_Q_cmp"; break;
|
||||
}
|
||||
|
||||
SDValue Callee = DAG.getExternalSymbol(LibCall, getPointerTy());
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Callee = DAG.getExternalSymbol(LibCall, PtrVT);
|
||||
Type *RetTy = Type::getInt32Ty(*DAG.getContext());
|
||||
ArgListTy Args;
|
||||
SDValue Chain = DAG.getEntryNode();
|
||||
@ -2362,6 +2367,7 @@ static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
const SparcTargetLowering &TLI) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
SparcMachineFunctionInfo *FuncInfo = MF.getInfo<SparcMachineFunctionInfo>();
|
||||
auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// Need frame address to find the address of VarArgsFrameIndex.
|
||||
MF.getFrameInfo()->setFrameAddressIsTaken(true);
|
||||
@ -2370,9 +2376,8 @@ static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
// memory location argument.
|
||||
SDLoc DL(Op);
|
||||
SDValue Offset =
|
||||
DAG.getNode(ISD::ADD, DL, TLI.getPointerTy(),
|
||||
DAG.getRegister(SP::I6, TLI.getPointerTy()),
|
||||
DAG.getIntPtrConstant(FuncInfo->getVarArgsFrameOffset(), DL));
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT, DAG.getRegister(SP::I6, PtrVT),
|
||||
DAG.getIntPtrConstant(FuncInfo->getVarArgsFrameOffset(), DL));
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
return DAG.getStore(Op.getOperand(0), DL, Offset, Op.getOperand(1),
|
||||
MachinePointerInfo(SV), false, false, 0);
|
||||
@ -2497,8 +2502,8 @@ static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG,
|
||||
|
||||
SDValue RetAddr;
|
||||
if (depth == 0) {
|
||||
unsigned RetReg = MF.addLiveIn(SP::I7,
|
||||
TLI.getRegClassFor(TLI.getPointerTy()));
|
||||
auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
unsigned RetReg = MF.addLiveIn(SP::I7, TLI.getRegClassFor(PtrVT));
|
||||
RetAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, RetReg, VT);
|
||||
return RetAddr;
|
||||
}
|
||||
|
@ -88,7 +88,8 @@ namespace llvm {
|
||||
MVT getScalarShiftAmountTy(EVT LHSTy) const override { return MVT::i32; }
|
||||
|
||||
/// getSetCCResultType - Return the ISD::SETCC ValueType
|
||||
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const override;
|
||||
|
||||
SDValue
|
||||
LowerFormalArguments(SDValue Chain,
|
||||
|
@ -81,10 +81,11 @@ static MachineOperand earlyUseOperand(MachineOperand Op) {
|
||||
return Op;
|
||||
}
|
||||
|
||||
SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &tm,
|
||||
SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
|
||||
const SystemZSubtarget &STI)
|
||||
: TargetLowering(tm), Subtarget(STI) {
|
||||
MVT PtrVT = getPointerTy();
|
||||
: TargetLowering(TM), Subtarget(STI) {
|
||||
auto &DL = *TM.getDataLayout();
|
||||
MVT PtrVT = getPointerTy(DL);
|
||||
|
||||
// Set up the register classes.
|
||||
if (Subtarget.hasHighWord())
|
||||
@ -455,7 +456,8 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &tm,
|
||||
MaxStoresPerMemsetOptSize = 0;
|
||||
}
|
||||
|
||||
EVT SystemZTargetLowering::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
EVT SystemZTargetLowering::getSetCCResultType(const DataLayout &DL,
|
||||
LLVMContext &, EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return MVT::i32;
|
||||
return VT.changeVectorElementTypeToInteger();
|
||||
@ -931,7 +933,7 @@ LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
|
||||
// Create the SelectionDAG nodes corresponding to a load
|
||||
// from this parameter. Unpromoted ints and floats are
|
||||
// passed as right-justified 8-byte values.
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
|
||||
if (VA.getLocVT() == MVT::i32 || VA.getLocVT() == MVT::f32)
|
||||
FIN = DAG.getNode(ISD::ADD, DL, PtrVT, FIN,
|
||||
@ -969,7 +971,7 @@ LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
|
||||
for (unsigned I = NumFixedFPRs; I < SystemZ::NumArgFPRs; ++I) {
|
||||
unsigned Offset = TFL->getRegSpillOffset(SystemZ::ArgFPRs[I]);
|
||||
int FI = MFI->CreateFixedObject(8, RegSaveOffset + Offset, true);
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
unsigned VReg = MF.addLiveIn(SystemZ::ArgFPRs[I],
|
||||
&SystemZ::FP64BitRegClass);
|
||||
SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, VReg, MVT::f64);
|
||||
@ -1019,7 +1021,7 @@ SystemZTargetLowering::LowerCall(CallLoweringInfo &CLI,
|
||||
CallingConv::ID CallConv = CLI.CallConv;
|
||||
bool IsVarArg = CLI.IsVarArg;
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(MF.getDataLayout());
|
||||
|
||||
// Detect unsupported vector argument and return types.
|
||||
if (Subtarget.hasVector()) {
|
||||
@ -2401,7 +2403,7 @@ SDValue SystemZTargetLowering::lowerGlobalAddress(GlobalAddressSDNode *Node,
|
||||
SDLoc DL(Node);
|
||||
const GlobalValue *GV = Node->getGlobal();
|
||||
int64_t Offset = Node->getOffset();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
Reloc::Model RM = DAG.getTarget().getRelocationModel();
|
||||
CodeModel::Model CM = DAG.getTarget().getCodeModel();
|
||||
|
||||
@ -2440,7 +2442,7 @@ SDValue SystemZTargetLowering::lowerTLSGetOffset(GlobalAddressSDNode *Node,
|
||||
unsigned Opcode,
|
||||
SDValue GOTOffset) const {
|
||||
SDLoc DL(Node);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Chain = DAG.getEntryNode();
|
||||
SDValue Glue;
|
||||
|
||||
@ -2486,7 +2488,7 @@ SDValue SystemZTargetLowering::lowerGlobalTLSAddress(GlobalAddressSDNode *Node,
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc DL(Node);
|
||||
const GlobalValue *GV = Node->getGlobal();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
TLSModel::Model model = DAG.getTarget().getTLSModel(GV);
|
||||
|
||||
// The high part of the thread pointer is in access register 0.
|
||||
@ -2587,7 +2589,7 @@ SDValue SystemZTargetLowering::lowerBlockAddress(BlockAddressSDNode *Node,
|
||||
SDLoc DL(Node);
|
||||
const BlockAddress *BA = Node->getBlockAddress();
|
||||
int64_t Offset = Node->getOffset();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT, Offset);
|
||||
Result = DAG.getNode(SystemZISD::PCREL_WRAPPER, DL, PtrVT, Result);
|
||||
@ -2597,7 +2599,7 @@ SDValue SystemZTargetLowering::lowerBlockAddress(BlockAddressSDNode *Node,
|
||||
SDValue SystemZTargetLowering::lowerJumpTable(JumpTableSDNode *JT,
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc DL(JT);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT);
|
||||
|
||||
// Use LARL to load the address of the table.
|
||||
@ -2607,7 +2609,7 @@ SDValue SystemZTargetLowering::lowerJumpTable(JumpTableSDNode *JT,
|
||||
SDValue SystemZTargetLowering::lowerConstantPool(ConstantPoolSDNode *CP,
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc DL(CP);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
SDValue Result;
|
||||
if (CP->isMachineConstantPoolEntry())
|
||||
@ -2671,7 +2673,7 @@ SDValue SystemZTargetLowering::lowerVASTART(SDValue Op,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
SystemZMachineFunctionInfo *FuncInfo =
|
||||
MF.getInfo<SystemZMachineFunctionInfo>();
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
SDValue Chain = Op.getOperand(0);
|
||||
SDValue Addr = Op.getOperand(1);
|
||||
|
@ -342,7 +342,7 @@ public:
|
||||
MVT getScalarShiftAmountTy(EVT LHSTy) const override {
|
||||
return MVT::i32;
|
||||
}
|
||||
MVT getVectorIdxTy() const override {
|
||||
MVT getVectorIdxTy(const DataLayout &DL) const override {
|
||||
// Only the lower 12 bits of an element index are used, so we don't
|
||||
// want to clobber the upper 32 bits of a GPR unnecessarily.
|
||||
return MVT::i32;
|
||||
@ -364,7 +364,8 @@ public:
|
||||
return TypeWidenVector;
|
||||
return TargetLoweringBase::getPreferredVectorAction(VT);
|
||||
}
|
||||
EVT getSetCCResultType(LLVMContext &, EVT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
||||
EVT) const override;
|
||||
bool isFMAFasterThanFMulAndFAdd(EVT VT) const override;
|
||||
bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
|
||||
bool isLegalICmpImmediate(int64_t Imm) const override;
|
||||
|
@ -317,7 +317,7 @@ bool X86FastISel::foldX86XALUIntrinsic(X86::CondCode &CC, const Instruction *I,
|
||||
}
|
||||
|
||||
bool X86FastISel::isTypeLegal(Type *Ty, MVT &VT, bool AllowI1) {
|
||||
EVT evt = TLI.getValueType(Ty, /*HandleUnknown=*/true);
|
||||
EVT evt = TLI.getValueType(DL, Ty, /*HandleUnknown=*/true);
|
||||
if (evt == MVT::Other || !evt.isSimple())
|
||||
// Unhandled type. Halt "fast" selection and bail.
|
||||
return false;
|
||||
@ -608,7 +608,7 @@ bool X86FastISel::handleConstantAddresses(const Value *V, X86AddressMode &AM) {
|
||||
// Prepare for inserting code in the local-value area.
|
||||
SavePoint SaveInsertPt = enterLocalValueArea();
|
||||
|
||||
if (TLI.getPointerTy() == MVT::i64) {
|
||||
if (TLI.getPointerTy(DL) == MVT::i64) {
|
||||
Opc = X86::MOV64rm;
|
||||
RC = &X86::GR64RegClass;
|
||||
|
||||
@ -690,13 +690,14 @@ redo_gep:
|
||||
|
||||
case Instruction::IntToPtr:
|
||||
// Look past no-op inttoptrs.
|
||||
if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(DL))
|
||||
return X86SelectAddress(U->getOperand(0), AM);
|
||||
break;
|
||||
|
||||
case Instruction::PtrToInt:
|
||||
// Look past no-op ptrtoints.
|
||||
if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
|
||||
if (TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
|
||||
return X86SelectAddress(U->getOperand(0), AM);
|
||||
break;
|
||||
|
||||
@ -866,14 +867,14 @@ bool X86FastISel::X86SelectCallAddress(const Value *V, X86AddressMode &AM) {
|
||||
case Instruction::IntToPtr:
|
||||
// Look past no-op inttoptrs if its operand is in the same BB.
|
||||
if (InMBB &&
|
||||
TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
|
||||
TLI.getValueType(DL, U->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(DL))
|
||||
return X86SelectCallAddress(U->getOperand(0), AM);
|
||||
break;
|
||||
|
||||
case Instruction::PtrToInt:
|
||||
// Look past no-op ptrtoints if its operand is in the same BB.
|
||||
if (InMBB &&
|
||||
TLI.getValueType(U->getType()) == TLI.getPointerTy())
|
||||
if (InMBB && TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
|
||||
return X86SelectCallAddress(U->getOperand(0), AM);
|
||||
break;
|
||||
}
|
||||
@ -1000,8 +1001,7 @@ bool X86FastISel::X86SelectRet(const Instruction *I) {
|
||||
|
||||
if (Ret->getNumOperands() > 0) {
|
||||
SmallVector<ISD::OutputArg, 4> Outs;
|
||||
GetReturnInfo(F.getReturnType(), F.getAttributes(), Outs, TLI,
|
||||
MF->getDataLayout());
|
||||
GetReturnInfo(F.getReturnType(), F.getAttributes(), Outs, TLI, DL);
|
||||
|
||||
// Analyze operands of the call, assigning locations to each operand.
|
||||
SmallVector<CCValAssign, 16> ValLocs;
|
||||
@ -1032,7 +1032,7 @@ bool X86FastISel::X86SelectRet(const Instruction *I) {
|
||||
return false;
|
||||
|
||||
unsigned SrcReg = Reg + VA.getValNo();
|
||||
EVT SrcVT = TLI.getValueType(RV->getType());
|
||||
EVT SrcVT = TLI.getValueType(DL, RV->getType());
|
||||
EVT DstVT = VA.getValVT();
|
||||
// Special handling for extended integers.
|
||||
if (SrcVT != DstVT) {
|
||||
@ -1301,7 +1301,7 @@ bool X86FastISel::X86SelectCmp(const Instruction *I) {
|
||||
}
|
||||
|
||||
bool X86FastISel::X86SelectZExt(const Instruction *I) {
|
||||
EVT DstVT = TLI.getValueType(I->getType());
|
||||
EVT DstVT = TLI.getValueType(DL, I->getType());
|
||||
if (!TLI.isTypeLegal(DstVT))
|
||||
return false;
|
||||
|
||||
@ -1310,7 +1310,7 @@ bool X86FastISel::X86SelectZExt(const Instruction *I) {
|
||||
return false;
|
||||
|
||||
// Handle zero-extension from i1 to i8, which is common.
|
||||
MVT SrcVT = TLI.getSimpleValueType(I->getOperand(0)->getType());
|
||||
MVT SrcVT = TLI.getSimpleValueType(DL, I->getOperand(0)->getType());
|
||||
if (SrcVT.SimpleTy == MVT::i1) {
|
||||
// Set the high bits to zero.
|
||||
ResultReg = fastEmitZExtFromI1(MVT::i8, ResultReg, /*TODO: Kill=*/false);
|
||||
@ -1363,7 +1363,7 @@ bool X86FastISel::X86SelectBranch(const Instruction *I) {
|
||||
X86::CondCode CC;
|
||||
if (const CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition())) {
|
||||
if (CI->hasOneUse() && CI->getParent() == I->getParent()) {
|
||||
EVT VT = TLI.getValueType(CI->getOperand(0)->getType());
|
||||
EVT VT = TLI.getValueType(DL, CI->getOperand(0)->getType());
|
||||
|
||||
// Try to optimize or fold the cmp.
|
||||
CmpInst::Predicate Predicate = optimizeCmpPredicate(CI);
|
||||
@ -1803,7 +1803,7 @@ bool X86FastISel::X86FastEmitCMoveSelect(MVT RetVT, const Instruction *I) {
|
||||
if (NeedSwap)
|
||||
std::swap(CmpLHS, CmpRHS);
|
||||
|
||||
EVT CmpVT = TLI.getValueType(CmpLHS->getType());
|
||||
EVT CmpVT = TLI.getValueType(DL, CmpLHS->getType());
|
||||
// Emit a compare of the LHS and RHS, setting the flags.
|
||||
if (!X86FastEmitCompare(CmpLHS, CmpRHS, CmpVT, CI->getDebugLoc()))
|
||||
return false;
|
||||
@ -2005,7 +2005,7 @@ bool X86FastISel::X86FastEmitPseudoSelect(MVT RetVT, const Instruction *I) {
|
||||
if (NeedSwap)
|
||||
std::swap(CmpLHS, CmpRHS);
|
||||
|
||||
EVT CmpVT = TLI.getValueType(CmpLHS->getType());
|
||||
EVT CmpVT = TLI.getValueType(DL, CmpLHS->getType());
|
||||
if (!X86FastEmitCompare(CmpLHS, CmpRHS, CmpVT, CI->getDebugLoc()))
|
||||
return false;
|
||||
} else {
|
||||
@ -2167,8 +2167,8 @@ bool X86FastISel::X86SelectFPTrunc(const Instruction *I) {
|
||||
}
|
||||
|
||||
bool X86FastISel::X86SelectTrunc(const Instruction *I) {
|
||||
EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(I->getType());
|
||||
EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(DL, I->getType());
|
||||
|
||||
// This code only handles truncation to byte.
|
||||
if (DstVT != MVT::i8 && DstVT != MVT::i1)
|
||||
@ -2417,7 +2417,7 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
|
||||
}
|
||||
case Intrinsic::stackprotector: {
|
||||
// Emit code to store the stack guard onto the stack.
|
||||
EVT PtrTy = TLI.getPointerTy();
|
||||
EVT PtrTy = TLI.getPointerTy(DL);
|
||||
|
||||
const Value *Op1 = II->getArgOperand(0); // The guard's value.
|
||||
const AllocaInst *Slot = cast<AllocaInst>(II->getArgOperand(1));
|
||||
@ -2736,7 +2736,7 @@ bool X86FastISel::fastLowerArguments() {
|
||||
if (ArgTy->isStructTy() || ArgTy->isArrayTy() || ArgTy->isVectorTy())
|
||||
return false;
|
||||
|
||||
EVT ArgVT = TLI.getValueType(ArgTy);
|
||||
EVT ArgVT = TLI.getValueType(DL, ArgTy);
|
||||
if (!ArgVT.isSimple()) return false;
|
||||
switch (ArgVT.getSimpleVT().SimpleTy) {
|
||||
default: return false;
|
||||
@ -2773,7 +2773,7 @@ bool X86FastISel::fastLowerArguments() {
|
||||
unsigned GPRIdx = 0;
|
||||
unsigned FPRIdx = 0;
|
||||
for (auto const &Arg : F->args()) {
|
||||
MVT VT = TLI.getSimpleValueType(Arg.getType());
|
||||
MVT VT = TLI.getSimpleValueType(DL, Arg.getType());
|
||||
const TargetRegisterClass *RC = TLI.getRegClassFor(VT);
|
||||
unsigned SrcReg;
|
||||
switch (VT.SimpleTy) {
|
||||
@ -3241,8 +3241,8 @@ X86FastISel::fastSelectInstruction(const Instruction *I) {
|
||||
return X86SelectSIToFP(I);
|
||||
case Instruction::IntToPtr: // Deliberate fall-through.
|
||||
case Instruction::PtrToInt: {
|
||||
EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(I->getType());
|
||||
EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(DL, I->getType());
|
||||
if (DstVT.bitsGT(SrcVT))
|
||||
return X86SelectZExt(I);
|
||||
if (DstVT.bitsLT(SrcVT))
|
||||
@ -3385,7 +3385,7 @@ unsigned X86FastISel::X86MaterializeFP(const ConstantFP *CFP, MVT VT) {
|
||||
addDirectMem(MIB, AddrReg);
|
||||
MachineMemOperand *MMO = FuncInfo.MF->getMachineMemOperand(
|
||||
MachinePointerInfo::getConstantPool(), MachineMemOperand::MOLoad,
|
||||
TM.getDataLayout()->getPointerSize(), Align);
|
||||
DL.getPointerSize(), Align);
|
||||
MIB->addMemOperand(*FuncInfo.MF, MMO);
|
||||
return ResultReg;
|
||||
}
|
||||
@ -3412,17 +3412,17 @@ unsigned X86FastISel::X86MaterializeGV(const GlobalValue *GV, MVT VT) {
|
||||
|
||||
unsigned ResultReg = createResultReg(TLI.getRegClassFor(VT));
|
||||
if (TM.getRelocationModel() == Reloc::Static &&
|
||||
TLI.getPointerTy() == MVT::i64) {
|
||||
TLI.getPointerTy(DL) == MVT::i64) {
|
||||
// The displacement code could be more than 32 bits away so we need to use
|
||||
// an instruction with a 64 bit immediate
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(X86::MOV64ri),
|
||||
ResultReg)
|
||||
.addGlobalAddress(GV);
|
||||
} else {
|
||||
unsigned Opc = TLI.getPointerTy() == MVT::i32
|
||||
? (Subtarget->isTarget64BitILP32()
|
||||
? X86::LEA64_32r : X86::LEA32r)
|
||||
: X86::LEA64r;
|
||||
unsigned Opc =
|
||||
TLI.getPointerTy(DL) == MVT::i32
|
||||
? (Subtarget->isTarget64BitILP32() ? X86::LEA64_32r : X86::LEA32r)
|
||||
: X86::LEA64r;
|
||||
addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||
TII.get(Opc), ResultReg), AM);
|
||||
}
|
||||
@ -3432,7 +3432,7 @@ unsigned X86FastISel::X86MaterializeGV(const GlobalValue *GV, MVT VT) {
|
||||
}
|
||||
|
||||
unsigned X86FastISel::fastMaterializeConstant(const Constant *C) {
|
||||
EVT CEVT = TLI.getValueType(C->getType(), true);
|
||||
EVT CEVT = TLI.getValueType(DL, C->getType(), true);
|
||||
|
||||
// Only handle simple types.
|
||||
if (!CEVT.isSimple())
|
||||
@ -3464,11 +3464,11 @@ unsigned X86FastISel::fastMaterializeAlloca(const AllocaInst *C) {
|
||||
X86AddressMode AM;
|
||||
if (!X86SelectAddress(C, AM))
|
||||
return 0;
|
||||
unsigned Opc = TLI.getPointerTy() == MVT::i32
|
||||
? (Subtarget->isTarget64BitILP32()
|
||||
? X86::LEA64_32r : X86::LEA32r)
|
||||
: X86::LEA64r;
|
||||
const TargetRegisterClass* RC = TLI.getRegClassFor(TLI.getPointerTy());
|
||||
unsigned Opc =
|
||||
TLI.getPointerTy(DL) == MVT::i32
|
||||
? (Subtarget->isTarget64BitILP32() ? X86::LEA64_32r : X86::LEA32r)
|
||||
: X86::LEA64r;
|
||||
const TargetRegisterClass *RC = TLI.getRegClassFor(TLI.getPointerTy(DL));
|
||||
unsigned ResultReg = createResultReg(RC);
|
||||
addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||
TII.get(Opc), ResultReg), AM);
|
||||
|
@ -246,8 +246,9 @@ namespace {
|
||||
SDValue &Index, SDValue &Disp,
|
||||
SDValue &Segment) {
|
||||
Base = (AM.BaseType == X86ISelAddressMode::FrameIndexBase)
|
||||
? CurDAG->getTargetFrameIndex(AM.Base_FrameIndex,
|
||||
TLI->getPointerTy())
|
||||
? CurDAG->getTargetFrameIndex(
|
||||
AM.Base_FrameIndex,
|
||||
TLI->getPointerTy(CurDAG->getDataLayout()))
|
||||
: AM.Base_Reg;
|
||||
Scale = getI8Imm(AM.Scale, DL);
|
||||
Index = AM.IndexReg;
|
||||
@ -581,11 +582,12 @@ void X86DAGToDAGISel::PreprocessISelDAG() {
|
||||
void X86DAGToDAGISel::EmitSpecialCodeForMain() {
|
||||
if (Subtarget->isTargetCygMing()) {
|
||||
TargetLowering::ArgListTy Args;
|
||||
auto &DL = CurDAG->getDataLayout();
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(*CurDAG);
|
||||
CLI.setChain(CurDAG->getRoot())
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*CurDAG->getContext()),
|
||||
CurDAG->getExternalSymbol("__main", TLI->getPointerTy()),
|
||||
CurDAG->getExternalSymbol("__main", TLI->getPointerTy(DL)),
|
||||
std::move(Args), 0);
|
||||
const TargetLowering &TLI = CurDAG->getTargetLoweringInfo();
|
||||
std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
|
||||
@ -1638,7 +1640,8 @@ bool X86DAGToDAGISel::TryFoldLoad(SDNode *P, SDValue N,
|
||||
///
|
||||
SDNode *X86DAGToDAGISel::getGlobalBaseReg() {
|
||||
unsigned GlobalBaseReg = getInstrInfo()->getGlobalBaseReg(MF);
|
||||
return CurDAG->getRegister(GlobalBaseReg, TLI->getPointerTy()).getNode();
|
||||
auto &DL = MF->getDataLayout();
|
||||
return CurDAG->getRegister(GlobalBaseReg, TLI->getPointerTy(DL)).getNode();
|
||||
}
|
||||
|
||||
/// Atomic opcode table
|
||||
|
@ -76,7 +76,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
||||
: TargetLowering(TM), Subtarget(&STI) {
|
||||
X86ScalarSSEf64 = Subtarget->hasSSE2();
|
||||
X86ScalarSSEf32 = Subtarget->hasSSE1();
|
||||
TD = getDataLayout();
|
||||
TD = TM.getDataLayout();
|
||||
|
||||
// Set up the TargetLowering object.
|
||||
static const MVT IntVTs[] = { MVT::i8, MVT::i16, MVT::i32, MVT::i64 };
|
||||
@ -505,7 +505,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
||||
setOperationAction(ISD::STACKSAVE, MVT::Other, Expand);
|
||||
setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
|
||||
|
||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, getPointerTy(), Custom);
|
||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, getPointerTy(*TD), Custom);
|
||||
|
||||
// GC_TRANSITION_START and GC_TRANSITION_END need custom lowering.
|
||||
setOperationAction(ISD::GC_TRANSITION_START, MVT::Other, Custom);
|
||||
@ -1711,7 +1711,8 @@ X86TargetLowering::getPreferredVectorAction(EVT VT) const {
|
||||
return TargetLoweringBase::getPreferredVectorAction(VT);
|
||||
}
|
||||
|
||||
EVT X86TargetLowering::getSetCCResultType(LLVMContext &, EVT VT) const {
|
||||
EVT X86TargetLowering::getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
||||
EVT VT) const {
|
||||
if (!VT.isVector())
|
||||
return Subtarget->hasAVX512() ? MVT::i1: MVT::i8;
|
||||
|
||||
@ -1899,7 +1900,8 @@ SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
|
||||
if (!Subtarget->is64Bit())
|
||||
// This doesn't have SDLoc associated with it, but is not really the
|
||||
// same as a Register.
|
||||
return DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), getPointerTy());
|
||||
return DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(),
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
return Table;
|
||||
}
|
||||
|
||||
@ -2091,7 +2093,8 @@ X86TargetLowering::LowerReturn(SDValue Chain,
|
||||
// false, then an sret argument may be implicitly inserted in the SelDAG. In
|
||||
// either case FuncInfo->setSRetReturnReg() will have been called.
|
||||
if (unsigned SRetReg = FuncInfo->getSRetReturnReg()) {
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, dl, SRetReg, getPointerTy());
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, dl, SRetReg,
|
||||
getPointerTy(MF.getDataLayout()));
|
||||
|
||||
unsigned RetValReg
|
||||
= (Subtarget->is64Bit() && !Subtarget->isTarget64BitILP32()) ?
|
||||
@ -2100,7 +2103,8 @@ X86TargetLowering::LowerReturn(SDValue Chain,
|
||||
Flag = Chain.getValue(1);
|
||||
|
||||
// RAX/EAX now acts like a return value.
|
||||
RetOps.push_back(DAG.getRegister(RetValReg, getPointerTy()));
|
||||
RetOps.push_back(
|
||||
DAG.getRegister(RetValReg, getPointerTy(DAG.getDataLayout())));
|
||||
}
|
||||
|
||||
RetOps[0] = Chain; // Update chain.
|
||||
@ -2347,11 +2351,11 @@ X86TargetLowering::LowerMemArgument(SDValue Chain,
|
||||
unsigned Bytes = Flags.getByValSize();
|
||||
if (Bytes == 0) Bytes = 1; // Don't create zero-sized stack objects.
|
||||
int FI = MFI->CreateFixedObject(Bytes, VA.getLocMemOffset(), isImmutable);
|
||||
return DAG.getFrameIndex(FI, getPointerTy());
|
||||
return DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
} else {
|
||||
int FI = MFI->CreateFixedObject(ValVT.getSizeInBits()/8,
|
||||
VA.getLocMemOffset(), isImmutable);
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
SDValue Val = DAG.getLoad(ValVT, dl, Chain, FIN,
|
||||
MachinePointerInfo::getFixedStack(FI),
|
||||
false, false, false, 0);
|
||||
@ -2530,7 +2534,7 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
if (Ins[i].Flags.isSRet()) {
|
||||
unsigned Reg = FuncInfo->getSRetReturnReg();
|
||||
if (!Reg) {
|
||||
MVT PtrTy = getPointerTy();
|
||||
MVT PtrTy = getPointerTy(DAG.getDataLayout());
|
||||
Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(PtrTy));
|
||||
FuncInfo->setSRetReturnReg(Reg);
|
||||
}
|
||||
@ -2620,11 +2624,11 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
// Store the integer parameter registers.
|
||||
SmallVector<SDValue, 8> MemOps;
|
||||
SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
|
||||
getPointerTy());
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
unsigned Offset = FuncInfo->getVarArgsGPOffset();
|
||||
for (SDValue Val : LiveGPRs) {
|
||||
SDValue FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), RSFIN,
|
||||
DAG.getIntPtrConstant(Offset, dl));
|
||||
SDValue FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(DAG.getDataLayout()),
|
||||
RSFIN, DAG.getIntPtrConstant(Offset, dl));
|
||||
SDValue Store =
|
||||
DAG.getStore(Val.getValue(1), dl, Val, FIN,
|
||||
MachinePointerInfo::getFixedStack(
|
||||
@ -2664,8 +2668,8 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
|
||||
// Store the second integer parameter (rdx) into rsp+16 relative to the
|
||||
// stack pointer at the entry of the function.
|
||||
SDValue RSFIN =
|
||||
DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(), getPointerTy());
|
||||
SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
unsigned GPR = MF.addLiveIn(X86::RDX, &X86::GR64RegClass);
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, dl, GPR, MVT::i64);
|
||||
Chain = DAG.getStore(
|
||||
@ -2767,7 +2771,8 @@ X86TargetLowering::LowerMemOpCallTo(SDValue Chain,
|
||||
ISD::ArgFlagsTy Flags) const {
|
||||
unsigned LocMemOffset = VA.getLocMemOffset();
|
||||
SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);
|
||||
PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(DAG.getDataLayout()),
|
||||
StackPtr, PtrOff);
|
||||
if (Flags.isByVal())
|
||||
return CreateCopyOfByValArgument(Arg, PtrOff, Chain, Flags, DAG, dl);
|
||||
|
||||
@ -2784,7 +2789,7 @@ X86TargetLowering::EmitTailCallLoadRetAddr(SelectionDAG &DAG,
|
||||
bool IsTailCall, bool Is64Bit,
|
||||
int FPDiff, SDLoc dl) const {
|
||||
// Adjust the Return address stack slot.
|
||||
EVT VT = getPointerTy();
|
||||
EVT VT = getPointerTy(DAG.getDataLayout());
|
||||
OutRetAddr = getReturnAddressFrameIndex(DAG);
|
||||
|
||||
// Load the "old" Return address.
|
||||
@ -3008,7 +3013,7 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
assert(VA.isMemLoc());
|
||||
if (!StackPtr.getNode())
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl, RegInfo->getStackRegister(),
|
||||
getPointerTy());
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
MemOpChains.push_back(LowerMemOpCallTo(Chain, StackPtr, Arg,
|
||||
dl, DAG, VA, Flags));
|
||||
}
|
||||
@ -3021,8 +3026,9 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
// ELF / PIC requires GOT in the EBX register before function calls via PLT
|
||||
// GOT pointer.
|
||||
if (!isTailCall) {
|
||||
RegsToPass.push_back(std::make_pair(unsigned(X86::EBX),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), getPointerTy())));
|
||||
RegsToPass.push_back(std::make_pair(
|
||||
unsigned(X86::EBX), DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(),
|
||||
getPointerTy(DAG.getDataLayout()))));
|
||||
} else {
|
||||
// If we are tail calling and generating PIC/GOT style code load the
|
||||
// address of the callee into ECX. The value in ecx is used as target of
|
||||
@ -3102,16 +3108,16 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
int32_t Offset = VA.getLocMemOffset()+FPDiff;
|
||||
uint32_t OpSize = (VA.getLocVT().getSizeInBits()+7)/8;
|
||||
FI = MF.getFrameInfo()->CreateFixedObject(OpSize, Offset, true);
|
||||
FIN = DAG.getFrameIndex(FI, getPointerTy());
|
||||
FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
if (Flags.isByVal()) {
|
||||
// Copy relative to framepointer.
|
||||
SDValue Source = DAG.getIntPtrConstant(VA.getLocMemOffset(), dl);
|
||||
if (!StackPtr.getNode())
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl,
|
||||
RegInfo->getStackRegister(),
|
||||
getPointerTy());
|
||||
Source = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, Source);
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl, RegInfo->getStackRegister(),
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
Source = DAG.getNode(ISD::ADD, dl, getPointerTy(DAG.getDataLayout()),
|
||||
StackPtr, Source);
|
||||
|
||||
MemOpChains2.push_back(CreateCopyOfByValArgument(Source, FIN,
|
||||
ArgChain,
|
||||
@ -3130,8 +3136,8 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
|
||||
// Store the return address to the appropriate stack slot.
|
||||
Chain = EmitTailCallStoreRetAddr(DAG, MF, Chain, RetAddrFrIdx,
|
||||
getPointerTy(), RegInfo->getSlotSize(),
|
||||
FPDiff, dl);
|
||||
getPointerTy(DAG.getDataLayout()),
|
||||
RegInfo->getSlotSize(), FPDiff, dl);
|
||||
}
|
||||
|
||||
// Build a sequence of copy-to-reg nodes chained together with token chain
|
||||
@ -3189,17 +3195,18 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
ExtraLoad = true;
|
||||
}
|
||||
|
||||
Callee = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(),
|
||||
G->getOffset(), OpFlags);
|
||||
Callee = DAG.getTargetGlobalAddress(
|
||||
GV, dl, getPointerTy(DAG.getDataLayout()), G->getOffset(), OpFlags);
|
||||
|
||||
// Add a wrapper if needed.
|
||||
if (WrapperKind != ISD::DELETED_NODE)
|
||||
Callee = DAG.getNode(X86ISD::WrapperRIP, dl, getPointerTy(), Callee);
|
||||
Callee = DAG.getNode(X86ISD::WrapperRIP, dl,
|
||||
getPointerTy(DAG.getDataLayout()), Callee);
|
||||
// Add extra indirection if needed.
|
||||
if (ExtraLoad)
|
||||
Callee = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), Callee,
|
||||
MachinePointerInfo::getGOT(),
|
||||
false, false, false, 0);
|
||||
Callee = DAG.getLoad(
|
||||
getPointerTy(DAG.getDataLayout()), dl, DAG.getEntryNode(), Callee,
|
||||
MachinePointerInfo::getGOT(), false, false, false, 0);
|
||||
}
|
||||
} else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
unsigned char OpFlags = 0;
|
||||
@ -3218,8 +3225,8 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
OpFlags = X86II::MO_DARWIN_STUB;
|
||||
}
|
||||
|
||||
Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy(),
|
||||
OpFlags);
|
||||
Callee = DAG.getTargetExternalSymbol(
|
||||
S->getSymbol(), getPointerTy(DAG.getDataLayout()), OpFlags);
|
||||
} else if (Subtarget->isTarget64BitILP32() &&
|
||||
Callee->getValueType(0) == MVT::i32) {
|
||||
// Zero-extend the 32-bit Callee address into a 64-bit according to x32 ABI
|
||||
@ -3716,7 +3723,7 @@ SDValue X86TargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) const {
|
||||
FuncInfo->setRAIndex(ReturnAddrIndex);
|
||||
}
|
||||
|
||||
return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy());
|
||||
return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy(DAG.getDataLayout()));
|
||||
}
|
||||
|
||||
bool X86::isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
|
||||
@ -5162,7 +5169,8 @@ static SDValue LowerVectorBroadcast(SDValue Op, const X86Subtarget* Subtarget,
|
||||
assert(C && "Invalid constant type");
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue CP = DAG.getConstantPool(C, TLI.getPointerTy());
|
||||
SDValue CP =
|
||||
DAG.getConstantPool(C, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(CP)->getAlignment();
|
||||
Ld = DAG.getLoad(CVT, dl, DAG.getEntryNode(), CP,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
@ -10855,12 +10863,13 @@ X86TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
|
||||
MaskEltVT.getSizeInBits());
|
||||
|
||||
Idx = DAG.getZExtOrTrunc(Idx, dl, MaskEltVT);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Mask = DAG.getNode(X86ISD::VINSERT, dl, MaskVT,
|
||||
getZeroVector(MaskVT, Subtarget, DAG, dl),
|
||||
Idx, DAG.getConstant(0, dl, getPointerTy()));
|
||||
getZeroVector(MaskVT, Subtarget, DAG, dl), Idx,
|
||||
DAG.getConstant(0, dl, PtrVT));
|
||||
SDValue Perm = DAG.getNode(X86ISD::VPERMV, dl, VecVT, Mask, Vec);
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, Op.getValueType(),
|
||||
Perm, DAG.getConstant(0, dl, getPointerTy()));
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, Op.getValueType(), Perm,
|
||||
DAG.getConstant(0, dl, PtrVT));
|
||||
}
|
||||
return SDValue();
|
||||
}
|
||||
@ -11251,17 +11260,16 @@ X86TargetLowering::LowerConstantPool(SDValue Op, SelectionDAG &DAG) const {
|
||||
else if (Subtarget->isPICStyleStubPIC())
|
||||
OpFlag = X86II::MO_PIC_BASE_OFFSET;
|
||||
|
||||
SDValue Result = DAG.getTargetConstantPool(CP->getConstVal(), getPointerTy(),
|
||||
CP->getAlignment(),
|
||||
CP->getOffset(), OpFlag);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result = DAG.getTargetConstantPool(
|
||||
CP->getConstVal(), PtrVT, CP->getAlignment(), CP->getOffset(), OpFlag);
|
||||
SDLoc DL(CP);
|
||||
Result = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
|
||||
Result = DAG.getNode(WrapperKind, DL, PtrVT, Result);
|
||||
// With PIC, the address is actually $g + Offset.
|
||||
if (OpFlag) {
|
||||
Result = DAG.getNode(ISD::ADD, DL, getPointerTy(),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg,
|
||||
SDLoc(), getPointerTy()),
|
||||
Result);
|
||||
Result =
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT,
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT), Result);
|
||||
}
|
||||
|
||||
return Result;
|
||||
@ -11284,17 +11292,16 @@ SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
|
||||
else if (Subtarget->isPICStyleStubPIC())
|
||||
OpFlag = X86II::MO_PIC_BASE_OFFSET;
|
||||
|
||||
SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy(),
|
||||
OpFlag);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, OpFlag);
|
||||
SDLoc DL(JT);
|
||||
Result = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
|
||||
Result = DAG.getNode(WrapperKind, DL, PtrVT, Result);
|
||||
|
||||
// With PIC, the address is actually $g + Offset.
|
||||
if (OpFlag)
|
||||
Result = DAG.getNode(ISD::ADD, DL, getPointerTy(),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg,
|
||||
SDLoc(), getPointerTy()),
|
||||
Result);
|
||||
Result =
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT,
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT), Result);
|
||||
|
||||
return Result;
|
||||
}
|
||||
@ -11322,24 +11329,24 @@ X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const {
|
||||
OpFlag = X86II::MO_DARWIN_NONLAZY;
|
||||
}
|
||||
|
||||
SDValue Result = DAG.getTargetExternalSymbol(Sym, getPointerTy(), OpFlag);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result = DAG.getTargetExternalSymbol(Sym, PtrVT, OpFlag);
|
||||
|
||||
SDLoc DL(Op);
|
||||
Result = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
|
||||
Result = DAG.getNode(WrapperKind, DL, PtrVT, Result);
|
||||
|
||||
// With PIC, the address is actually $g + Offset.
|
||||
if (DAG.getTarget().getRelocationModel() == Reloc::PIC_ &&
|
||||
!Subtarget->is64Bit()) {
|
||||
Result = DAG.getNode(ISD::ADD, DL, getPointerTy(),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg,
|
||||
SDLoc(), getPointerTy()),
|
||||
Result);
|
||||
Result =
|
||||
DAG.getNode(ISD::ADD, DL, PtrVT,
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT), Result);
|
||||
}
|
||||
|
||||
// For symbols that require a load from a stub to get the address, emit the
|
||||
// load.
|
||||
if (isGlobalStubReference(OpFlag))
|
||||
Result = DAG.getLoad(getPointerTy(), DL, DAG.getEntryNode(), Result,
|
||||
Result = DAG.getLoad(PtrVT, DL, DAG.getEntryNode(), Result,
|
||||
MachinePointerInfo::getGOT(), false, false, false, 0);
|
||||
|
||||
return Result;
|
||||
@ -11354,20 +11361,19 @@ X86TargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
int64_t Offset = cast<BlockAddressSDNode>(Op)->getOffset();
|
||||
SDLoc dl(Op);
|
||||
SDValue Result = DAG.getTargetBlockAddress(BA, getPointerTy(), Offset,
|
||||
OpFlags);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT, Offset, OpFlags);
|
||||
|
||||
if (Subtarget->isPICStyleRIPRel() &&
|
||||
(M == CodeModel::Small || M == CodeModel::Kernel))
|
||||
Result = DAG.getNode(X86ISD::WrapperRIP, dl, getPointerTy(), Result);
|
||||
Result = DAG.getNode(X86ISD::WrapperRIP, dl, PtrVT, Result);
|
||||
else
|
||||
Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
|
||||
Result = DAG.getNode(X86ISD::Wrapper, dl, PtrVT, Result);
|
||||
|
||||
// With PIC, the address is actually $g + Offset.
|
||||
if (isGlobalRelativeToPICBase(OpFlags)) {
|
||||
Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, dl, getPointerTy()),
|
||||
Result);
|
||||
Result = DAG.getNode(ISD::ADD, dl, PtrVT,
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, dl, PtrVT), Result);
|
||||
}
|
||||
|
||||
return Result;
|
||||
@ -11381,40 +11387,40 @@ X86TargetLowering::LowerGlobalAddress(const GlobalValue *GV, SDLoc dl,
|
||||
unsigned char OpFlags =
|
||||
Subtarget->ClassifyGlobalReference(GV, DAG.getTarget());
|
||||
CodeModel::Model M = DAG.getTarget().getCodeModel();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue Result;
|
||||
if (OpFlags == X86II::MO_NO_FLAG &&
|
||||
X86::isOffsetSuitableForCodeModel(Offset, M)) {
|
||||
// A direct static reference to a global.
|
||||
Result = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(), Offset);
|
||||
Result = DAG.getTargetGlobalAddress(GV, dl, PtrVT, Offset);
|
||||
Offset = 0;
|
||||
} else {
|
||||
Result = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(), 0, OpFlags);
|
||||
Result = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, OpFlags);
|
||||
}
|
||||
|
||||
if (Subtarget->isPICStyleRIPRel() &&
|
||||
(M == CodeModel::Small || M == CodeModel::Kernel))
|
||||
Result = DAG.getNode(X86ISD::WrapperRIP, dl, getPointerTy(), Result);
|
||||
Result = DAG.getNode(X86ISD::WrapperRIP, dl, PtrVT, Result);
|
||||
else
|
||||
Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
|
||||
Result = DAG.getNode(X86ISD::Wrapper, dl, PtrVT, Result);
|
||||
|
||||
// With PIC, the address is actually $g + Offset.
|
||||
if (isGlobalRelativeToPICBase(OpFlags)) {
|
||||
Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, dl, getPointerTy()),
|
||||
Result);
|
||||
Result = DAG.getNode(ISD::ADD, dl, PtrVT,
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, dl, PtrVT), Result);
|
||||
}
|
||||
|
||||
// For globals that require a load from a stub to get the address, emit the
|
||||
// load.
|
||||
if (isGlobalStubReference(OpFlags))
|
||||
Result = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), Result,
|
||||
Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Result,
|
||||
MachinePointerInfo::getGOT(), false, false, false, 0);
|
||||
|
||||
// If there was a non-zero offset that we didn't fold, create an explicit
|
||||
// addition for it.
|
||||
if (Offset != 0)
|
||||
Result = DAG.getNode(ISD::ADD, dl, getPointerTy(), Result,
|
||||
DAG.getConstant(Offset, dl, getPointerTy()));
|
||||
Result = DAG.getNode(ISD::ADD, dl, PtrVT, Result,
|
||||
DAG.getConstant(Offset, dl, PtrVT));
|
||||
|
||||
return Result;
|
||||
}
|
||||
@ -11578,22 +11584,23 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
|
||||
const GlobalValue *GV = GA->getGlobal();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (Subtarget->isTargetELF()) {
|
||||
TLSModel::Model model = DAG.getTarget().getTLSModel(GV);
|
||||
switch (model) {
|
||||
case TLSModel::GeneralDynamic:
|
||||
if (Subtarget->is64Bit())
|
||||
return LowerToTLSGeneralDynamicModel64(GA, DAG, getPointerTy());
|
||||
return LowerToTLSGeneralDynamicModel32(GA, DAG, getPointerTy());
|
||||
return LowerToTLSGeneralDynamicModel64(GA, DAG, PtrVT);
|
||||
return LowerToTLSGeneralDynamicModel32(GA, DAG, PtrVT);
|
||||
case TLSModel::LocalDynamic:
|
||||
return LowerToTLSLocalDynamicModel(GA, DAG, getPointerTy(),
|
||||
return LowerToTLSLocalDynamicModel(GA, DAG, PtrVT,
|
||||
Subtarget->is64Bit());
|
||||
case TLSModel::InitialExec:
|
||||
case TLSModel::LocalExec:
|
||||
return LowerToTLSExecModel(
|
||||
GA, DAG, getPointerTy(), model, Subtarget->is64Bit(),
|
||||
DAG.getTarget().getRelocationModel() == Reloc::PIC_);
|
||||
return LowerToTLSExecModel(GA, DAG, PtrVT, model, Subtarget->is64Bit(),
|
||||
DAG.getTarget().getRelocationModel() ==
|
||||
Reloc::PIC_);
|
||||
}
|
||||
llvm_unreachable("Unknown TLS model.");
|
||||
}
|
||||
@ -11616,13 +11623,12 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Result = DAG.getTargetGlobalAddress(GA->getGlobal(), DL,
|
||||
GA->getValueType(0),
|
||||
GA->getOffset(), OpFlag);
|
||||
SDValue Offset = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
|
||||
SDValue Offset = DAG.getNode(WrapperKind, DL, PtrVT, Result);
|
||||
|
||||
// With PIC32, the address is actually $g + Offset.
|
||||
if (PIC32)
|
||||
Offset = DAG.getNode(ISD::ADD, DL, getPointerTy(),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg,
|
||||
SDLoc(), getPointerTy()),
|
||||
Offset = DAG.getNode(ISD::ADD, DL, PtrVT,
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT),
|
||||
Offset);
|
||||
|
||||
// Lowering the machine isd will make sure everything is in the right
|
||||
@ -11639,8 +11645,7 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
// And our return value (tls address) is in the standard call return value
|
||||
// location.
|
||||
unsigned Reg = Subtarget->is64Bit() ? X86::RAX : X86::EAX;
|
||||
return DAG.getCopyFromReg(Chain, DL, Reg, getPointerTy(),
|
||||
Chain.getValue(1));
|
||||
return DAG.getCopyFromReg(Chain, DL, Reg, PtrVT, Chain.getValue(1));
|
||||
}
|
||||
|
||||
if (Subtarget->isTargetKnownWindowsMSVC() ||
|
||||
@ -11668,50 +11673,50 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
: Type::getInt32PtrTy(*DAG.getContext(),
|
||||
257));
|
||||
|
||||
SDValue TlsArray =
|
||||
Subtarget->is64Bit()
|
||||
? DAG.getIntPtrConstant(0x58, dl)
|
||||
: (Subtarget->isTargetWindowsGNU()
|
||||
? DAG.getIntPtrConstant(0x2C, dl)
|
||||
: DAG.getExternalSymbol("_tls_array", getPointerTy()));
|
||||
SDValue TlsArray = Subtarget->is64Bit()
|
||||
? DAG.getIntPtrConstant(0x58, dl)
|
||||
: (Subtarget->isTargetWindowsGNU()
|
||||
? DAG.getIntPtrConstant(0x2C, dl)
|
||||
: DAG.getExternalSymbol("_tls_array", PtrVT));
|
||||
|
||||
SDValue ThreadPointer =
|
||||
DAG.getLoad(getPointerTy(), dl, Chain, TlsArray,
|
||||
MachinePointerInfo(Ptr), false, false, false, 0);
|
||||
DAG.getLoad(PtrVT, dl, Chain, TlsArray, MachinePointerInfo(Ptr), false,
|
||||
false, false, 0);
|
||||
|
||||
SDValue res;
|
||||
if (GV->getThreadLocalMode() == GlobalVariable::LocalExecTLSModel) {
|
||||
res = ThreadPointer;
|
||||
} else {
|
||||
// Load the _tls_index variable
|
||||
SDValue IDX = DAG.getExternalSymbol("_tls_index", getPointerTy());
|
||||
SDValue IDX = DAG.getExternalSymbol("_tls_index", PtrVT);
|
||||
if (Subtarget->is64Bit())
|
||||
IDX = DAG.getExtLoad(ISD::ZEXTLOAD, dl, getPointerTy(), Chain, IDX,
|
||||
IDX = DAG.getExtLoad(ISD::ZEXTLOAD, dl, PtrVT, Chain, IDX,
|
||||
MachinePointerInfo(), MVT::i32, false, false,
|
||||
false, 0);
|
||||
else
|
||||
IDX = DAG.getLoad(getPointerTy(), dl, Chain, IDX, MachinePointerInfo(),
|
||||
false, false, false, 0);
|
||||
IDX = DAG.getLoad(PtrVT, dl, Chain, IDX, MachinePointerInfo(), false,
|
||||
false, false, 0);
|
||||
|
||||
SDValue Scale = DAG.getConstant(Log2_64_Ceil(TD->getPointerSize()), dl,
|
||||
getPointerTy());
|
||||
IDX = DAG.getNode(ISD::SHL, dl, getPointerTy(), IDX, Scale);
|
||||
auto &DL = DAG.getDataLayout();
|
||||
SDValue Scale =
|
||||
DAG.getConstant(Log2_64_Ceil(DL.getPointerSize()), dl, PtrVT);
|
||||
IDX = DAG.getNode(ISD::SHL, dl, PtrVT, IDX, Scale);
|
||||
|
||||
res = DAG.getNode(ISD::ADD, dl, getPointerTy(), ThreadPointer, IDX);
|
||||
res = DAG.getNode(ISD::ADD, dl, PtrVT, ThreadPointer, IDX);
|
||||
}
|
||||
|
||||
res = DAG.getLoad(getPointerTy(), dl, Chain, res, MachinePointerInfo(),
|
||||
false, false, false, 0);
|
||||
res = DAG.getLoad(PtrVT, dl, Chain, res, MachinePointerInfo(), false, false,
|
||||
false, 0);
|
||||
|
||||
// Get the offset of start of .tls section
|
||||
SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl,
|
||||
GA->getValueType(0),
|
||||
GA->getOffset(), X86II::MO_SECREL);
|
||||
SDValue Offset = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), TGA);
|
||||
SDValue Offset = DAG.getNode(X86ISD::Wrapper, dl, PtrVT, TGA);
|
||||
|
||||
// The address of the thread local variable is the add of the thread
|
||||
// pointer with the offset of the variable.
|
||||
return DAG.getNode(ISD::ADD, dl, getPointerTy(), res, Offset);
|
||||
return DAG.getNode(ISD::ADD, dl, PtrVT, res, Offset);
|
||||
}
|
||||
|
||||
llvm_unreachable("TLS not implemented for this target.");
|
||||
@ -11806,8 +11811,9 @@ SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,
|
||||
|
||||
unsigned Size = SrcVT.getSizeInBits()/8;
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size, false);
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
|
||||
SDValue Chain = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0),
|
||||
StackSlot,
|
||||
MachinePointerInfo::getFixedStack(SSFI),
|
||||
@ -11856,7 +11862,8 @@ SDValue X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
unsigned SSFISize = Op.getValueType().getSizeInBits()/8;
|
||||
int SSFI = MF.getFrameInfo()->CreateStackObject(SSFISize, SSFISize, false);
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
|
||||
Tys = DAG.getVTList(MVT::Other);
|
||||
SDValue Ops[] = {
|
||||
Chain, Result, StackSlot, DAG.getValueType(Op.getValueType()), InFlag
|
||||
@ -11898,7 +11905,8 @@ SDValue X86TargetLowering::LowerUINT_TO_FP_i64(SDValue Op,
|
||||
// Build some magic constants.
|
||||
static const uint32_t CV0[] = { 0x43300000, 0x45300000, 0, 0 };
|
||||
Constant *C0 = ConstantDataVector::get(*Context, CV0);
|
||||
SDValue CPIdx0 = DAG.getConstantPool(C0, getPointerTy(), 16);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
SDValue CPIdx0 = DAG.getConstantPool(C0, PtrVT, 16);
|
||||
|
||||
SmallVector<Constant*,2> CV1;
|
||||
CV1.push_back(
|
||||
@ -11908,7 +11916,7 @@ SDValue X86TargetLowering::LowerUINT_TO_FP_i64(SDValue Op,
|
||||
ConstantFP::get(*Context, APFloat(APFloat::IEEEdouble,
|
||||
APInt(64, 0x4530000000000000ULL))));
|
||||
Constant *C1 = ConstantVector::get(CV1);
|
||||
SDValue CPIdx1 = DAG.getConstantPool(C1, getPointerTy(), 16);
|
||||
SDValue CPIdx1 = DAG.getConstantPool(C1, PtrVT, 16);
|
||||
|
||||
// Load the 64-bit value into an XMM register.
|
||||
SDValue XR1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64,
|
||||
@ -12124,6 +12132,7 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue N0 = Op.getOperand(0);
|
||||
SDLoc dl(Op);
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (Op.getValueType().isVector())
|
||||
return lowerUINT_TO_FP_vec(Op, DAG);
|
||||
@ -12146,9 +12155,8 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
|
||||
// Make a 64-bit buffer, and use it to build an FILD.
|
||||
SDValue StackSlot = DAG.CreateStackTemporary(MVT::i64);
|
||||
if (SrcVT == MVT::i32) {
|
||||
SDValue WordOff = DAG.getConstant(4, dl, getPointerTy());
|
||||
SDValue OffsetSlot = DAG.getNode(ISD::ADD, dl,
|
||||
getPointerTy(), StackSlot, WordOff);
|
||||
SDValue WordOff = DAG.getConstant(4, dl, PtrVT);
|
||||
SDValue OffsetSlot = DAG.getNode(ISD::ADD, dl, PtrVT, StackSlot, WordOff);
|
||||
SDValue Store1 = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0),
|
||||
StackSlot, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
@ -12182,22 +12190,20 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
|
||||
APInt FF(32, 0x5F800000ULL);
|
||||
|
||||
// Check whether the sign bit is set.
|
||||
SDValue SignSet = DAG.getSetCC(dl,
|
||||
getSetCCResultType(*DAG.getContext(), MVT::i64),
|
||||
Op.getOperand(0),
|
||||
DAG.getConstant(0, dl, MVT::i64), ISD::SETLT);
|
||||
SDValue SignSet = DAG.getSetCC(
|
||||
dl, getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i64),
|
||||
Op.getOperand(0), DAG.getConstant(0, dl, MVT::i64), ISD::SETLT);
|
||||
|
||||
// Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
|
||||
SDValue FudgePtr = DAG.getConstantPool(
|
||||
ConstantInt::get(*DAG.getContext(), FF.zext(64)),
|
||||
getPointerTy());
|
||||
ConstantInt::get(*DAG.getContext(), FF.zext(64)), PtrVT);
|
||||
|
||||
// Get a pointer to FF if the sign bit was set, or to 0 otherwise.
|
||||
SDValue Zero = DAG.getIntPtrConstant(0, dl);
|
||||
SDValue Four = DAG.getIntPtrConstant(4, dl);
|
||||
SDValue Offset = DAG.getNode(ISD::SELECT, dl, Zero.getValueType(), SignSet,
|
||||
Zero, Four);
|
||||
FudgePtr = DAG.getNode(ISD::ADD, dl, getPointerTy(), FudgePtr, Offset);
|
||||
FudgePtr = DAG.getNode(ISD::ADD, dl, PtrVT, FudgePtr, Offset);
|
||||
|
||||
// Load the value out, extending it from f32 to f80.
|
||||
// FIXME: Avoid the extend by constructing the right constant pool?
|
||||
@ -12216,6 +12222,7 @@ X86TargetLowering:: FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
|
||||
SDLoc DL(Op);
|
||||
|
||||
EVT DstTy = Op.getValueType();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (!IsSigned && !isIntegerTypeFTOL(DstTy)) {
|
||||
assert(DstTy == MVT::i32 && "Unexpected FP_TO_UINT");
|
||||
@ -12240,7 +12247,7 @@ X86TargetLowering:: FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
unsigned MemSize = DstTy.getSizeInBits()/8;
|
||||
int SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize, false);
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
|
||||
|
||||
unsigned Opc;
|
||||
if (!IsSigned && isIntegerTypeFTOL(DstTy))
|
||||
@ -12274,7 +12281,7 @@ X86TargetLowering:: FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
|
||||
Value = DAG.getMemIntrinsicNode(X86ISD::FLD, DL, Tys, Ops, DstTy, MMO);
|
||||
Chain = Value.getValue(1);
|
||||
SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize, false);
|
||||
StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
|
||||
StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
|
||||
}
|
||||
|
||||
MachineMemOperand *MMO =
|
||||
@ -12645,7 +12652,7 @@ static SDValue LowerFABSorFNEG(SDValue Op, SelectionDAG &DAG) {
|
||||
Constant *C = ConstantInt::get(*Context, MaskElt);
|
||||
C = ConstantVector::getSplat(NumElts, C);
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue CPIdx = DAG.getConstantPool(C, TLI.getPointerTy());
|
||||
SDValue CPIdx = DAG.getConstantPool(C, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
SDValue Mask = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
@ -12704,7 +12711,8 @@ static SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) {
|
||||
CV[0] = ConstantFP::get(*Context,
|
||||
APFloat(Sem, APInt::getHighBitsSet(SizeInBits, 1)));
|
||||
Constant *C = ConstantVector::get(CV);
|
||||
SDValue CPIdx = DAG.getConstantPool(C, TLI.getPointerTy(), 16);
|
||||
auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
SDValue CPIdx = DAG.getConstantPool(C, PtrVT, 16);
|
||||
SDValue Mask1 = DAG.getLoad(SrcVT, dl, DAG.getEntryNode(), CPIdx,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
false, false, false, 16);
|
||||
@ -12725,7 +12733,7 @@ static SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) {
|
||||
APFloat(Sem, APInt::getLowBitsSet(SizeInBits, SizeInBits - 1)));
|
||||
}
|
||||
C = ConstantVector::get(CV);
|
||||
CPIdx = DAG.getConstantPool(C, TLI.getPointerTy(), 16);
|
||||
CPIdx = DAG.getConstantPool(C, PtrVT, 16);
|
||||
SDValue Val = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
false, false, false, 16);
|
||||
@ -14414,8 +14422,8 @@ static SDValue LowerExtendedLoad(SDValue Op, const X86Subtarget *Subtarget,
|
||||
|
||||
SmallVector<SDValue, 8> Chains;
|
||||
SDValue Ptr = Ld->getBasePtr();
|
||||
SDValue Increment =
|
||||
DAG.getConstant(SclrLoadTy.getSizeInBits() / 8, dl, TLI.getPointerTy());
|
||||
SDValue Increment = DAG.getConstant(SclrLoadTy.getSizeInBits() / 8, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
SDValue Res = DAG.getUNDEF(LoadUnitVecVT);
|
||||
|
||||
for (unsigned i = 0; i < NumLoads; ++i) {
|
||||
@ -14855,7 +14863,7 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
EVT VT = Op.getNode()->getValueType(0);
|
||||
|
||||
bool Is64Bit = Subtarget->is64Bit();
|
||||
EVT SPTy = getPointerTy();
|
||||
MVT SPTy = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (SplitStack) {
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
@ -14872,8 +14880,7 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
"have nested arguments.");
|
||||
}
|
||||
|
||||
const TargetRegisterClass *AddrRegClass =
|
||||
getRegClassFor(getPointerTy());
|
||||
const TargetRegisterClass *AddrRegClass = getRegClassFor(SPTy);
|
||||
unsigned Vreg = MRI.createVirtualRegister(AddrRegClass);
|
||||
Chain = DAG.getCopyToReg(Chain, dl, Vreg, Size);
|
||||
SDValue Value = DAG.getNode(X86ISD::SEG_ALLOCA, dl, SPTy, Chain,
|
||||
@ -14908,6 +14915,7 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
|
||||
SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
auto PtrVT = getPointerTy(MF.getDataLayout());
|
||||
X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
|
||||
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
@ -14916,8 +14924,7 @@ SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
if (!Subtarget->is64Bit() || Subtarget->isTargetWin64()) {
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
return DAG.getStore(Op.getOperand(0), DL, FR, Op.getOperand(1),
|
||||
MachinePointerInfo(SV), false, false, 0);
|
||||
}
|
||||
@ -14937,8 +14944,7 @@ SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
MemOps.push_back(Store);
|
||||
|
||||
// Store fp_offset
|
||||
FIN = DAG.getNode(ISD::ADD, DL, getPointerTy(),
|
||||
FIN, DAG.getIntPtrConstant(4, DL));
|
||||
FIN = DAG.getNode(ISD::ADD, DL, PtrVT, FIN, DAG.getIntPtrConstant(4, DL));
|
||||
Store = DAG.getStore(Op.getOperand(0), DL,
|
||||
DAG.getConstant(FuncInfo->getVarArgsFPOffset(), DL,
|
||||
MVT::i32),
|
||||
@ -14946,20 +14952,16 @@ SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
MemOps.push_back(Store);
|
||||
|
||||
// Store ptr to overflow_arg_area
|
||||
FIN = DAG.getNode(ISD::ADD, DL, getPointerTy(),
|
||||
FIN, DAG.getIntPtrConstant(4, DL));
|
||||
SDValue OVFIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
FIN = DAG.getNode(ISD::ADD, DL, PtrVT, FIN, DAG.getIntPtrConstant(4, DL));
|
||||
SDValue OVFIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
Store = DAG.getStore(Op.getOperand(0), DL, OVFIN, FIN,
|
||||
MachinePointerInfo(SV, 8),
|
||||
false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
|
||||
// Store ptr to reg_save_area.
|
||||
FIN = DAG.getNode(ISD::ADD, DL, getPointerTy(),
|
||||
FIN, DAG.getIntPtrConstant(8, DL));
|
||||
SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
|
||||
getPointerTy());
|
||||
FIN = DAG.getNode(ISD::ADD, DL, PtrVT, FIN, DAG.getIntPtrConstant(8, DL));
|
||||
SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(), PtrVT);
|
||||
Store = DAG.getStore(Op.getOperand(0), DL, RSFIN, FIN,
|
||||
MachinePointerInfo(SV, 16), false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
@ -15010,7 +15012,7 @@ SDValue X86TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue InstOps[] = {Chain, SrcPtr, DAG.getConstant(ArgSize, dl, MVT::i32),
|
||||
DAG.getConstant(ArgMode, dl, MVT::i8),
|
||||
DAG.getConstant(Align, dl, MVT::i32)};
|
||||
SDVTList VTs = DAG.getVTList(getPointerTy(), MVT::Other);
|
||||
SDVTList VTs = DAG.getVTList(getPointerTy(DAG.getDataLayout()), MVT::Other);
|
||||
SDValue VAARG = DAG.getMemIntrinsicNode(X86ISD::VAARG_64, dl,
|
||||
VTs, InstOps, MVT::i64,
|
||||
MachinePointerInfo(SV),
|
||||
@ -15265,7 +15267,7 @@ static SDValue recoverFramePointer(SelectionDAG &DAG, const Function *Fn,
|
||||
SDLoc dl;
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
MVT PtrVT = TLI.getPointerTy();
|
||||
MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
|
||||
// It's possible that the parent function no longer has a personality function
|
||||
// if the exceptional code was optimized away, in which case we just return
|
||||
@ -15984,7 +15986,7 @@ static SDValue LowerSEHRESTOREFRAME(SDValue Op, const X86Subtarget *Subtarget,
|
||||
"using llvm.x86.seh.restoreframe requires a frame pointer");
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
MVT VT = TLI.getPointerTy();
|
||||
MVT VT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
|
||||
const X86RegisterInfo *RegInfo = Subtarget->getRegisterInfo();
|
||||
unsigned FrameReg =
|
||||
@ -16200,7 +16202,7 @@ SDValue X86TargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
SDLoc dl(Op);
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
if (Depth > 0) {
|
||||
SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
|
||||
@ -16282,7 +16284,7 @@ SDValue X86TargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Handler = Op.getOperand(2);
|
||||
SDLoc dl (Op);
|
||||
|
||||
EVT PtrVT = getPointerTy();
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
const X86RegisterInfo *RegInfo = Subtarget->getRegisterInfo();
|
||||
unsigned FrameReg = RegInfo->getFrameRegister(DAG.getMachineFunction());
|
||||
assert(((FrameReg == X86::RBP && PtrVT == MVT::i64) ||
|
||||
@ -16501,7 +16503,8 @@ SDValue X86TargetLowering::LowerFLT_ROUNDS_(SDValue Op,
|
||||
|
||||
// Save FP Control Word to stack slot
|
||||
int SSFI = MF.getFrameInfo()->CreateStackObject(2, StackAlignment, false);
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
|
||||
SDValue StackSlot =
|
||||
DAG.getFrameIndex(SSFI, getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(SSFI),
|
||||
@ -16862,7 +16865,7 @@ SDValue X86TargetLowering::LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) cons
|
||||
}
|
||||
|
||||
SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
|
||||
getPointerTy());
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(InChain)
|
||||
@ -18278,7 +18281,8 @@ static SDValue LowerFSINCOS(SDValue Op, const X86Subtarget *Subtarget,
|
||||
// the results are returned via SRet in memory.
|
||||
const char *LibcallName = isF64 ? "__sincos_stret" : "__sincosf_stret";
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue Callee = DAG.getExternalSymbol(LibcallName, TLI.getPointerTy());
|
||||
SDValue Callee =
|
||||
DAG.getExternalSymbol(LibcallName, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = isF64
|
||||
? (Type*)StructType::get(ArgTy, ArgTy, nullptr)
|
||||
@ -19888,7 +19892,7 @@ X86TargetLowering::EmitLoweredSegAlloca(MachineInstr *MI,
|
||||
|
||||
MachineRegisterInfo &MRI = MF->getRegInfo();
|
||||
const TargetRegisterClass *AddrRegClass =
|
||||
getRegClassFor(getPointerTy());
|
||||
getRegClassFor(getPointerTy(MF->getDataLayout()));
|
||||
|
||||
unsigned mallocPtrVReg = MRI.createVirtualRegister(AddrRegClass),
|
||||
bumpSPPtrVReg = MRI.createVirtualRegister(AddrRegClass),
|
||||
@ -20083,7 +20087,7 @@ X86TargetLowering::emitEHSjLjSetJmp(MachineInstr *MI,
|
||||
|
||||
MemOpndSlot = CurOp;
|
||||
|
||||
MVT PVT = getPointerTy();
|
||||
MVT PVT = getPointerTy(MF->getDataLayout());
|
||||
assert((PVT == MVT::i64 || PVT == MVT::i32) &&
|
||||
"Invalid Pointer Size!");
|
||||
|
||||
@ -20215,7 +20219,7 @@ X86TargetLowering::emitEHSjLjLongJmp(MachineInstr *MI,
|
||||
MachineInstr::mmo_iterator MMOBegin = MI->memoperands_begin();
|
||||
MachineInstr::mmo_iterator MMOEnd = MI->memoperands_end();
|
||||
|
||||
MVT PVT = getPointerTy();
|
||||
MVT PVT = getPointerTy(MF->getDataLayout());
|
||||
assert((PVT == MVT::i64 || PVT == MVT::i32) &&
|
||||
"Invalid Pointer Size!");
|
||||
|
||||
@ -21846,7 +21850,8 @@ static SDValue PerformEXTRACT_VECTOR_ELTCombine(SDNode *N, SelectionDAG &DAG,
|
||||
|
||||
if (TLI.isOperationLegal(ISD::SRA, MVT::i64)) {
|
||||
SDValue Cst = DAG.getBitcast(MVT::v2i64, InputVector);
|
||||
EVT VecIdxTy = DAG.getTargetLoweringInfo().getVectorIdxTy();
|
||||
auto &DL = DAG.getDataLayout();
|
||||
EVT VecIdxTy = DAG.getTargetLoweringInfo().getVectorIdxTy(DL);
|
||||
SDValue BottomHalf = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64, Cst,
|
||||
DAG.getConstant(0, dl, VecIdxTy));
|
||||
SDValue TopHalf = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64, Cst,
|
||||
@ -21872,10 +21877,11 @@ static SDValue PerformEXTRACT_VECTOR_ELTCombine(SDNode *N, SelectionDAG &DAG,
|
||||
// Replace each use (extract) with a load of the appropriate element.
|
||||
for (unsigned i = 0; i < 4; ++i) {
|
||||
uint64_t Offset = EltSize * i;
|
||||
SDValue OffsetVal = DAG.getConstant(Offset, dl, TLI.getPointerTy());
|
||||
auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
|
||||
SDValue OffsetVal = DAG.getConstant(Offset, dl, PtrVT);
|
||||
|
||||
SDValue ScalarAddr = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(),
|
||||
StackPtr, OffsetVal);
|
||||
SDValue ScalarAddr =
|
||||
DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr, OffsetVal);
|
||||
|
||||
// Load the scalar.
|
||||
Vals[i] = DAG.getLoad(ElementType, dl, Ch,
|
||||
@ -22439,7 +22445,8 @@ static SDValue PerformSELECTCombine(SDNode *N, SelectionDAG &DAG,
|
||||
// Check if the selector will be produced by CMPP*/PCMP*
|
||||
Cond.getOpcode() == ISD::SETCC &&
|
||||
// Check if SETCC has already been promoted
|
||||
TLI.getSetCCResultType(*DAG.getContext(), VT) == CondVT) {
|
||||
TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT) ==
|
||||
CondVT) {
|
||||
bool TValIsAllZeros = ISD::isBuildVectorAllZeros(LHS.getNode());
|
||||
bool FValIsAllOnes = ISD::isBuildVectorAllOnes(RHS.getNode());
|
||||
|
||||
@ -23811,7 +23818,8 @@ static SDValue PerformLOADCombine(SDNode *N, SelectionDAG &DAG,
|
||||
return SDValue();
|
||||
|
||||
SDValue Ptr = Ld->getBasePtr();
|
||||
SDValue Increment = DAG.getConstant(16, dl, TLI.getPointerTy());
|
||||
SDValue Increment =
|
||||
DAG.getConstant(16, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
EVT HalfVT = EVT::getVectorVT(*DAG.getContext(), MemVT.getScalarType(),
|
||||
NumElems/2);
|
||||
@ -24020,7 +24028,8 @@ static SDValue PerformSTORECombine(SDNode *N, SelectionDAG &DAG,
|
||||
SDValue Value0 = Extract128BitVector(StoredVal, 0, DAG, dl);
|
||||
SDValue Value1 = Extract128BitVector(StoredVal, NumElems/2, DAG, dl);
|
||||
|
||||
SDValue Stride = DAG.getConstant(16, dl, TLI.getPointerTy());
|
||||
SDValue Stride =
|
||||
DAG.getConstant(16, dl, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
SDValue Ptr0 = St->getBasePtr();
|
||||
SDValue Ptr1 = DAG.getNode(ISD::ADD, dl, Ptr0.getValueType(), Ptr0, Stride);
|
||||
|
||||
@ -24093,8 +24102,8 @@ static SDValue PerformSTORECombine(SDNode *N, SelectionDAG &DAG,
|
||||
assert(StoreVecVT.getSizeInBits() == VT.getSizeInBits());
|
||||
SDValue ShuffWide = DAG.getBitcast(StoreVecVT, Shuff);
|
||||
SmallVector<SDValue, 8> Chains;
|
||||
SDValue Increment = DAG.getConstant(StoreType.getSizeInBits()/8, dl,
|
||||
TLI.getPointerTy());
|
||||
SDValue Increment = DAG.getConstant(StoreType.getSizeInBits() / 8, dl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()));
|
||||
SDValue Ptr = St->getBasePtr();
|
||||
|
||||
// Perform one or more big stores into memory.
|
||||
|
@ -684,7 +684,8 @@ namespace llvm {
|
||||
bool isCheapToSpeculateCtlz() const override;
|
||||
|
||||
/// Return the value type to use for ISD::SETCC.
|
||||
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
||||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
||||
EVT VT) const override;
|
||||
|
||||
/// Determine which of the bits specified in Mask are known to be either
|
||||
/// zero or one and return them in the KnownZero/KnownOne bitsets.
|
||||
|
@ -81,8 +81,9 @@ X86SelectionDAGInfo::EmitTargetCodeForMemset(SelectionDAG &DAG, SDLoc dl,
|
||||
|
||||
if (const char *bzeroEntry = V &&
|
||||
V->isNullValue() ? Subtarget.getBZeroEntry() : nullptr) {
|
||||
EVT IntPtr = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
Type *IntPtrTy = getDataLayout()->getIntPtrType(*DAG.getContext());
|
||||
EVT IntPtr =
|
||||
DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
|
||||
Type *IntPtrTy = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Node = Dst;
|
||||
|
@ -89,7 +89,7 @@ unsigned X86TTIImpl::getArithmeticInstrCost(
|
||||
TTI::OperandValueKind Op2Info, TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo) {
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Ty);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
|
||||
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
assert(ISD && "Invalid opcode");
|
||||
@ -355,7 +355,7 @@ unsigned X86TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
|
||||
return BaseT::getShuffleCost(Kind, Tp, Index, SubTp);
|
||||
|
||||
if (Kind == TTI::SK_Reverse) {
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Tp);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
|
||||
unsigned Cost = 1;
|
||||
if (LT.second.getSizeInBits() > 128)
|
||||
Cost = 3; // Extract + insert + copy.
|
||||
@ -367,7 +367,7 @@ unsigned X86TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
|
||||
if (Kind == TTI::SK_Alternate) {
|
||||
// 64-bit packed float vectors (v2f32) are widened to type v4f32.
|
||||
// 64-bit packed integer vectors (v2i32) are promoted to type v2i64.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Tp);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
|
||||
|
||||
// The backend knows how to generate a single VEX.256 version of
|
||||
// instruction VPBLENDW if the target supports AVX2.
|
||||
@ -467,8 +467,8 @@ unsigned X86TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) {
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
assert(ISD && "Invalid opcode");
|
||||
|
||||
std::pair<unsigned, MVT> LTSrc = TLI->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> LTDest = TLI->getTypeLegalizationCost(Dst);
|
||||
std::pair<unsigned, MVT> LTSrc = TLI->getTypeLegalizationCost(DL, Src);
|
||||
std::pair<unsigned, MVT> LTDest = TLI->getTypeLegalizationCost(DL, Dst);
|
||||
|
||||
static const TypeConversionCostTblEntry<MVT::SimpleValueType>
|
||||
SSE2ConvTbl[] = {
|
||||
@ -540,8 +540,8 @@ unsigned X86TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) {
|
||||
if (Idx != -1)
|
||||
return AVX512ConversionTbl[Idx].Cost;
|
||||
}
|
||||
EVT SrcTy = TLI->getValueType(Src);
|
||||
EVT DstTy = TLI->getValueType(Dst);
|
||||
EVT SrcTy = TLI->getValueType(DL, Src);
|
||||
EVT DstTy = TLI->getValueType(DL, Dst);
|
||||
|
||||
// The function getSimpleVT only handles simple value types.
|
||||
if (!SrcTy.isSimple() || !DstTy.isSimple())
|
||||
@ -670,7 +670,7 @@ unsigned X86TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) {
|
||||
unsigned X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy) {
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(ValTy);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, ValTy);
|
||||
|
||||
MVT MTy = LT.second;
|
||||
|
||||
@ -743,7 +743,7 @@ unsigned X86TTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val,
|
||||
|
||||
if (Index != -1U) {
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Val);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Val);
|
||||
|
||||
// This type is legalized to a scalar type.
|
||||
if (!LT.second.isVector())
|
||||
@ -806,7 +806,7 @@ unsigned X86TTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src,
|
||||
}
|
||||
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, Src);
|
||||
assert((Opcode == Instruction::Load || Opcode == Instruction::Store) &&
|
||||
"Invalid Opcode");
|
||||
|
||||
@ -853,9 +853,9 @@ unsigned X86TTIImpl::getMaskedMemoryOpCost(unsigned Opcode, Type *SrcTy,
|
||||
}
|
||||
|
||||
// Legalize the type.
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(SrcVTy);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, SrcVTy);
|
||||
unsigned Cost = 0;
|
||||
if (LT.second != TLI->getValueType(SrcVTy).getSimpleVT() &&
|
||||
if (LT.second != TLI->getValueType(DL, SrcVTy).getSimpleVT() &&
|
||||
LT.second.getVectorNumElements() == NumElem)
|
||||
// Promotion requires expand/truncate for data and a shuffle for mask.
|
||||
Cost += getShuffleCost(TTI::SK_Alternate, SrcVTy, 0, 0) +
|
||||
@ -890,7 +890,7 @@ unsigned X86TTIImpl::getAddressComputationCost(Type *Ty, bool IsComplex) {
|
||||
unsigned X86TTIImpl::getReductionCost(unsigned Opcode, Type *ValTy,
|
||||
bool IsPairwise) {
|
||||
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(ValTy);
|
||||
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(DL, ValTy);
|
||||
|
||||
MVT MTy = LT.second;
|
||||
|
||||
|
@ -144,10 +144,9 @@ SDNode *XCoreDAGToDAGISel::Select(SDNode *N) {
|
||||
MVT::i32, MskSize);
|
||||
}
|
||||
else if (!isUInt<16>(Val)) {
|
||||
SDValue CPIdx =
|
||||
CurDAG->getTargetConstantPool(ConstantInt::get(
|
||||
Type::getInt32Ty(*CurDAG->getContext()), Val),
|
||||
getTargetLowering()->getPointerTy());
|
||||
SDValue CPIdx = CurDAG->getTargetConstantPool(
|
||||
ConstantInt::get(Type::getInt32Ty(*CurDAG->getContext()), Val),
|
||||
getTargetLowering()->getPointerTy(CurDAG->getDataLayout()));
|
||||
SDNode *node = CurDAG->getMachineNode(XCore::LDWCP_lru6, dl, MVT::i32,
|
||||
MVT::Other, CPIdx,
|
||||
CurDAG->getEntryNode());
|
||||
|
@ -312,8 +312,9 @@ LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
|
||||
Constant *GAI = ConstantExpr::getGetElementPtr(
|
||||
Type::getInt8Ty(*DAG.getContext()), GA, Idx);
|
||||
SDValue CP = DAG.getConstantPool(GAI, MVT::i32);
|
||||
return DAG.getLoad(getPointerTy(), DL, DAG.getEntryNode(), CP,
|
||||
MachinePointerInfo(), false, false, false, 0);
|
||||
return DAG.getLoad(getPointerTy(DAG.getDataLayout()), DL,
|
||||
DAG.getEntryNode(), CP, MachinePointerInfo(), false,
|
||||
false, false, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -321,11 +322,11 @@ SDValue XCoreTargetLowering::
|
||||
LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const
|
||||
{
|
||||
SDLoc DL(Op);
|
||||
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
SDValue Result = DAG.getTargetBlockAddress(BA, getPointerTy());
|
||||
SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT);
|
||||
|
||||
return DAG.getNode(XCoreISD::PCRelativeWrapper, DL, getPointerTy(), Result);
|
||||
return DAG.getNode(XCoreISD::PCRelativeWrapper, DL, PtrVT, Result);
|
||||
}
|
||||
|
||||
SDValue XCoreTargetLowering::
|
||||
@ -378,9 +379,10 @@ SDValue XCoreTargetLowering::
|
||||
lowerLoadWordFromAlignedBasePlusOffset(SDLoc DL, SDValue Chain, SDValue Base,
|
||||
int64_t Offset, SelectionDAG &DAG) const
|
||||
{
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
if ((Offset & 0x3) == 0) {
|
||||
return DAG.getLoad(getPointerTy(), DL, Chain, Base, MachinePointerInfo(),
|
||||
false, false, false, 0);
|
||||
return DAG.getLoad(PtrVT, DL, Chain, Base, MachinePointerInfo(), false,
|
||||
false, false, 0);
|
||||
}
|
||||
// Lower to pair of consecutive word aligned loads plus some bit shifting.
|
||||
int32_t HighOffset = RoundUpToAlignment(Offset, 4);
|
||||
@ -401,11 +403,9 @@ lowerLoadWordFromAlignedBasePlusOffset(SDLoc DL, SDValue Chain, SDValue Base,
|
||||
SDValue LowShift = DAG.getConstant((Offset - LowOffset) * 8, DL, MVT::i32);
|
||||
SDValue HighShift = DAG.getConstant((HighOffset - Offset) * 8, DL, MVT::i32);
|
||||
|
||||
SDValue Low = DAG.getLoad(getPointerTy(), DL, Chain,
|
||||
LowAddr, MachinePointerInfo(),
|
||||
SDValue Low = DAG.getLoad(PtrVT, DL, Chain, LowAddr, MachinePointerInfo(),
|
||||
false, false, false, 0);
|
||||
SDValue High = DAG.getLoad(getPointerTy(), DL, Chain,
|
||||
HighAddr, MachinePointerInfo(),
|
||||
SDValue High = DAG.getLoad(PtrVT, DL, Chain, HighAddr, MachinePointerInfo(),
|
||||
false, false, false, 0);
|
||||
SDValue LowShifted = DAG.getNode(ISD::SRL, DL, MVT::i32, Low, LowShift);
|
||||
SDValue HighShifted = DAG.getNode(ISD::SHL, DL, MVT::i32, High, HighShift);
|
||||
@ -495,10 +495,11 @@ LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
|
||||
Args.push_back(Entry);
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(DL).setChain(Chain)
|
||||
.setCallee(CallingConv::C, IntPtrTy,
|
||||
DAG.getExternalSymbol("__misaligned_load", getPointerTy()),
|
||||
std::move(Args), 0);
|
||||
CLI.setDebugLoc(DL).setChain(Chain).setCallee(
|
||||
CallingConv::C, IntPtrTy,
|
||||
DAG.getExternalSymbol("__misaligned_load",
|
||||
getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args), 0);
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
|
||||
SDValue Ops[] = { CallResult.first, CallResult.second };
|
||||
@ -557,10 +558,11 @@ LowerSTORE(SDValue Op, SelectionDAG &DAG) const
|
||||
Args.push_back(Entry);
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(Chain)
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__misaligned_store", getPointerTy()),
|
||||
std::move(Args), 0);
|
||||
CLI.setDebugLoc(dl).setChain(Chain).setCallee(
|
||||
CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__misaligned_store",
|
||||
getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args), 0);
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
@ -833,9 +835,9 @@ LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const {
|
||||
XCoreFunctionInfo *XFI = MF.getInfo<XCoreFunctionInfo>();
|
||||
int FI = XFI->createLRSpillSlot(MF);
|
||||
SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
|
||||
return DAG.getLoad(getPointerTy(), SDLoc(Op), DAG.getEntryNode(), FIN,
|
||||
MachinePointerInfo::getFixedStack(FI), false, false,
|
||||
false, 0);
|
||||
return DAG.getLoad(
|
||||
getPointerTy(DAG.getDataLayout()), SDLoc(Op), DAG.getEntryNode(), FIN,
|
||||
MachinePointerInfo::getFixedStack(FI), false, false, false, 0);
|
||||
}
|
||||
|
||||
SDValue XCoreTargetLowering::
|
||||
@ -979,11 +981,10 @@ LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const {
|
||||
if (N->getMemoryVT() == MVT::i32) {
|
||||
if (N->getAlignment() < 4)
|
||||
report_fatal_error("atomic load must be aligned");
|
||||
return DAG.getLoad(getPointerTy(), SDLoc(Op), N->getChain(),
|
||||
N->getBasePtr(), N->getPointerInfo(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->isInvariant(), N->getAlignment(),
|
||||
N->getAAInfo(), N->getRanges());
|
||||
return DAG.getLoad(getPointerTy(DAG.getDataLayout()), SDLoc(Op),
|
||||
N->getChain(), N->getBasePtr(), N->getPointerInfo(),
|
||||
N->isVolatile(), N->isNonTemporal(), N->isInvariant(),
|
||||
N->getAlignment(), N->getAAInfo(), N->getRanges());
|
||||
}
|
||||
if (N->getMemoryVT() == MVT::i16) {
|
||||
if (N->getAlignment() < 2)
|
||||
@ -1150,9 +1151,10 @@ XCoreTargetLowering::LowerCCCCallTo(SDValue Chain, SDValue Callee,
|
||||
|
||||
// Get a count of how many bytes are to be pushed on the stack.
|
||||
unsigned NumBytes = RetCCInfo.getNextStackOffset();
|
||||
auto PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
|
||||
Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, dl,
|
||||
getPointerTy(), true), dl);
|
||||
Chain = DAG.getCALLSEQ_START(Chain,
|
||||
DAG.getConstant(NumBytes, dl, PtrVT, true), dl);
|
||||
|
||||
SmallVector<std::pair<unsigned, SDValue>, 4> RegsToPass;
|
||||
SmallVector<SDValue, 12> MemOpChains;
|
||||
@ -1239,11 +1241,8 @@ XCoreTargetLowering::LowerCCCCallTo(SDValue Chain, SDValue Callee,
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Create the CALLSEQ_END node.
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumBytes, dl, getPointerTy(),
|
||||
true),
|
||||
DAG.getConstant(0, dl, getPointerTy(), true),
|
||||
InFlag, dl);
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getConstant(NumBytes, dl, PtrVT, true),
|
||||
DAG.getConstant(0, dl, PtrVT, true), InFlag, dl);
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Handle result values, copying them out of physregs into vregs that we
|
||||
|
@ -42,12 +42,14 @@ EmitTargetCodeForMemcpy(SelectionDAG &DAG, SDLoc dl, SDValue Chain,
|
||||
Entry.Node = Size; Args.push_back(Entry);
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(Chain)
|
||||
.setCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__memcpy_4", TLI.getPointerTy()),
|
||||
std::move(Args), 0)
|
||||
.setDiscardResult();
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__memcpy_4",
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args), 0)
|
||||
.setDiscardResult();
|
||||
|
||||
std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
|
Loading…
x
Reference in New Issue
Block a user