diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-10-12 20:34:05 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-10-12 20:34:05 +0000 |
commit | a731cb674ac055b99748f4faa453d623b62ad67e (patch) | |
tree | 0ebff3723a46ec9757cd1a441480dc399cb09822 /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | 2e33fb453bd4330285007a22ae53e8b3521aba6a (diff) | |
download | bcm5719-llvm-a731cb674ac055b99748f4faa453d623b62ad67e.tar.gz bcm5719-llvm-a731cb674ac055b99748f4faa453d623b62ad67e.zip |
Add RemoveDeadNode to remove a dead node and its (potentially) dead operands.
llvm-svn: 30916
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 81473247e18..d2293756bba 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -300,6 +300,39 @@ void SelectionDAG::RemoveDeadNodes() { setRoot(Dummy.getValue()); } +void SelectionDAG::RemoveDeadNode(SDNode *N, std::vector<SDNode*> &Deleted) { + SmallVector<SDNode*, 16> DeadNodes; + DeadNodes.push_back(N); + + // Process the worklist, deleting the nodes and adding their uses to the + // worklist. + while (!DeadNodes.empty()) { + SDNode *N = DeadNodes.back(); + DeadNodes.pop_back(); + + // Take the node out of the appropriate CSE map. + RemoveNodeFromCSEMaps(N); + + // Next, brutally remove the operand list. This is safe to do, as there are + // no cycles in the graph. + for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I) { + SDNode *Operand = I->Val; + Operand->removeUser(N); + + // Now that we removed this operand, see if there are no uses of it left. + if (Operand->use_empty()) + DeadNodes.push_back(Operand); + } + delete[] N->OperandList; + N->OperandList = 0; + N->NumOperands = 0; + + // Finally, remove N itself. + Deleted.push_back(N); + AllNodes.erase(N); + } +} + void SelectionDAG::DeleteNode(SDNode *N) { assert(N->use_empty() && "Cannot delete a node that is not dead!"); |