From 53418797fd7dc3286ca360d99d44a7baed0d6069 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 16 Nov 2017 21:08:51 +0000 Subject: [PATCH] Revert "[SelectionDAG] Consolidate (t|T)ransferDbgValues methods, NFC." This reverts commit r318448. It looks like some of the asserts need to be weakened. http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/16296 llvm-svn: 318455 --- llvm/include/llvm/CodeGen/SelectionDAG.h | 9 ++- .../CodeGen/SelectionDAG/LegalizeTypes.cpp | 7 +-- .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 62 +++++++++++-------- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h index ba3511d52624..bb806c064cf3 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -1195,10 +1195,9 @@ public: unsigned O); /// Transfer debug values from one node to another, while optionally - /// generating fragment expressions for split-up values. If \p InvalidateDbg - /// is set, debug values are invalidated after they are transferred. + /// generating fragment expressions for split-up values. void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits = 0, - unsigned SizeInBits = 0, bool InvalidateDbg = true); + unsigned SizeInBits = 0); /// Remove the specified node from the system. If any of its /// operands then becomes dead, remove them as well. Inform UpdateListener @@ -1280,6 +1279,10 @@ public: return DbgInfo->getSDDbgValues(SD); } +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. diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp index 73e29969a21f..053d562a2445 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp @@ -845,14 +845,13 @@ void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo, AnalyzeNewValue(Lo); AnalyzeNewValue(Hi); - // Transfer debug values. Don't invalidate the source debug value until it's - // been transferred to the high and low bits. + // Transfer debug values. if (DAG.getDataLayout().isBigEndian()) { - DAG.transferDbgValues(Op, Hi, 0, Hi.getValueSizeInBits(), false); + DAG.transferDbgValues(Op, Hi, 0, Hi.getValueSizeInBits()); DAG.transferDbgValues(Op, Lo, Hi.getValueSizeInBits(), Lo.getValueSizeInBits()); } else { - DAG.transferDbgValues(Op, Lo, 0, Lo.getValueSizeInBits(), false); + DAG.transferDbgValues(Op, Lo, 0, Lo.getValueSizeInBits()); DAG.transferDbgValues(Op, Hi, Lo.getValueSizeInBits(), Hi.getValueSizeInBits()); } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index e3d136a378ed..1ed982d6baca 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -7027,29 +7027,16 @@ SDDbgValue *SelectionDAG::getFrameIndexDbgValue(DIVariable *Var, } void SelectionDAG::transferDbgValues(SDValue From, SDValue To, - unsigned OffsetInBits, unsigned SizeInBits, - bool InvalidateDbg) { + unsigned OffsetInBits, + unsigned SizeInBits) { SDNode *FromNode = From.getNode(); SDNode *ToNode = To.getNode(); - assert(FromNode && ToNode && "Can't modify dbg values"); - - // Remove these checks when ReplaceAllUsesWith gets stricter. - // TODO: assert(From != To && "Redundant dbg value transfer"); - // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer"); - if (From == To || FromNode == ToNode) - return; - - if (!FromNode->getHasDebugValue()) - return; + assert(FromNode != ToNode); SmallVector ClonedDVs; for (SDDbgValue *Dbg : GetDbgValues(FromNode)) { - // Just transfer the dbg value attached to From. - if (Dbg->getResNo() != From.getResNo()) - continue; - - assert(!Dbg->isInvalidated() && "Invalid dbg value"); - assert(Dbg->getKind() == SDDbgValue::SDNODE && "Can't transfer dbg value"); + if (Dbg->getKind() != SDDbgValue::SDNODE) + break; DIVariable *Var = Dbg->getVariable(); auto *Expr = Dbg->getExpression(); @@ -7072,9 +7059,7 @@ void SelectionDAG::transferDbgValues(SDValue From, SDValue To, getDbgValue(Var, Expr, ToNode, To.getResNo(), Dbg->isIndirect(), Dbg->getDebugLoc(), Dbg->getOrder()); ClonedDVs.push_back(Clone); - - if (InvalidateDbg) - Dbg->setIsInvalidated(); + Dbg->setIsInvalidated(); } for (SDDbgValue *Dbg : ClonedDVs) @@ -7152,7 +7137,7 @@ void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) { assert(From != To.getNode() && "Cannot replace uses of with self"); // Preserve Debug Values - transferDbgValues(FromN, To); + TransferDbgValues(FromN, To); // Iterate over all the existing uses of From. New uses will be added // to the beginning of the use list, which we avoid visiting. @@ -7211,7 +7196,7 @@ void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To) { for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) if (From->hasAnyUseOfValue(i)) { assert((i < To->getNumValues()) && "Invalid To location"); - transferDbgValues(SDValue(From, i), SDValue(To, i)); + TransferDbgValues(SDValue(From, i), SDValue(To, i)); } // Iterate over just the existing users of From. See the comments in @@ -7255,7 +7240,7 @@ void SelectionDAG::ReplaceAllUsesWith(SDNode *From, const SDValue *To) { // Preserve Debug Info. for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) - transferDbgValues(SDValue(From, i), *To); + TransferDbgValues(SDValue(From, i), *To); // Iterate over just the existing users of From. See the comments in // the ReplaceAllUsesWith above. @@ -7302,7 +7287,7 @@ void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){ } // Preserve Debug Info. - transferDbgValues(From, To); + TransferDbgValues(From, To); // Iterate over just the existing users of From. See the comments in // the ReplaceAllUsesWith above. @@ -7380,7 +7365,7 @@ void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From, if (Num == 1) return ReplaceAllUsesOfValueWith(*From, *To); - transferDbgValues(*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 @@ -7529,6 +7514,31 @@ void SelectionDAG::AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter) { DbgInfo->add(DB, SD, isParameter); } +/// Transfer SDDbgValues. Called in replace nodes. +void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) { + if (From == To || !From.getNode()->getHasDebugValue()) + return; + SDNode *FromNode = From.getNode(); + SDNode *ToNode = To.getNode(); + SmallVector ClonedDVs; + for (auto *Dbg : GetDbgValues(FromNode)) { + // Only add Dbgvalues attached to same ResNo. + if (Dbg->getKind() == SDDbgValue::SDNODE && + Dbg->getSDNode() == From.getNode() && + Dbg->getResNo() == From.getResNo() && !Dbg->isInvalidated()) { + assert(FromNode != ToNode && + "Should not transfer Debug Values intranode"); + SDDbgValue *Clone = getDbgValue(Dbg->getVariable(), Dbg->getExpression(), + ToNode, To.getResNo(), Dbg->isIndirect(), + Dbg->getDebugLoc(), Dbg->getOrder()); + ClonedDVs.push_back(Clone); + Dbg->setIsInvalidated(); + } + } + for (SDDbgValue *I : ClonedDVs) + AddDbgValue(I, ToNode, false); +} + SDValue SelectionDAG::makeEquivalentMemoryOrdering(LoadSDNode *OldLoad, SDValue NewMemOp) { assert(isa(NewMemOp.getNode()) && "Expected a memop node");