forked from OSchip/llvm-project
Preserve DebugInfo when replacing values in DAGCombiner
Recommiting after fixing over-aggressive assertion [DAG] Previously debug values would transfer debuginfo for the selected start node for a replacement which allows for debug to be dropped. Push debug value transfer to occur with node/value replacement in SelectionDAG, remove now extraneous transfers of debug values. This refixes PR9817 which was being incompletely checked in the testsuite. Reviewers: jyknight Subscribers: dblaikie, llvm-commits Differential Revision: http://reviews.llvm.org/D21037 llvm-svn: 273456
This commit is contained in:
parent
0526e7f8d9
commit
96beb7dee5
|
@ -1221,9 +1221,11 @@ public:
|
|||
return DbgInfo->getSDDbgValues(SD);
|
||||
}
|
||||
|
||||
/// Transfer SDDbgValues.
|
||||
private:
|
||||
/// Transfer SDDbgValues. Called via ReplaceAllUses{OfValue}?With
|
||||
void TransferDbgValues(SDValue From, SDValue To);
|
||||
|
||||
public:
|
||||
/// Return true if there are any SDDbgValue nodes associated
|
||||
/// with this SelectionDAG.
|
||||
bool hasDebugValues() const { return !DbgInfo->empty(); }
|
||||
|
|
|
@ -1333,8 +1333,6 @@ void DAGCombiner::Run(CombineLevel AtLevel) {
|
|||
DEBUG(dbgs() << " ... into: ";
|
||||
RV.getNode()->dump(&DAG));
|
||||
|
||||
// Transfer debug value.
|
||||
DAG.TransferDbgValues(SDValue(N, 0), RV);
|
||||
if (N->getNumValues() == RV.getNode()->getNumValues())
|
||||
DAG.ReplaceAllUsesWith(N, RV.getNode());
|
||||
else {
|
||||
|
|
|
@ -320,7 +320,6 @@ InstrEmitter::AddRegisterOperand(MachineInstrBuilder &MIB,
|
|||
"Chain and glue operands should occur at end of operand list!");
|
||||
// Get/emit the operand.
|
||||
unsigned VReg = getVR(Op, VRBaseMap);
|
||||
assert(TargetRegisterInfo::isVirtualRegister(VReg) && "Not a vreg?");
|
||||
|
||||
const MCInstrDesc &MCID = MIB->getDesc();
|
||||
bool isOptDef = IIOpNum < MCID.getNumOperands() &&
|
||||
|
@ -334,6 +333,8 @@ InstrEmitter::AddRegisterOperand(MachineInstrBuilder &MIB,
|
|||
const TargetRegisterClass *DstRC = nullptr;
|
||||
if (IIOpNum < II->getNumOperands())
|
||||
DstRC = TRI->getAllocatableClass(TII->getRegClass(*II,IIOpNum,TRI,*MF));
|
||||
assert((!DstRC || TargetRegisterInfo::isVirtualRegister(VReg)) &&
|
||||
"Expected VReg");
|
||||
if (DstRC && !MRI->constrainRegClass(VReg, DstRC, MinRCSize)) {
|
||||
unsigned NewVReg = MRI->createVirtualRegister(DstRC);
|
||||
BuildMI(*MBB, InsertPos, Op.getNode()->getDebugLoc(),
|
||||
|
|
|
@ -179,8 +179,6 @@ public:
|
|||
"Replacing one node with another that produces a different number "
|
||||
"of values!");
|
||||
DAG.ReplaceAllUsesWith(Old, New);
|
||||
for (unsigned i = 0, e = Old->getNumValues(); i != e; ++i)
|
||||
DAG.TransferDbgValues(SDValue(Old, i), SDValue(New, i));
|
||||
if (UpdatedNodes)
|
||||
UpdatedNodes->insert(New);
|
||||
ReplacedNode(Old);
|
||||
|
@ -190,7 +188,6 @@ public:
|
|||
dbgs() << " with: "; New->dump(&DAG));
|
||||
|
||||
DAG.ReplaceAllUsesWith(Old, New);
|
||||
DAG.TransferDbgValues(Old, New);
|
||||
if (UpdatedNodes)
|
||||
UpdatedNodes->insert(New.getNode());
|
||||
ReplacedNode(Old.getNode());
|
||||
|
@ -203,7 +200,6 @@ public:
|
|||
DEBUG(dbgs() << (i == 0 ? " with: "
|
||||
: " and: ");
|
||||
New[i]->dump(&DAG));
|
||||
DAG.TransferDbgValues(SDValue(Old, i), New[i]);
|
||||
if (UpdatedNodes)
|
||||
UpdatedNodes->insert(New[i].getNode());
|
||||
}
|
||||
|
|
|
@ -6333,6 +6333,9 @@ void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) {
|
|||
AddModifiedNodeToCSEMaps(User);
|
||||
}
|
||||
|
||||
// Preserve Debug Values
|
||||
TransferDbgValues(FromN, To);
|
||||
|
||||
// If we just RAUW'd the root, take note.
|
||||
if (FromN == getRoot())
|
||||
setRoot(To);
|
||||
|
@ -6356,6 +6359,11 @@ void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To) {
|
|||
if (From == To)
|
||||
return;
|
||||
|
||||
// Preserve Debug Info. Only do this if there's a use.
|
||||
for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
|
||||
if (From->hasAnyUseOfValue(i))
|
||||
TransferDbgValues(SDValue(From, i), SDValue(To, i));
|
||||
|
||||
// Iterate over just the existing users of From. See the comments in
|
||||
// the ReplaceAllUsesWith above.
|
||||
SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
|
||||
|
@ -6395,6 +6403,10 @@ void SelectionDAG::ReplaceAllUsesWith(SDNode *From, const SDValue *To) {
|
|||
if (From->getNumValues() == 1) // Handle the simple case efficiently.
|
||||
return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
|
||||
|
||||
// Preserve Debug Info.
|
||||
for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
|
||||
TransferDbgValues(SDValue(From, i), *To);
|
||||
|
||||
// Iterate over just the existing users of From. See the comments in
|
||||
// the ReplaceAllUsesWith above.
|
||||
SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
|
||||
|
@ -6439,6 +6451,9 @@ void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){
|
|||
return;
|
||||
}
|
||||
|
||||
// Preserve Debug Info.
|
||||
TransferDbgValues(From, To);
|
||||
|
||||
// Iterate over just the existing users of From. See the comments in
|
||||
// the ReplaceAllUsesWith above.
|
||||
SDNode::use_iterator UI = From.getNode()->use_begin(),
|
||||
|
@ -6513,6 +6528,8 @@ void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From,
|
|||
if (Num == 1)
|
||||
return ReplaceAllUsesOfValueWith(*From, *To);
|
||||
|
||||
TransferDbgValues(*From, *To);
|
||||
|
||||
// Read up all the uses and make records of them. This helps
|
||||
// processing new uses that are introduced during the
|
||||
// replacement process.
|
||||
|
@ -6661,7 +6678,7 @@ void SelectionDAG::AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter) {
|
|||
DbgInfo->add(DB, SD, isParameter);
|
||||
}
|
||||
|
||||
/// TransferDbgValues - Transfer SDDbgValues.
|
||||
/// TransferDbgValues - Transfer SDDbgValues. Called in replace nodes.
|
||||
void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) {
|
||||
if (From == To || !From.getNode()->getHasDebugValue())
|
||||
return;
|
||||
|
|
|
@ -1308,8 +1308,6 @@ void HexagonDAGToDAGISel::SelectFrameIndex(SDNode *N) {
|
|||
R = CurDAG->getMachineNode(Hexagon::TFR_FIA, DL, MVT::i32, Ops);
|
||||
}
|
||||
|
||||
if (N->getHasDebugValue())
|
||||
CurDAG->TransferDbgValues(SDValue(N, 0), SDValue(R, 0));
|
||||
ReplaceNode(N, R);
|
||||
}
|
||||
|
||||
|
|
|
@ -1057,8 +1057,8 @@ HexagonTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
|||
SDValue AC = DAG.getConstant(A, dl, MVT::i32);
|
||||
SDVTList VTs = DAG.getVTList(MVT::i32, MVT::Other);
|
||||
SDValue AA = DAG.getNode(HexagonISD::ALLOCA, dl, VTs, Chain, Size, AC);
|
||||
if (Op.getNode()->getHasDebugValue())
|
||||
DAG.TransferDbgValues(Op, AA);
|
||||
|
||||
DAG.ReplaceAllUsesOfValueWith(Op, AA);
|
||||
return AA;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,13 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32"
|
|||
target triple = "i686-apple-darwin"
|
||||
; PR 9817
|
||||
|
||||
; There should be a DEBUG_VALUE for each call to llvm.dbg.value
|
||||
|
||||
; CHECK: ##DEBUG_VALUE: __OpenCL_test_kernel:ip <-
|
||||
; CHECK: ##DEBUG_VALUE: xxx <- 0
|
||||
; CHECK: ##DEBUG_VALUE: gid <- %E{{..$}}
|
||||
; CHECK: ##DEBUG_VALUE: idx <- %E{{..$}}
|
||||
; CHECK-NOT: ##DEBUG_VALUE:
|
||||
|
||||
declare <4 x i32> @__amdil_get_global_id_int()
|
||||
declare void @llvm.dbg.value(metadata, i64, metadata, metadata)
|
||||
|
@ -12,10 +19,9 @@ entry:
|
|||
%0 = call <4 x i32> @__amdil_get_global_id_int() nounwind
|
||||
%1 = extractelement <4 x i32> %0, i32 0
|
||||
call void @llvm.dbg.value(metadata i32 %1, i64 0, metadata !9, metadata !DIExpression()), !dbg !11
|
||||
call void @llvm.dbg.value(metadata i32 0, i64 0, metadata !13, metadata !DIExpression()), !dbg !14
|
||||
call void @llvm.dbg.value(metadata i32 0, i64 0, metadata !21, metadata !DIExpression()), !dbg !14
|
||||
%tmp2 = load i32, i32 addrspace(1)* %ip, align 4, !dbg !15
|
||||
%tmp3 = add i32 0, %tmp2, !dbg !15
|
||||
; CHECK: ##DEBUG_VALUE: idx <- %E{{..$}}
|
||||
call void @llvm.dbg.value(metadata i32 %tmp3, i64 0, metadata !13, metadata !DIExpression()), !dbg !15
|
||||
%arrayidx = getelementptr i32, i32 addrspace(1)* %ip, i32 %1, !dbg !16
|
||||
store i32 %tmp3, i32 addrspace(1)* %arrayidx, align 4, !dbg !16
|
||||
|
@ -44,3 +50,4 @@ entry:
|
|||
!17 = !DILocation(line: 7, column: 1, scope: !0)
|
||||
!19 = !DIFile(filename: "OCL6368.tmp.cl", directory: "E:\5CUsers\5Cmvillmow.AMD\5CAppData\5CLocal\5CTemp")
|
||||
!20 = !{i32 1, !"Debug Info Version", i32 3}
|
||||
!21 = !DILocalVariable(name: "xxx", line: 4, scope: !10, file: !1, type: !6)
|
||||
|
|
Loading…
Reference in New Issue