diff options
author | Adrian Prantl <aprantl@apple.com> | 2017-11-09 19:50:20 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2017-11-09 19:50:20 +0000 |
commit | 1c8c544946a21ee46261dee56ffc1fbea1515209 (patch) | |
tree | cf4c6fdfa363bba9b6aae07321c848c7b325e25f /llvm/lib/CodeGen | |
parent | 18f21a483b863439ed19cdddb966dd9fe0464dcf (diff) | |
download | bcm5719-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.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp | 38 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 35 |
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; |