aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-08-01 08:20:41 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-08-01 08:20:41 +0000
commite6f35d8a5cc92d776cf460200e2b815e8c301b14 (patch)
treee1794f42cf59c7c39c893a43f716dd597ba8ed03 /lib/CodeGen
parentdb3cc3d7d663a8dc2063d1bb581851e5e66f269d (diff)
downloadexternal_llvm-e6f35d8a5cc92d776cf460200e2b815e8c301b14.zip
external_llvm-e6f35d8a5cc92d776cf460200e2b815e8c301b14.tar.gz
external_llvm-e6f35d8a5cc92d776cf460200e2b815e8c301b14.tar.bz2
Added AssignTopologicalOrder() to assign each node an unique id based on their topological order.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29431 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp40
1 files changed, 38 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8c40a72..943a950 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -28,6 +28,7 @@
#include <set>
#include <cmath>
#include <algorithm>
+#include <deque>
using namespace llvm;
static bool isCommutativeBinOp(unsigned Opcode) {
@@ -2698,8 +2699,8 @@ void SelectionDAG::ReplaceAllUsesOfValueWith(SDOperand From, SDOperand To,
}
-/// AssignNodeIds - Assign a unique node id for each node in the DAG. It returns
-/// the maximum id.
+/// AssignNodeIds - Assign a unique node id for each node in the DAG based on
+/// their allnodes order. It returns the maximum id.
unsigned SelectionDAG::AssignNodeIds() {
unsigned Id = 0;
for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ++I){
@@ -2709,6 +2710,41 @@ unsigned SelectionDAG::AssignNodeIds() {
return Id;
}
+/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
+/// based on their topological order. It returns a vector of the SDNodes* in
+/// assigned order.
+std::vector<SDNode*> SelectionDAG::AssignTopologicalOrder() {
+ unsigned DAGSize = AllNodes.size();
+ std::vector<SDNode*> TopOrder;
+ std::map<SDNode*, unsigned> InDegree;
+ std::deque<SDNode*> Sources;
+ for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ++I){
+ SDNode *N = I;
+ unsigned Degree = N->use_size();
+ InDegree[N] = Degree;
+ if (Degree == 0)
+ Sources.push_back(I);
+ }
+
+ int Id = 0;
+ while (!Sources.empty()) {
+ SDNode *N = Sources.front();
+ Sources.pop_front();
+ 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->Val;
+ unsigned Degree = InDegree[P] - 1;
+ if (Degree == 0)
+ Sources.push_back(P);
+ InDegree[P] = Degree;
+ }
+ }
+
+ return TopOrder;
+}
+
+
//===----------------------------------------------------------------------===//
// SDNode Class