mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-02 07:17:36 +00:00
[DebugInfo] Add debug locations to constant SD nodes
This adds debug location to constant nodes of Selection DAG and updates all places that create constants to pass debug locations (see PR13269). Can't guarantee that all locations are correct, but in a lot of cases choice is obvious, so most of them should be. At least all tests pass. Tests for these changes do not cover everything, instead just check it for SDNodes, ARM and AArch64 where it's easy to get incorrect locations on constants. This is not complete fix as FastISel contains workaround for wrong debug locations, which drops locations from instructions on processing constants, but there isn't currently a way to use debug locations from constants there as llvm::Constant doesn't cache it (yet). Although this is a bit different issue, not directly related to these changes. Differential Revision: http://reviews.llvm.org/D9084 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235977 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -384,7 +384,7 @@ SDValue SITargetLowering::LowerParameter(SelectionDAG &DAG, EVT VT, EVT MemVT,
|
||||
SDValue BasePtr = DAG.getCopyFromReg(Chain, SL,
|
||||
MRI.getLiveInVirtReg(InputPtrReg), MVT::i64);
|
||||
SDValue Ptr = DAG.getNode(ISD::ADD, SL, MVT::i64, BasePtr,
|
||||
DAG.getConstant(Offset, MVT::i64));
|
||||
DAG.getConstant(Offset, SL, MVT::i64));
|
||||
SDValue PtrOffset = DAG.getUNDEF(getPointerTy(AMDGPUAS::CONSTANT_ADDRESS));
|
||||
MachinePointerInfo PtrInfo(UndefValue::get(PtrTy));
|
||||
|
||||
@@ -826,14 +826,14 @@ SDValue SITargetLowering::LowerGlobalAddress(AMDGPUMachineFunction *MFI,
|
||||
SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i32);
|
||||
|
||||
SDValue PtrLo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, Ptr,
|
||||
DAG.getConstant(0, MVT::i32));
|
||||
DAG.getConstant(0, DL, MVT::i32));
|
||||
SDValue PtrHi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, Ptr,
|
||||
DAG.getConstant(1, MVT::i32));
|
||||
DAG.getConstant(1, DL, MVT::i32));
|
||||
|
||||
SDValue Lo = DAG.getNode(ISD::ADDC, DL, DAG.getVTList(MVT::i32, MVT::Glue),
|
||||
PtrLo, GA);
|
||||
SDValue Hi = DAG.getNode(ISD::ADDE, DL, DAG.getVTList(MVT::i32, MVT::Glue),
|
||||
PtrHi, DAG.getConstant(0, MVT::i32),
|
||||
PtrHi, DAG.getConstant(0, DL, MVT::i32),
|
||||
SDValue(Lo.getNode(), 1));
|
||||
return DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, Lo, Hi);
|
||||
}
|
||||
@@ -1018,8 +1018,8 @@ SDValue SITargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDLoc DL(Op);
|
||||
SDValue Cond = Op.getOperand(0);
|
||||
|
||||
SDValue Zero = DAG.getConstant(0, MVT::i32);
|
||||
SDValue One = DAG.getConstant(1, MVT::i32);
|
||||
SDValue Zero = DAG.getConstant(0, DL, MVT::i32);
|
||||
SDValue One = DAG.getConstant(1, DL, MVT::i32);
|
||||
|
||||
SDValue LHS = DAG.getNode(ISD::BITCAST, DL, MVT::v2i32, Op.getOperand(1));
|
||||
SDValue RHS = DAG.getNode(ISD::BITCAST, DL, MVT::v2i32, Op.getOperand(2));
|
||||
@@ -1094,12 +1094,12 @@ SDValue SITargetLowering::LowerFDIV32(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue r1 = DAG.getNode(ISD::FABS, SL, MVT::f32, RHS);
|
||||
|
||||
const APFloat K0Val(BitsToFloat(0x6f800000));
|
||||
const SDValue K0 = DAG.getConstantFP(K0Val, MVT::f32);
|
||||
const SDValue K0 = DAG.getConstantFP(K0Val, SL, MVT::f32);
|
||||
|
||||
const APFloat K1Val(BitsToFloat(0x2f800000));
|
||||
const SDValue K1 = DAG.getConstantFP(K1Val, MVT::f32);
|
||||
const SDValue K1 = DAG.getConstantFP(K1Val, SL, MVT::f32);
|
||||
|
||||
const SDValue One = DAG.getConstantFP(1.0, MVT::f32);
|
||||
const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f32);
|
||||
|
||||
EVT SetCCVT = getSetCCResultType(*DAG.getContext(), MVT::f32);
|
||||
|
||||
@@ -1124,7 +1124,7 @@ SDValue SITargetLowering::LowerFDIV64(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue X = Op.getOperand(0);
|
||||
SDValue Y = Op.getOperand(1);
|
||||
|
||||
const SDValue One = DAG.getConstantFP(1.0, MVT::f64);
|
||||
const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f64);
|
||||
|
||||
SDVTList ScaleVT = DAG.getVTList(MVT::f64, MVT::i1);
|
||||
|
||||
@@ -1154,7 +1154,7 @@ SDValue SITargetLowering::LowerFDIV64(SDValue Op, SelectionDAG &DAG) const {
|
||||
// Workaround a hardware bug on SI where the condition output from div_scale
|
||||
// is not usable.
|
||||
|
||||
const SDValue Hi = DAG.getConstant(1, MVT::i32);
|
||||
const SDValue Hi = DAG.getConstant(1, SL, MVT::i32);
|
||||
|
||||
// Figure out if the scale to use for div_fmas.
|
||||
SDValue NumBC = DAG.getNode(ISD::BITCAST, SL, MVT::v2i32, X);
|
||||
@@ -1223,11 +1223,13 @@ SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
||||
}
|
||||
|
||||
SDValue SITargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDLoc DL(Op);
|
||||
EVT VT = Op.getValueType();
|
||||
SDValue Arg = Op.getOperand(0);
|
||||
SDValue FractPart = DAG.getNode(AMDGPUISD::FRACT, SDLoc(Op), VT,
|
||||
DAG.getNode(ISD::FMUL, SDLoc(Op), VT, Arg,
|
||||
DAG.getConstantFP(0.5 / M_PI, VT)));
|
||||
SDValue FractPart = DAG.getNode(AMDGPUISD::FRACT, DL, VT,
|
||||
DAG.getNode(ISD::FMUL, DL, VT, Arg,
|
||||
DAG.getConstantFP(0.5/M_PI, DL,
|
||||
VT)));
|
||||
|
||||
switch (Op.getOpcode()) {
|
||||
case ISD::FCOS:
|
||||
@@ -1417,7 +1419,7 @@ SDValue SITargetLowering::performSHLPtrCombine(SDNode *N,
|
||||
EVT VT = N->getValueType(0);
|
||||
|
||||
SDValue ShlX = DAG.getNode(ISD::SHL, SL, VT, N0.getOperand(0), N1);
|
||||
SDValue COffset = DAG.getConstant(Offset, MVT::i32);
|
||||
SDValue COffset = DAG.getConstant(Offset, SL, MVT::i32);
|
||||
|
||||
return DAG.getNode(ISD::ADD, SL, VT, ShlX, COffset);
|
||||
}
|
||||
@@ -1466,8 +1468,9 @@ SDValue SITargetLowering::performAndCombine(SDNode *N,
|
||||
SIInstrFlags::P_INFINITY)) & 0x3ff) == Mask,
|
||||
"mask not equal");
|
||||
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, SDLoc(N), MVT::i1,
|
||||
X, DAG.getConstant(Mask, MVT::i32));
|
||||
SDLoc DL(N);
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, DL, MVT::i1,
|
||||
X, DAG.getConstant(Mask, DL, MVT::i32));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1497,8 +1500,9 @@ SDValue SITargetLowering::performOrCombine(SDNode *N,
|
||||
static const uint32_t MaxMask = 0x3ff;
|
||||
|
||||
uint32_t NewMask = (CLHS->getZExtValue() | CRHS->getZExtValue()) & MaxMask;
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, SDLoc(N), MVT::i1,
|
||||
Src, DAG.getConstant(NewMask, MVT::i32));
|
||||
SDLoc DL(N);
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, DL, MVT::i1,
|
||||
Src, DAG.getConstant(NewMask, DL, MVT::i32));
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
@@ -1512,7 +1516,7 @@ SDValue SITargetLowering::performClassCombine(SDNode *N,
|
||||
// fp_class x, 0 -> false
|
||||
if (const ConstantSDNode *CMask = dyn_cast<ConstantSDNode>(Mask)) {
|
||||
if (CMask->isNullValue())
|
||||
return DAG.getConstant(0, MVT::i1);
|
||||
return DAG.getConstant(0, SDLoc(N), MVT::i1);
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
@@ -1596,8 +1600,8 @@ SDValue SITargetLowering::performSetCCCombine(SDNode *N,
|
||||
const APFloat &APF = CRHS->getValueAPF();
|
||||
if (APF.isInfinity() && !APF.isNegative()) {
|
||||
unsigned Mask = SIInstrFlags::P_INFINITY | SIInstrFlags::N_INFINITY;
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, SL, MVT::i1,
|
||||
LHS.getOperand(0), DAG.getConstant(Mask, MVT::i32));
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, SL, MVT::i1, LHS.getOperand(0),
|
||||
DAG.getConstant(Mask, SL, MVT::i32));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1674,7 +1678,7 @@ SDValue SITargetLowering::PerformDAGCombine(SDNode *N,
|
||||
if (LHS.getOpcode() == ISD::FADD) {
|
||||
SDValue A = LHS.getOperand(0);
|
||||
if (A == LHS.getOperand(1)) {
|
||||
const SDValue Two = DAG.getConstantFP(2.0, MVT::f32);
|
||||
const SDValue Two = DAG.getConstantFP(2.0, DL, MVT::f32);
|
||||
return DAG.getNode(ISD::FMAD, DL, VT, Two, A, RHS);
|
||||
}
|
||||
}
|
||||
@@ -1683,7 +1687,7 @@ SDValue SITargetLowering::PerformDAGCombine(SDNode *N,
|
||||
if (RHS.getOpcode() == ISD::FADD) {
|
||||
SDValue A = RHS.getOperand(0);
|
||||
if (A == RHS.getOperand(1)) {
|
||||
const SDValue Two = DAG.getConstantFP(2.0, MVT::f32);
|
||||
const SDValue Two = DAG.getConstantFP(2.0, DL, MVT::f32);
|
||||
return DAG.getNode(ISD::FMAD, DL, VT, Two, A, LHS);
|
||||
}
|
||||
}
|
||||
@@ -1710,7 +1714,7 @@ SDValue SITargetLowering::PerformDAGCombine(SDNode *N,
|
||||
|
||||
SDValue A = LHS.getOperand(0);
|
||||
if (A == LHS.getOperand(1)) {
|
||||
const SDValue Two = DAG.getConstantFP(2.0, MVT::f32);
|
||||
const SDValue Two = DAG.getConstantFP(2.0, DL, MVT::f32);
|
||||
SDValue NegRHS = DAG.getNode(ISD::FNEG, DL, VT, RHS);
|
||||
|
||||
return DAG.getNode(ISD::FMAD, DL, VT, Two, A, NegRHS);
|
||||
@@ -1722,7 +1726,7 @@ SDValue SITargetLowering::PerformDAGCombine(SDNode *N,
|
||||
|
||||
SDValue A = RHS.getOperand(0);
|
||||
if (A == RHS.getOperand(1)) {
|
||||
const SDValue NegTwo = DAG.getConstantFP(-2.0, MVT::f32);
|
||||
const SDValue NegTwo = DAG.getConstantFP(-2.0, DL, MVT::f32);
|
||||
return DAG.getNode(ISD::FMAD, DL, VT, NegTwo, A, LHS);
|
||||
}
|
||||
}
|
||||
@@ -1865,14 +1869,15 @@ void SITargetLowering::adjustWritemask(MachineSDNode *&Node,
|
||||
|
||||
// Adjust the writemask in the node
|
||||
std::vector<SDValue> Ops;
|
||||
Ops.push_back(DAG.getTargetConstant(NewDmask, MVT::i32));
|
||||
Ops.push_back(DAG.getTargetConstant(NewDmask, SDLoc(Node), MVT::i32));
|
||||
Ops.insert(Ops.end(), Node->op_begin() + 1, Node->op_end());
|
||||
Node = (MachineSDNode*)DAG.UpdateNodeOperands(Node, Ops);
|
||||
|
||||
// If we only got one lane, replace it with a copy
|
||||
// (if NewDmask has only one bit set...)
|
||||
if (NewDmask && (NewDmask & (NewDmask-1)) == 0) {
|
||||
SDValue RC = DAG.getTargetConstant(AMDGPU::VGPR_32RegClassID, MVT::i32);
|
||||
SDValue RC = DAG.getTargetConstant(AMDGPU::VGPR_32RegClassID, SDLoc(),
|
||||
MVT::i32);
|
||||
SDNode *Copy = DAG.getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
|
||||
SDLoc(), Users[Lane]->getValueType(0),
|
||||
SDValue(Node, 0), RC);
|
||||
@@ -1887,7 +1892,7 @@ void SITargetLowering::adjustWritemask(MachineSDNode *&Node,
|
||||
if (!User)
|
||||
continue;
|
||||
|
||||
SDValue Op = DAG.getTargetConstant(Idx, MVT::i32);
|
||||
SDValue Op = DAG.getTargetConstant(Idx, SDLoc(User), MVT::i32);
|
||||
DAG.UpdateNodeOperands(User, User->getOperand(0), Op);
|
||||
|
||||
switch (Idx) {
|
||||
@@ -1982,7 +1987,7 @@ void SITargetLowering::AdjustInstrPostInstrSelection(MachineInstr *MI,
|
||||
}
|
||||
|
||||
static SDValue buildSMovImm32(SelectionDAG &DAG, SDLoc DL, uint64_t Val) {
|
||||
SDValue K = DAG.getTargetConstant(Val, MVT::i32);
|
||||
SDValue K = DAG.getTargetConstant(Val, DL, MVT::i32);
|
||||
return SDValue(DAG.getMachineNode(AMDGPU::S_MOV_B32, DL, MVT::i32, K), 0);
|
||||
}
|
||||
|
||||
@@ -1997,11 +2002,11 @@ MachineSDNode *SITargetLowering::wrapAddr64Rsrc(SelectionDAG &DAG,
|
||||
|
||||
// Build the half of the subregister with the constants.
|
||||
const SDValue Ops0[] = {
|
||||
DAG.getTargetConstant(AMDGPU::SGPR_64RegClassID, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::SGPR_64RegClassID, DL, MVT::i32),
|
||||
buildSMovImm32(DAG, DL, 0),
|
||||
DAG.getTargetConstant(AMDGPU::sub0, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::sub0, DL, MVT::i32),
|
||||
buildSMovImm32(DAG, DL, TII->getDefaultRsrcDataFormat() >> 32),
|
||||
DAG.getTargetConstant(AMDGPU::sub1, MVT::i32)
|
||||
DAG.getTargetConstant(AMDGPU::sub1, DL, MVT::i32)
|
||||
};
|
||||
|
||||
SDValue SubRegHi = SDValue(DAG.getMachineNode(AMDGPU::REG_SEQUENCE, DL,
|
||||
@@ -2009,11 +2014,11 @@ MachineSDNode *SITargetLowering::wrapAddr64Rsrc(SelectionDAG &DAG,
|
||||
|
||||
// Combine the constants and the pointer.
|
||||
const SDValue Ops1[] = {
|
||||
DAG.getTargetConstant(AMDGPU::SReg_128RegClassID, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::SReg_128RegClassID, DL, MVT::i32),
|
||||
Ptr,
|
||||
DAG.getTargetConstant(AMDGPU::sub0_sub1, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::sub0_sub1, DL, MVT::i32),
|
||||
SubRegHi,
|
||||
DAG.getTargetConstant(AMDGPU::sub2_sub3, MVT::i32)
|
||||
DAG.getTargetConstant(AMDGPU::sub2_sub3, DL, MVT::i32)
|
||||
};
|
||||
|
||||
return DAG.getMachineNode(AMDGPU::REG_SEQUENCE, DL, MVT::v4i32, Ops1);
|
||||
@@ -2046,7 +2051,8 @@ MachineSDNode *SITargetLowering::buildRSRC(SelectionDAG &DAG,
|
||||
SDValue PtrHi = DAG.getTargetExtractSubreg(AMDGPU::sub1, DL, MVT::i32, Ptr);
|
||||
if (RsrcDword1) {
|
||||
PtrHi = SDValue(DAG.getMachineNode(AMDGPU::S_OR_B32, DL, MVT::i32, PtrHi,
|
||||
DAG.getConstant(RsrcDword1, MVT::i32)), 0);
|
||||
DAG.getConstant(RsrcDword1, DL, MVT::i32)),
|
||||
0);
|
||||
}
|
||||
|
||||
SDValue DataLo = buildSMovImm32(DAG, DL,
|
||||
@@ -2054,15 +2060,15 @@ MachineSDNode *SITargetLowering::buildRSRC(SelectionDAG &DAG,
|
||||
SDValue DataHi = buildSMovImm32(DAG, DL, RsrcDword2And3 >> 32);
|
||||
|
||||
const SDValue Ops[] = {
|
||||
DAG.getTargetConstant(AMDGPU::SReg_128RegClassID, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::SReg_128RegClassID, DL, MVT::i32),
|
||||
PtrLo,
|
||||
DAG.getTargetConstant(AMDGPU::sub0, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::sub0, DL, MVT::i32),
|
||||
PtrHi,
|
||||
DAG.getTargetConstant(AMDGPU::sub1, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::sub1, DL, MVT::i32),
|
||||
DataLo,
|
||||
DAG.getTargetConstant(AMDGPU::sub2, MVT::i32),
|
||||
DAG.getTargetConstant(AMDGPU::sub2, DL, MVT::i32),
|
||||
DataHi,
|
||||
DAG.getTargetConstant(AMDGPU::sub3, MVT::i32)
|
||||
DAG.getTargetConstant(AMDGPU::sub3, DL, MVT::i32)
|
||||
};
|
||||
|
||||
return DAG.getMachineNode(AMDGPU::REG_SEQUENCE, DL, MVT::v4i32, Ops);
|
||||
|
||||
Reference in New Issue
Block a user