diff options
author | Dan Gohman <gohman@apple.com> | 2008-08-26 21:42:18 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-08-26 21:42:18 +0000 |
commit | d56f73f2f2e926a4ba9cade9144a122597ad5b86 (patch) | |
tree | 061d854cdb3ae93a93d1c55d7ce13a3a200be5c2 /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | 9f0f805bf97538757ea1527c86c73bfa333edaaf (diff) | |
download | bcm5719-llvm-d56f73f2f2e926a4ba9cade9144a122597ad5b86.tar.gz bcm5719-llvm-d56f73f2f2e926a4ba9cade9144a122597ad5b86.zip |
Optimize SelectionDAG's topological sort to use one pass instead
of two, and to not need a scratch std::vector. Also, use the
SelectionDAG's topological sort in LegalizeDAG instead of having
a separate implementation.
llvm-svn: 55389
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 71a60fbff7e..640fc97dcf7 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -4427,40 +4427,35 @@ void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From, /// of the SDNodes* in assigned order by reference. unsigned SelectionDAG::AssignTopologicalOrder(std::vector<SDNode*> &TopOrder) { unsigned DAGSize = AllNodes.size(); - std::vector<unsigned> InDegree(DAGSize); std::vector<SDNode*> Sources; - // Use a two pass approach to avoid using a std::map which is slow. - unsigned Id = 0; for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ++I){ SDNode *N = I; - N->setNodeId(Id++); unsigned Degree = N->use_size(); - InDegree[N->getNodeId()] = Degree; + // Temporarily use the Node Id as scratch space for the degree count. + N->setNodeId(Degree); if (Degree == 0) Sources.push_back(N); } TopOrder.clear(); TopOrder.reserve(DAGSize); + int Id = 0; while (!Sources.empty()) { SDNode *N = Sources.back(); Sources.pop_back(); TopOrder.push_back(N); + N->setNodeId(Id++); for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I) { SDNode *P = I->getVal(); - unsigned Degree = --InDegree[P->getNodeId()]; + unsigned Degree = P->getNodeId(); + --Degree; + P->setNodeId(Degree); if (Degree == 0) Sources.push_back(P); } } - // Second pass, assign the actual topological order as node ids. - Id = 0; - for (std::vector<SDNode*>::iterator TI = TopOrder.begin(),TE = TopOrder.end(); - TI != TE; ++TI) - (*TI)->setNodeId(Id++); - return Id; } |