From 69e670d5f996e2d1c0e4300aec4b41cc2ec24dcb Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Mon, 18 Jan 2016 20:41:34 +0000 Subject: [PATCH] [RDF] Allow unlinking ref nodes from data-flow chains only llvm-svn: 258073 --- llvm/lib/Target/Hexagon/RDFDeadCode.cpp | 4 ++-- llvm/lib/Target/Hexagon/RDFGraph.cpp | 14 ++++---------- llvm/lib/Target/Hexagon/RDFGraph.h | 19 +++++++++++++++++-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/llvm/lib/Target/Hexagon/RDFDeadCode.cpp b/llvm/lib/Target/Hexagon/RDFDeadCode.cpp index 95668577bd50..a7493244c0c7 100644 --- a/llvm/lib/Target/Hexagon/RDFDeadCode.cpp +++ b/llvm/lib/Target/Hexagon/RDFDeadCode.cpp @@ -183,9 +183,9 @@ bool DeadCodeElimination::erase(const SetVector &Nodes) { if (trace()) dbgs() << " " << PrintNode(RA, DFG) << '\n'; if (DFG.IsUse(RA)) - DFG.unlinkUse(RA); + DFG.unlinkUse(RA, true); else if (DFG.IsDef(RA)) - DFG.unlinkDef(RA); + DFG.unlinkDef(RA, true); } // Now, remove all dead instruction nodes. diff --git a/llvm/lib/Target/Hexagon/RDFGraph.cpp b/llvm/lib/Target/Hexagon/RDFGraph.cpp index 9b47422153bb..dd43234563fc 100644 --- a/llvm/lib/Target/Hexagon/RDFGraph.cpp +++ b/llvm/lib/Target/Hexagon/RDFGraph.cpp @@ -1456,9 +1456,9 @@ void DataFlowGraph::removeUnusedPhis() { PhiQ.insert(OA.Id); } if (RA.Addr->isDef()) - unlinkDef(RA); + unlinkDef(RA, true); else - unlinkUse(RA); + unlinkUse(RA, true); } NodeAddr BA = PA.Addr->getOwner(*this); BA.Addr->removeMember(PA, *this); @@ -1593,13 +1593,10 @@ void DataFlowGraph::linkBlockRefs(DefStackMap &DefM, NodeAddr BA) { } // Remove the use node UA from any data-flow and structural links. -void DataFlowGraph::unlinkUse(NodeAddr UA) { +void DataFlowGraph::unlinkUseDF(NodeAddr UA) { NodeId RD = UA.Addr->getReachingDef(); NodeId Sib = UA.Addr->getSibling(); - NodeAddr IA = UA.Addr->getOwner(*this); - IA.Addr->removeMember(UA, *this); - if (RD == 0) { assert(Sib == 0); return; @@ -1623,7 +1620,7 @@ void DataFlowGraph::unlinkUse(NodeAddr UA) { } // Remove the def node DA from any data-flow and structural links. -void DataFlowGraph::unlinkDef(NodeAddr DA) { +void DataFlowGraph::unlinkDefDF(NodeAddr DA) { // // RD // | reached @@ -1710,7 +1707,4 @@ void DataFlowGraph::unlinkDef(NodeAddr DA) { Last.Addr->setSibling(RDA.Addr->getReachedUse()); RDA.Addr->setReachedUse(ReachedUses.front().Id); } - - NodeAddr IA = DA.Addr->getOwner(*this); - IA.Addr->removeMember(DA, *this); } diff --git a/llvm/lib/Target/Hexagon/RDFGraph.h b/llvm/lib/Target/Hexagon/RDFGraph.h index 7da7bb5973cf..7a673847d8f1 100644 --- a/llvm/lib/Target/Hexagon/RDFGraph.h +++ b/llvm/lib/Target/Hexagon/RDFGraph.h @@ -697,8 +697,16 @@ namespace rdf { NodeList getRelatedRefs(NodeAddr IA, NodeAddr RA) const; - void unlinkUse(NodeAddr UA); - void unlinkDef(NodeAddr DA); + void unlinkUse(NodeAddr UA, bool RemoveFromOwner) { + unlinkUseDF(UA); + if (RemoveFromOwner) + removeFromOwner(UA); + } + void unlinkDef(NodeAddr DA, bool RemoveFromOwner) { + unlinkDefDF(DA); + if (RemoveFromOwner) + removeFromOwner(DA); + } // Some useful filters. template @@ -765,6 +773,13 @@ namespace rdf { void linkStmtRefs(DefStackMap &DefM, NodeAddr SA); void linkBlockRefs(DefStackMap &DefM, NodeAddr BA); + void unlinkUseDF(NodeAddr UA); + void unlinkDefDF(NodeAddr DA); + void removeFromOwner(NodeAddr RA) { + NodeAddr IA = RA.Addr->getOwner(*this); + IA.Addr->removeMember(RA, *this); + } + TimerGroup TimeG; NodeAddr Func; NodeAllocator Memory;