summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2017-11-09 19:50:20 +0000
committerAdrian Prantl <aprantl@apple.com>2017-11-09 19:50:20 +0000
commit1c8c544946a21ee46261dee56ffc1fbea1515209 (patch)
treecf4c6fdfa363bba9b6aae07321c848c7b325e25f /llvm/lib/CodeGen
parent18f21a483b863439ed19cdddb966dd9fe0464dcf (diff)
downloadbcm5719-llvm-1c8c544946a21ee46261dee56ffc1fbea1515209.tar.gz
bcm5719-llvm-1c8c544946a21ee46261dee56ffc1fbea1515209.zip
Preserve debug info when DAG-combinging (zext (truncate x)) -> (and x, mask).
rdar://problem/27139077 llvm-svn: 317825
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp6
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp38
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp35
3 files changed, 46 insertions, 33 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 86c4f2c3565..557cf6d5212 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -7613,7 +7613,11 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
if (!LegalOperations || TLI.isOperationLegal(ISD::AND, VT)) {
SDValue Op = DAG.getAnyExtOrTrunc(N0.getOperand(0), SDLoc(N), VT);
AddToWorklist(Op.getNode());
- return DAG.getZeroExtendInReg(Op, SDLoc(N), MinVT.getScalarType());
+ SDValue And = DAG.getZeroExtendInReg(Op, SDLoc(N), MinVT.getScalarType());
+ // We may safely transfer the debug info describing the truncate node over
+ // to the equivalent and operation.
+ DAG.transferDbgValues(N0, And);
+ return And;
}
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
index 0d85bccdeac..053d562a244 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
@@ -835,34 +835,6 @@ void DAGTypeLegalizer::GetExpandedInteger(SDValue Op, SDValue &Lo,
Hi = Entry.second;
}
-/// Transfer debug values by generating fragment expressions for split-up
-/// values.
-static void transferDbgValues(SelectionDAG &DAG, SDValue From, SDValue To,
- unsigned OffsetInBits) {
- SDNode *FromNode = From.getNode();
- SDNode *ToNode = To.getNode();
- assert(FromNode != ToNode);
-
- SmallVector<SDDbgValue *, 2> ClonedDVs;
- for (SDDbgValue *Dbg : DAG.GetDbgValues(FromNode)) {
- if (Dbg->getKind() != SDDbgValue::SDNODE)
- break;
-
- DIVariable *Var = Dbg->getVariable();
- if (auto Fragment = DIExpression::createFragmentExpression(
- Dbg->getExpression(), OffsetInBits, To.getValueSizeInBits())) {
- SDDbgValue *Clone = DAG.getDbgValue(Var, *Fragment, ToNode, To.getResNo(),
- Dbg->isIndirect(), Dbg->getDebugLoc(),
- Dbg->getOrder());
- ClonedDVs.push_back(Clone);
- }
- Dbg->setIsInvalidated();
- }
-
- for (SDDbgValue *Dbg : ClonedDVs)
- DAG.AddDbgValue(Dbg, ToNode, false);
-}
-
void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo,
SDValue Hi) {
assert(Lo.getValueType() ==
@@ -875,11 +847,13 @@ void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo,
// Transfer debug values.
if (DAG.getDataLayout().isBigEndian()) {
- transferDbgValues(DAG, Op, Hi, 0);
- transferDbgValues(DAG, Op, Lo, Hi.getValueSizeInBits());
+ DAG.transferDbgValues(Op, Hi, 0, Hi.getValueSizeInBits());
+ DAG.transferDbgValues(Op, Lo, Hi.getValueSizeInBits(),
+ Lo.getValueSizeInBits());
} else {
- transferDbgValues(DAG, Op, Lo, 0);
- transferDbgValues(DAG, Op, Hi, Lo.getValueSizeInBits());
+ DAG.transferDbgValues(Op, Lo, 0, Lo.getValueSizeInBits());
+ DAG.transferDbgValues(Op, Hi, Lo.getValueSizeInBits(),
+ Hi.getValueSizeInBits());
}
// Remember that this is the result of the node.
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 2fb2615b072..1c4589ef14f 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -7026,6 +7026,41 @@ SDDbgValue *SelectionDAG::getFrameIndexDbgValue(DIVariable *Var,
return new (DbgInfo->getAlloc()) SDDbgValue(Var, Expr, FI, DL, O);
}
+void SelectionDAG::transferDbgValues(SDValue From, SDValue To,
+ unsigned OffsetInBits,
+ unsigned SizeInBits) {
+ SDNode *FromNode = From.getNode();
+ SDNode *ToNode = To.getNode();
+ assert(FromNode != ToNode);
+
+ SmallVector<SDDbgValue *, 2> ClonedDVs;
+ for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
+ if (Dbg->getKind() != SDDbgValue::SDNODE)
+ break;
+
+ DIVariable *Var = Dbg->getVariable();
+ auto *Expr = Dbg->getExpression();
+ // If a fragment is requested, update the expression.
+ if (SizeInBits) {
+ auto Fragment = DIExpression::createFragmentExpression(
+ Dbg->getExpression(), OffsetInBits, SizeInBits);
+ if (Fragment)
+ Expr = *Fragment;
+ }
+ // Clone the SbgValue unless the fragment creation failed.
+ if (!SizeInBits || (SizeInBits && Expr)) {
+ SDDbgValue *Clone =
+ getDbgValue(Var, Expr, ToNode, To.getResNo(), Dbg->isIndirect(),
+ Dbg->getDebugLoc(), Dbg->getOrder());
+ ClonedDVs.push_back(Clone);
+ }
+ Dbg->setIsInvalidated();
+ }
+
+ for (SDDbgValue *Dbg : ClonedDVs)
+ AddDbgValue(Dbg, ToNode, false);
+}
+
void SelectionDAG::salvageDebugInfo(SDNode &N) {
if (!N.getHasDebugValue())
return;
OpenPOWER on IntegriCloud