[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp SelectionDAG.cpp
Chris Lattner
lattner at cs.uiuc.edu
Fri Aug 4 10:45:40 PDT 2006
Changes in directory llvm/lib/CodeGen/SelectionDAG:
LegalizeDAG.cpp updated: 1.383 -> 1.384
SelectionDAG.cpp updated: 1.316 -> 1.317
---
Log message:
Make SelectionDAG::RemoveDeadNodes iterative instead of recursive, which
also make it simpler.
---
Diffs of the changes: (+33 -51)
LegalizeDAG.cpp | 2 -
SelectionDAG.cpp | 82 +++++++++++++++++++++----------------------------------
2 files changed, 33 insertions(+), 51 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.383 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.384
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.383 Wed Jul 26 18:55:56 2006
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Aug 4 12:45:20 2006
@@ -349,7 +349,7 @@
PackedNodes.clear();
// Remove dead nodes now.
- DAG.RemoveDeadNodes(OldRoot.Val);
+ DAG.RemoveDeadNodes();
}
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.316 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.317
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.316 Wed Aug 2 17:00:34 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Aug 4 12:45:20 2006
@@ -23,6 +23,7 @@
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/ADT/SetVector.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include <iostream>
#include <set>
@@ -263,69 +264,50 @@
//===----------------------------------------------------------------------===//
/// RemoveDeadNodes - This method deletes all unreachable nodes in the
-/// SelectionDAG, including nodes (like loads) that have uses of their token
-/// chain but no other uses and no side effect. If a node is passed in as an
-/// argument, it is used as the seed for node deletion.
-void SelectionDAG::RemoveDeadNodes(SDNode *N) {
+/// SelectionDAG.
+void SelectionDAG::RemoveDeadNodes() {
// Create a dummy node (which is not added to allnodes), that adds a reference
// to the root node, preventing it from being deleted.
HandleSDNode Dummy(getRoot());
- bool MadeChange = false;
+ SmallVector<SDNode*, 128> DeadNodes;
- // If we have a hint to start from, use it.
- if (N && N->use_empty()) {
- DestroyDeadNode(N);
- MadeChange = true;
- }
-
+ // Add all obviously-dead nodes to the DeadNodes worklist.
for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ++I)
- if (I->use_empty() && I->getOpcode() != 65535) {
- // Node is dead, recursively delete newly dead uses.
- DestroyDeadNode(I);
- MadeChange = true;
- }
-
- // Walk the nodes list, removing the nodes we've marked as dead.
- if (MadeChange) {
- for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ) {
- SDNode *N = I++;
- if (N->use_empty())
- AllNodes.erase(N);
+ if (I->use_empty())
+ DeadNodes.push_back(I);
+
+ // 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.
+ AllNodes.erase(N);
}
// If the root changed (e.g. it was a dead load, update the root).
setRoot(Dummy.getValue());
}
-/// DestroyDeadNode - We know that N is dead. Nuke it from the CSE maps for the
-/// graph. If it is the last user of any of its operands, recursively process
-/// them the same way.
-///
-void SelectionDAG::DestroyDeadNode(SDNode *N) {
- // Okay, we really are going to delete this node. First take this 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 *O = I->Val;
- O->removeUser(N);
-
- // Now that we removed this operand, see if there are no uses of it left.
- if (O->use_empty())
- DestroyDeadNode(O);
- }
- delete[] N->OperandList;
- N->OperandList = 0;
- N->NumOperands = 0;
-
- // Mark the node as dead.
- N->MorphNodeTo(65535);
-}
-
void SelectionDAG::DeleteNode(SDNode *N) {
assert(N->use_empty() && "Cannot delete a node that is not dead!");
More information about the llvm-commits
mailing list