|
@@ -58,6 +58,7 @@
|
|
|
#include "llvm/Target/TargetLowering.h"
|
|
|
#include "llvm/Target/TargetOptions.h"
|
|
|
#include "llvm/Target/TargetSelectionDAGInfo.h"
|
|
|
+#include "llvm/Target/TargetSubtargetInfo.h"
|
|
|
#include <algorithm>
|
|
|
using namespace llvm;
|
|
|
|
|
@@ -860,7 +861,7 @@ void SelectionDAGBuilder::init(GCFunctionInfo *gfi, AliasAnalysis &aa,
|
|
|
AA = &aa;
|
|
|
GFI = gfi;
|
|
|
LibInfo = li;
|
|
|
- DL = DAG.getTarget().getDataLayout();
|
|
|
+ DL = DAG.getTarget().getSubtargetImpl()->getDataLayout();
|
|
|
Context = DAG.getContext();
|
|
|
LPadToCallSiteMap.clear();
|
|
|
}
|
|
@@ -1018,8 +1019,9 @@ SDValue SelectionDAGBuilder::getValue(const Value *V) {
|
|
|
DenseMap<const Value *, unsigned>::iterator It = FuncInfo.ValueMap.find(V);
|
|
|
if (It != FuncInfo.ValueMap.end()) {
|
|
|
unsigned InReg = It->second;
|
|
|
- RegsForValue RFV(*DAG.getContext(), *TM.getTargetLowering(),
|
|
|
- InReg, V->getType());
|
|
|
+ RegsForValue RFV(*DAG.getContext(),
|
|
|
+ *TM.getSubtargetImpl()->getTargetLowering(), InReg,
|
|
|
+ V->getType());
|
|
|
SDValue Chain = DAG.getEntryNode();
|
|
|
N = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
|
|
|
resolveDanglingDebugInfo(V, N);
|
|
@@ -1050,7 +1052,7 @@ SDValue SelectionDAGBuilder::getNonRegisterValue(const Value *V) {
|
|
|
/// getValueImpl - Helper function for getValue and getNonRegisterValue.
|
|
|
/// Create an SDValue for the given value.
|
|
|
SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
|
|
|
if (const Constant *C = dyn_cast<Constant>(V)) {
|
|
|
EVT VT = TLI->getValueType(V->getType(), true);
|
|
@@ -1184,7 +1186,7 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
|
|
}
|
|
|
|
|
|
void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SDValue Chain = getControlRoot();
|
|
|
SmallVector<ISD::OutputArg, 8> Outs;
|
|
|
SmallVector<SDValue, 8> OutVals;
|
|
@@ -1275,9 +1277,8 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
|
|
|
bool isVarArg = DAG.getMachineFunction().getFunction()->isVarArg();
|
|
|
CallingConv::ID CallConv =
|
|
|
DAG.getMachineFunction().getFunction()->getCallingConv();
|
|
|
- Chain = TM.getTargetLowering()->LowerReturn(Chain, CallConv, isVarArg,
|
|
|
- Outs, OutVals, getCurSDLoc(),
|
|
|
- DAG);
|
|
|
+ Chain = TM.getSubtargetImpl()->getTargetLowering()->LowerReturn(
|
|
|
+ Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
|
|
|
|
|
|
// Verify that the target's LowerReturn behaved as expected.
|
|
|
assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
|
|
@@ -1601,10 +1602,9 @@ void SelectionDAGBuilder::visitBr(const BranchInst &I) {
|
|
|
// jle foo
|
|
|
//
|
|
|
if (const BinaryOperator *BOp = dyn_cast<BinaryOperator>(CondVal)) {
|
|
|
- if (!TM.getTargetLowering()->isJumpExpensive() &&
|
|
|
- BOp->hasOneUse() &&
|
|
|
- (BOp->getOpcode() == Instruction::And ||
|
|
|
- BOp->getOpcode() == Instruction::Or)) {
|
|
|
+ if (!TM.getSubtargetImpl()->getTargetLowering()->isJumpExpensive() &&
|
|
|
+ BOp->hasOneUse() && (BOp->getOpcode() == Instruction::And ||
|
|
|
+ BOp->getOpcode() == Instruction::Or)) {
|
|
|
FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB,
|
|
|
BOp->getOpcode(), getEdgeWeight(BrMBB, Succ0MBB),
|
|
|
getEdgeWeight(BrMBB, Succ1MBB));
|
|
@@ -1724,7 +1724,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 = TM.getTargetLowering()->getPointerTy();
|
|
|
+ EVT PTy = TM.getSubtargetImpl()->getTargetLowering()->getPointerTy();
|
|
|
SDValue Index = DAG.getCopyFromReg(getControlRoot(), getCurSDLoc(),
|
|
|
JT.Reg, PTy);
|
|
|
SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
|
|
@@ -1752,7 +1752,7 @@ void SelectionDAGBuilder::visitJumpTableHeader(JumpTable &JT,
|
|
|
// can be used as an index into the jump table in a subsequent basic block.
|
|
|
// This value may be smaller or larger than the target's pointer type, and
|
|
|
// therefore require extension or truncating.
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SwitchOp = DAG.getZExtOrTrunc(Sub, getCurSDLoc(), TLI->getPointerTy());
|
|
|
|
|
|
unsigned JumpTableReg = FuncInfo.CreateReg(TLI->getPointerTy());
|
|
@@ -1799,7 +1799,7 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,
|
|
|
MachineBasicBlock *ParentBB) {
|
|
|
|
|
|
// First create the loads to the guard/stack slot for the comparison.
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
EVT PtrTy = TLI->getPointerTy();
|
|
|
|
|
|
MachineFrameInfo *MFI = ParentBB->getParent()->getFrameInfo();
|
|
@@ -1863,7 +1863,7 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,
|
|
|
/// StackProtectorDescriptor.
|
|
|
void
|
|
|
SelectionDAGBuilder::visitSPDescriptorFailure(StackProtectorDescriptor &SPD) {
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SDValue Chain = TLI->makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL,
|
|
|
MVT::isVoid, nullptr, 0, false,
|
|
|
getCurSDLoc(), false, false).second;
|
|
@@ -1881,7 +1881,7 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
|
|
|
DAG.getConstant(B.First, VT));
|
|
|
|
|
|
// Check range
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SDValue RangeCmp = DAG.getSetCC(getCurSDLoc(),
|
|
|
TLI->getSetCCResultType(*DAG.getContext(),
|
|
|
Sub.getValueType()),
|
|
@@ -1946,7 +1946,7 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,
|
|
|
Reg, VT);
|
|
|
SDValue Cmp;
|
|
|
unsigned PopCount = CountPopulation_64(B.Mask);
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (PopCount == 1) {
|
|
|
// 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.
|
|
@@ -2044,7 +2044,7 @@ void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
|
|
|
|
|
|
// If there aren't registers to copy the values into (e.g., during SjLj
|
|
|
// exceptions), then don't bother to create these DAG nodes.
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (TLI->getExceptionPointerRegister() == 0 &&
|
|
|
TLI->getExceptionSelectorRegister() == 0)
|
|
|
return;
|
|
@@ -2255,7 +2255,7 @@ bool SelectionDAGBuilder::handleJTSwitchCase(CaseRec &CR,
|
|
|
for (CaseItr I = CR.Range.first, E = CR.Range.second; I != E; ++I)
|
|
|
TSize += I->size();
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (!areJTsAllowed(*TLI) || TSize.ult(TLI->getMinimumJumpTableEntries()))
|
|
|
return false;
|
|
|
|
|
@@ -2423,7 +2423,7 @@ bool SelectionDAGBuilder::handleBTSplitSwitchCase(CaseRec& CR,
|
|
|
RSize -= J->size();
|
|
|
}
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (areJTsAllowed(*TLI)) {
|
|
|
// If our case is dense we *really* should handle it earlier!
|
|
|
assert((FMetric > 0) && "Should handle dense range earlier!");
|
|
@@ -2494,7 +2494,7 @@ bool SelectionDAGBuilder::handleBitTestsSwitchCase(CaseRec& CR,
|
|
|
const Value* SV,
|
|
|
MachineBasicBlock* Default,
|
|
|
MachineBasicBlock* SwitchBB) {
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
EVT PTy = TLI->getPointerTy();
|
|
|
unsigned IntPtrBits = PTy.getSizeInBits();
|
|
|
|
|
@@ -2816,7 +2816,8 @@ void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
|
|
|
SDValue Op1 = getValue(I.getOperand(0));
|
|
|
SDValue Op2 = getValue(I.getOperand(1));
|
|
|
|
|
|
- EVT ShiftTy = TM.getTargetLowering()->getShiftAmountTy(Op2.getValueType());
|
|
|
+ EVT ShiftTy = TM.getSubtargetImpl()->getTargetLowering()->getShiftAmountTy(
|
|
|
+ Op2.getValueType());
|
|
|
|
|
|
// Coerce the shift amount to the right type if we can.
|
|
|
if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
|
|
@@ -2871,8 +2872,8 @@ void SelectionDAGBuilder::visitSDiv(const User &I) {
|
|
|
if (isa<BinaryOperator>(&I) && cast<BinaryOperator>(&I)->isExact() &&
|
|
|
!isa<ConstantSDNode>(Op1) &&
|
|
|
isa<ConstantSDNode>(Op2) && !cast<ConstantSDNode>(Op2)->isNullValue())
|
|
|
- setValue(&I, TM.getTargetLowering()->BuildExactSDIV(Op1, Op2,
|
|
|
- getCurSDLoc(), DAG));
|
|
|
+ setValue(&I, TM.getSubtargetImpl()->getTargetLowering()->BuildExactSDIV(
|
|
|
+ Op1, Op2, getCurSDLoc(), DAG));
|
|
|
else
|
|
|
setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(),
|
|
|
Op1, Op2));
|
|
@@ -2888,7 +2889,8 @@ void SelectionDAGBuilder::visitICmp(const User &I) {
|
|
|
SDValue Op2 = getValue(I.getOperand(1));
|
|
|
ISD::CondCode Opcode = getICmpCondCode(predicate);
|
|
|
|
|
|
- EVT DestVT = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
|
|
|
}
|
|
|
|
|
@@ -2903,13 +2905,15 @@ void SelectionDAGBuilder::visitFCmp(const User &I) {
|
|
|
ISD::CondCode Condition = getFCmpCondCode(predicate);
|
|
|
if (TM.Options.NoNaNsFPMath)
|
|
|
Condition = getFCmpCodeWithoutNaN(Condition);
|
|
|
- EVT DestVT = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition));
|
|
|
}
|
|
|
|
|
|
void SelectionDAGBuilder::visitSelect(const User &I) {
|
|
|
SmallVector<EVT, 4> ValueVTs;
|
|
|
- ComputeValueVTs(*TM.getTargetLowering(), I.getType(), ValueVTs);
|
|
|
+ ComputeValueVTs(*TM.getSubtargetImpl()->getTargetLowering(), I.getType(),
|
|
|
+ ValueVTs);
|
|
|
unsigned NumValues = ValueVTs.size();
|
|
|
if (NumValues == 0) return;
|
|
|
|
|
@@ -2936,7 +2940,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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N));
|
|
|
}
|
|
|
|
|
@@ -2944,7 +2949,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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N));
|
|
|
}
|
|
|
|
|
@@ -2952,14 +2958,15 @@ 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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
|
|
|
}
|
|
|
|
|
|
void SelectionDAGBuilder::visitFPTrunc(const User &I) {
|
|
|
// FPTrunc is never a no-op cast, no need to check
|
|
|
SDValue N = getValue(I.getOperand(0));
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
EVT DestVT = TLI->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getNode(ISD::FP_ROUND, getCurSDLoc(),
|
|
|
DestVT, N,
|
|
@@ -2969,35 +2976,40 @@ void SelectionDAGBuilder::visitFPTrunc(const User &I) {
|
|
|
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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
|
|
|
}
|
|
|
|
|
@@ -3005,7 +3017,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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT));
|
|
|
}
|
|
|
|
|
@@ -3013,13 +3026,15 @@ 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 = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT));
|
|
|
}
|
|
|
|
|
|
void SelectionDAGBuilder::visitBitCast(const User &I) {
|
|
|
SDValue N = getValue(I.getOperand(0));
|
|
|
- EVT DestVT = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
|
|
|
// BitCast assures us that source and destination are the same size so this is
|
|
|
// either a BITCAST or a no-op.
|
|
@@ -3041,7 +3056,8 @@ void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
|
|
|
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
|
|
const Value *SV = I.getOperand(0);
|
|
|
SDValue N = getValue(SV);
|
|
|
- EVT DestVT = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT DestVT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
|
|
|
unsigned SrcAS = SV->getType()->getPointerAddressSpace();
|
|
|
unsigned DestAS = I.getType()->getPointerAddressSpace();
|
|
@@ -3058,9 +3074,11 @@ void SelectionDAGBuilder::visitInsertElement(const User &I) {
|
|
|
SDValue InVal = getValue(I.getOperand(1));
|
|
|
SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(2)),
|
|
|
getCurSDLoc(), TLI.getVectorIdxTy());
|
|
|
- setValue(&I, DAG.getNode(ISD::INSERT_VECTOR_ELT, getCurSDLoc(),
|
|
|
- TM.getTargetLowering()->getValueType(I.getType()),
|
|
|
- InVec, InVal, InIdx));
|
|
|
+ setValue(&I,
|
|
|
+ DAG.getNode(ISD::INSERT_VECTOR_ELT, getCurSDLoc(),
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(
|
|
|
+ I.getType()),
|
|
|
+ InVec, InVal, InIdx));
|
|
|
}
|
|
|
|
|
|
void SelectionDAGBuilder::visitExtractElement(const User &I) {
|
|
@@ -3068,9 +3086,11 @@ void SelectionDAGBuilder::visitExtractElement(const User &I) {
|
|
|
SDValue InVec = getValue(I.getOperand(0));
|
|
|
SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(1)),
|
|
|
getCurSDLoc(), TLI.getVectorIdxTy());
|
|
|
- setValue(&I, DAG.getNode(ISD::EXTRACT_VECTOR_ELT, getCurSDLoc(),
|
|
|
- TM.getTargetLowering()->getValueType(I.getType()),
|
|
|
- InVec, InIdx));
|
|
|
+ setValue(&I,
|
|
|
+ DAG.getNode(ISD::EXTRACT_VECTOR_ELT, getCurSDLoc(),
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(
|
|
|
+ I.getType()),
|
|
|
+ InVec, InIdx));
|
|
|
}
|
|
|
|
|
|
// Utility for visitShuffleVector - Return true if every element in Mask,
|
|
@@ -3092,7 +3112,7 @@ void SelectionDAGBuilder::visitShuffleVector(const User &I) {
|
|
|
ShuffleVectorInst::getShuffleMask(cast<Constant>(I.getOperand(2)), Mask);
|
|
|
unsigned MaskNumElts = Mask.size();
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
EVT VT = TLI->getValueType(I.getType());
|
|
|
EVT SrcVT = Src1.getValueType();
|
|
|
unsigned SrcNumElts = SrcVT.getVectorNumElements();
|
|
@@ -3272,7 +3292,7 @@ void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
|
|
|
|
|
|
unsigned LinearIndex = ComputeLinearIndex(AggTy, I.getIndices());
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SmallVector<EVT, 4> AggValueVTs;
|
|
|
ComputeValueVTs(*TLI, AggTy, AggValueVTs);
|
|
|
SmallVector<EVT, 4> ValValueVTs;
|
|
@@ -3312,7 +3332,7 @@ void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
|
|
|
|
|
|
unsigned LinearIndex = ComputeLinearIndex(AggTy, I.getIndices());
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SmallVector<EVT, 4> ValValueVTs;
|
|
|
ComputeValueVTs(*TLI, ValTy, ValValueVTs);
|
|
|
|
|
@@ -3363,7 +3383,7 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
|
|
|
Ty = cast<SequentialType>(Ty)->getElementType();
|
|
|
|
|
|
// If this is a constant subscript, handle it quickly.
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (const ConstantInt *CI = dyn_cast<ConstantInt>(Idx)) {
|
|
|
if (CI->isZero()) continue;
|
|
|
uint64_t Offs =
|
|
@@ -3421,7 +3441,7 @@ void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
|
|
|
return; // getValue will auto-populate this.
|
|
|
|
|
|
Type *Ty = I.getAllocatedType();
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
uint64_t TySize = TLI->getDataLayout()->getTypeAllocSize(Ty);
|
|
|
unsigned Align =
|
|
|
std::max((unsigned)TLI->getDataLayout()->getPrefTypeAlignment(Ty),
|
|
@@ -3440,7 +3460,8 @@ void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
|
|
|
// Handle alignment. If the requested alignment is less than or equal to
|
|
|
// the stack alignment, ignore it. If the size is greater than or equal to
|
|
|
// the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
|
|
|
- unsigned StackAlign = TM.getFrameLowering()->getStackAlignment();
|
|
|
+ unsigned StackAlign =
|
|
|
+ TM.getSubtargetImpl()->getFrameLowering()->getStackAlignment();
|
|
|
if (Align <= StackAlign)
|
|
|
Align = 0;
|
|
|
|
|
@@ -3484,7 +3505,8 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
|
|
|
|
|
SmallVector<EVT, 4> ValueVTs;
|
|
|
SmallVector<uint64_t, 4> Offsets;
|
|
|
- ComputeValueVTs(*TM.getTargetLowering(), Ty, ValueVTs, &Offsets);
|
|
|
+ ComputeValueVTs(*TM.getSubtargetImpl()->getTargetLowering(), Ty, ValueVTs,
|
|
|
+ &Offsets);
|
|
|
unsigned NumValues = ValueVTs.size();
|
|
|
if (NumValues == 0)
|
|
|
return;
|
|
@@ -3504,7 +3526,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
|
|
Root = DAG.getRoot();
|
|
|
}
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (isVolatile)
|
|
|
Root = TLI->prepareVolatileOrAtomicLoad(Root, getCurSDLoc(), DAG);
|
|
|
|
|
@@ -3561,7 +3583,8 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {
|
|
|
|
|
|
SmallVector<EVT, 4> ValueVTs;
|
|
|
SmallVector<uint64_t, 4> Offsets;
|
|
|
- ComputeValueVTs(*TM.getTargetLowering(), SrcV->getType(), ValueVTs, &Offsets);
|
|
|
+ ComputeValueVTs(*TM.getSubtargetImpl()->getTargetLowering(), SrcV->getType(),
|
|
|
+ ValueVTs, &Offsets);
|
|
|
unsigned NumValues = ValueVTs.size();
|
|
|
if (NumValues == 0)
|
|
|
return;
|
|
@@ -3638,7 +3661,7 @@ void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
|
|
|
|
|
|
SDValue InChain = getRoot();
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (TLI->getInsertFencesForAtomic())
|
|
|
InChain = InsertFenceForAtomic(InChain, SuccessOrder, Scope, true, dl,
|
|
|
DAG, *TLI);
|
|
@@ -3685,7 +3708,7 @@ void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
|
|
|
|
|
|
SDValue InChain = getRoot();
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (TLI->getInsertFencesForAtomic())
|
|
|
InChain = InsertFenceForAtomic(InChain, Order, Scope, true, dl,
|
|
|
DAG, *TLI);
|
|
@@ -3712,7 +3735,7 @@ void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
|
|
|
|
|
|
void SelectionDAGBuilder::visitFence(const FenceInst &I) {
|
|
|
SDLoc dl = getCurSDLoc();
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SDValue Ops[3];
|
|
|
Ops[0] = getRoot();
|
|
|
Ops[1] = DAG.getConstant(I.getOrdering(), TLI->getPointerTy());
|
|
@@ -3727,7 +3750,7 @@ void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
|
|
|
|
|
|
SDValue InChain = getRoot();
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
EVT VT = TLI->getValueType(I.getType());
|
|
|
|
|
|
if (I.getAlignment() < VT.getSizeInBits() / 8)
|
|
@@ -3767,7 +3790,7 @@ void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
|
|
|
|
|
|
SDValue InChain = getRoot();
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
EVT VT = TLI->getValueType(I.getValueOperand()->getType());
|
|
|
|
|
|
if (I.getAlignment() < VT.getSizeInBits() / 8)
|
|
@@ -3813,7 +3836,7 @@ void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
|
|
|
|
|
|
// Info is set by getTgtMemInstrinsic
|
|
|
TargetLowering::IntrinsicInfo Info;
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
bool IsTgtIntrinsic = TLI->getTgtMemIntrinsic(Info, I, Intrinsic);
|
|
|
|
|
|
// Add the intrinsic ID as an integer operand if it's not a target intrinsic.
|
|
@@ -4578,7 +4601,8 @@ SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable,
|
|
|
return false;
|
|
|
|
|
|
MachineFunction &MF = DAG.getMachineFunction();
|
|
|
- const TargetInstrInfo *TII = DAG.getTarget().getInstrInfo();
|
|
|
+ const TargetInstrInfo *TII =
|
|
|
+ DAG.getTarget().getSubtargetImpl()->getInstrInfo();
|
|
|
|
|
|
// Ignore inlined function arguments here.
|
|
|
DIVariable DV(Variable);
|
|
@@ -4649,7 +4673,7 @@ SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable,
|
|
|
/// otherwise lower it and return null.
|
|
|
const char *
|
|
|
SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
SDLoc sdl = getCurSDLoc();
|
|
|
DebugLoc dl = getCurDebugLoc();
|
|
|
SDValue Res;
|
|
@@ -4673,7 +4697,8 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|
|
case Intrinsic::read_register: {
|
|
|
Value *Reg = I.getArgOperand(0);
|
|
|
SDValue RegName = DAG.getMDNode(cast<MDNode>(Reg));
|
|
|
- EVT VT = TM.getTargetLowering()->getValueType(I.getType());
|
|
|
+ EVT VT =
|
|
|
+ TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType());
|
|
|
setValue(&I, DAG.getNode(ISD::READ_REGISTER, sdl, VT, RegName));
|
|
|
return nullptr;
|
|
|
}
|
|
@@ -5485,7 +5510,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|
|
void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
|
|
|
bool isTailCall,
|
|
|
MachineBasicBlock *LandingPad) {
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
PointerType *PT = cast<PointerType>(CS.getCalledValue()->getType());
|
|
|
FunctionType *FTy = cast<FunctionType>(PT->getElementType());
|
|
|
Type *RetTy = FTy->getReturnType();
|
|
@@ -5637,7 +5662,8 @@ static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
|
|
|
void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
|
|
|
SDValue Value,
|
|
|
bool IsSigned) {
|
|
|
- EVT VT = TM.getTargetLowering()->getValueType(I.getType(), true);
|
|
|
+ EVT VT = TM.getSubtargetImpl()->getTargetLowering()->getValueType(I.getType(),
|
|
|
+ true);
|
|
|
if (IsSigned)
|
|
|
Value = DAG.getSExtOrTrunc(Value, getCurSDLoc(), VT);
|
|
|
else
|
|
@@ -5662,7 +5688,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 = TM.getTargetLowering()->getValueType(I.getType(), true);
|
|
|
+ EVT CallVT = TM.getSubtargetImpl()->getTargetLowering()->getValueType(
|
|
|
+ I.getType(), true);
|
|
|
setValue(&I, DAG.getConstant(0, CallVT));
|
|
|
return true;
|
|
|
}
|
|
@@ -5719,7 +5746,7 @@ bool SelectionDAGBuilder::visitMemCmpCall(const CallInst &I) {
|
|
|
// Require that we can find a legal MVT, and only do this if the target
|
|
|
// supports unaligned loads of that type. Expanding into byte loads would
|
|
|
// bloat the code.
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
if (ActuallyDoIt && CSize->getZExtValue() > 4) {
|
|
|
unsigned DstAS = LHS->getType()->getPointerAddressSpace();
|
|
|
unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
|
|
@@ -6067,8 +6094,8 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
|
|
|
if (!RenameFn)
|
|
|
Callee = getValue(I.getCalledValue());
|
|
|
else
|
|
|
- Callee = DAG.getExternalSymbol(RenameFn,
|
|
|
- TM.getTargetLowering()->getPointerTy());
|
|
|
+ Callee = DAG.getExternalSymbol(
|
|
|
+ RenameFn, TM.getSubtargetImpl()->getTargetLowering()->getPointerTy());
|
|
|
|
|
|
// 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.
|
|
@@ -6263,7 +6290,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
|
|
/// ConstraintOperands - Information about all of the constraints.
|
|
|
SDISelAsmOperandInfoVector ConstraintOperands;
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
TargetLowering::AsmOperandInfoVector
|
|
|
TargetConstraints = TLI->ParseConstraints(CS);
|
|
|
|
|
@@ -6786,7 +6813,7 @@ void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
|
|
|
}
|
|
|
|
|
|
void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
const DataLayout &DL = *TLI->getDataLayout();
|
|
|
SDValue V = DAG.getVAArg(TLI->getValueType(I.getType()), getCurSDLoc(),
|
|
|
getRoot(), getValue(I.getOperand(0)),
|
|
@@ -6848,7 +6875,7 @@ SelectionDAGBuilder::LowerCallOperands(const CallInst &CI, unsigned ArgIdx,
|
|
|
.setCallee(CI.getCallingConv(), retTy, Callee, std::move(Args), NumArgs)
|
|
|
.setDiscardResult(!CI.use_empty());
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
return TLI->LowerCallTo(CLI);
|
|
|
}
|
|
|
|
|
@@ -7392,7 +7419,7 @@ SelectionDAGBuilder::CopyValueToVirtualRegister(const Value *V, unsigned Reg) {
|
|
|
"Copy from a reg to the same reg!");
|
|
|
assert(!TargetRegisterInfo::isPhysicalRegister(Reg) && "Is a physreg");
|
|
|
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
RegsForValue RFV(V->getContext(), *TLI, Reg, V->getType());
|
|
|
SDValue Chain = DAG.getEntryNode();
|
|
|
RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V);
|
|
@@ -7719,7 +7746,7 @@ SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
|
|
// Remember that this register needs to added to the machine PHI node as
|
|
|
// the input for this MBB.
|
|
|
SmallVector<EVT, 4> ValueVTs;
|
|
|
- const TargetLowering *TLI = TM.getTargetLowering();
|
|
|
+ const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering();
|
|
|
ComputeValueVTs(*TLI, PN->getType(), ValueVTs);
|
|
|
for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {
|
|
|
EVT VT = ValueVTs[vti];
|