diff options
author | Dan Gohman <gohman@apple.com> | 2008-09-30 18:30:35 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-09-30 18:30:35 +0000 |
commit | 86aa16a69ad1e3ad0b484ec27b3c70e4f9ee5c90 (patch) | |
tree | d8d513f3d7ba5b5e6221015fbeb59f26cee1dbe1 /llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | |
parent | 985f69ab26a00b51c6d3e923029ff6c7ad25217a (diff) | |
download | bcm5719-llvm-86aa16a69ad1e3ad0b484ec27b3c70e4f9ee5c90.tar.gz bcm5719-llvm-86aa16a69ad1e3ad0b484ec27b3c70e4f9ee5c90.zip |
Optimize SelectionDAG's AssignTopologicalOrder even further.
Completely eliminate the TopOrder std::vector. Instead, sort
the AllNodes list in place. This also eliminates the need to
call AllNodes.size(), a linear-time operation, before
performing the sort.
Also, eliminate the Sources temporary std::vector, since it
essentially duplicates the sorted result as it is being
built.
This also changes the direction of the topological sort
from bottom-up to top-down. The AllNodes list starts out in
roughly top-down order, so this reduces the amount of
reordering needed. Top-down is also more convenient for
Legalize, and ISel needed only minor adjustments.
llvm-svn: 56867
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index c3ab3680b22..d6bb1426461 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -280,11 +280,10 @@ void SelectionDAGLegalize::LegalizeDAG() { // practice however, this causes us to run out of stack space on large basic // blocks. To avoid this problem, compute an ordering of the nodes where each // node is only legalized after all of its operands are legalized. - std::vector<SDNode *> TopOrder; - unsigned N = DAG.AssignTopologicalOrder(TopOrder); - for (unsigned i = N; i != 0; --i) - HandleOp(SDValue(TopOrder[i-1], 0)); - TopOrder.clear(); + DAG.AssignTopologicalOrder(); + for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(), + E = prior(DAG.allnodes_end()); I != next(E); ++I) + HandleOp(SDValue(I, 0)); // Finally, it's possible the root changed. Get the new root. SDValue OldRoot = DAG.getRoot(); |