[RDF] Allow unlinking ref nodes from data-flow chains only

llvm-svn: 258073
This commit is contained in:
Krzysztof Parzyszek 2016-01-18 20:41:34 +00:00
parent eb85b04c7e
commit 69e670d5f9
3 changed files with 23 additions and 14 deletions

View File

@ -183,9 +183,9 @@ bool DeadCodeElimination::erase(const SetVector<NodeId> &Nodes) {
if (trace()) if (trace())
dbgs() << " " << PrintNode<RefNode*>(RA, DFG) << '\n'; dbgs() << " " << PrintNode<RefNode*>(RA, DFG) << '\n';
if (DFG.IsUse(RA)) if (DFG.IsUse(RA))
DFG.unlinkUse(RA); DFG.unlinkUse(RA, true);
else if (DFG.IsDef(RA)) else if (DFG.IsDef(RA))
DFG.unlinkDef(RA); DFG.unlinkDef(RA, true);
} }
// Now, remove all dead instruction nodes. // Now, remove all dead instruction nodes.

View File

@ -1456,9 +1456,9 @@ void DataFlowGraph::removeUnusedPhis() {
PhiQ.insert(OA.Id); PhiQ.insert(OA.Id);
} }
if (RA.Addr->isDef()) if (RA.Addr->isDef())
unlinkDef(RA); unlinkDef(RA, true);
else else
unlinkUse(RA); unlinkUse(RA, true);
} }
NodeAddr<BlockNode*> BA = PA.Addr->getOwner(*this); NodeAddr<BlockNode*> BA = PA.Addr->getOwner(*this);
BA.Addr->removeMember(PA, *this); BA.Addr->removeMember(PA, *this);
@ -1593,13 +1593,10 @@ void DataFlowGraph::linkBlockRefs(DefStackMap &DefM, NodeAddr<BlockNode*> BA) {
} }
// Remove the use node UA from any data-flow and structural links. // Remove the use node UA from any data-flow and structural links.
void DataFlowGraph::unlinkUse(NodeAddr<UseNode*> UA) { void DataFlowGraph::unlinkUseDF(NodeAddr<UseNode*> UA) {
NodeId RD = UA.Addr->getReachingDef(); NodeId RD = UA.Addr->getReachingDef();
NodeId Sib = UA.Addr->getSibling(); NodeId Sib = UA.Addr->getSibling();
NodeAddr<InstrNode*> IA = UA.Addr->getOwner(*this);
IA.Addr->removeMember(UA, *this);
if (RD == 0) { if (RD == 0) {
assert(Sib == 0); assert(Sib == 0);
return; return;
@ -1623,7 +1620,7 @@ void DataFlowGraph::unlinkUse(NodeAddr<UseNode*> UA) {
} }
// Remove the def node DA from any data-flow and structural links. // Remove the def node DA from any data-flow and structural links.
void DataFlowGraph::unlinkDef(NodeAddr<DefNode*> DA) { void DataFlowGraph::unlinkDefDF(NodeAddr<DefNode*> DA) {
// //
// RD // RD
// | reached // | reached
@ -1710,7 +1707,4 @@ void DataFlowGraph::unlinkDef(NodeAddr<DefNode*> DA) {
Last.Addr->setSibling(RDA.Addr->getReachedUse()); Last.Addr->setSibling(RDA.Addr->getReachedUse());
RDA.Addr->setReachedUse(ReachedUses.front().Id); RDA.Addr->setReachedUse(ReachedUses.front().Id);
} }
NodeAddr<InstrNode*> IA = DA.Addr->getOwner(*this);
IA.Addr->removeMember(DA, *this);
} }

View File

@ -697,8 +697,16 @@ namespace rdf {
NodeList getRelatedRefs(NodeAddr<InstrNode*> IA, NodeList getRelatedRefs(NodeAddr<InstrNode*> IA,
NodeAddr<RefNode*> RA) const; NodeAddr<RefNode*> RA) const;
void unlinkUse(NodeAddr<UseNode*> UA); void unlinkUse(NodeAddr<UseNode*> UA, bool RemoveFromOwner) {
void unlinkDef(NodeAddr<DefNode*> DA); unlinkUseDF(UA);
if (RemoveFromOwner)
removeFromOwner(UA);
}
void unlinkDef(NodeAddr<DefNode*> DA, bool RemoveFromOwner) {
unlinkDefDF(DA);
if (RemoveFromOwner)
removeFromOwner(DA);
}
// Some useful filters. // Some useful filters.
template <uint16_t Kind> template <uint16_t Kind>
@ -765,6 +773,13 @@ namespace rdf {
void linkStmtRefs(DefStackMap &DefM, NodeAddr<StmtNode*> SA); void linkStmtRefs(DefStackMap &DefM, NodeAddr<StmtNode*> SA);
void linkBlockRefs(DefStackMap &DefM, NodeAddr<BlockNode*> BA); void linkBlockRefs(DefStackMap &DefM, NodeAddr<BlockNode*> BA);
void unlinkUseDF(NodeAddr<UseNode*> UA);
void unlinkDefDF(NodeAddr<DefNode*> DA);
void removeFromOwner(NodeAddr<RefNode*> RA) {
NodeAddr<InstrNode*> IA = RA.Addr->getOwner(*this);
IA.Addr->removeMember(RA, *this);
}
TimerGroup TimeG; TimerGroup TimeG;
NodeAddr<FuncNode*> Func; NodeAddr<FuncNode*> Func;
NodeAllocator Memory; NodeAllocator Memory;