mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-10 04:33:40 +00:00
Switch the allnodes list from a vector of pointers to an ilist of nodes.This eliminates the vector, allows constant time removal of a node froma graph, and makes iteration over the all nodes list stable when adding
nodes to the graph. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24263 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b80e2be889
commit
de202b3cda
@ -514,7 +514,9 @@ void DAGCombiner::Run(bool RunningAfterLegalize) {
|
|||||||
AfterLegalize = RunningAfterLegalize;
|
AfterLegalize = RunningAfterLegalize;
|
||||||
|
|
||||||
// Add all the dag nodes to the worklist.
|
// Add all the dag nodes to the worklist.
|
||||||
WorkList.insert(WorkList.end(), DAG.allnodes_begin(), DAG.allnodes_end());
|
for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(),
|
||||||
|
E = DAG.allnodes_end(); I != E; ++I)
|
||||||
|
WorkList.push_back(I);
|
||||||
|
|
||||||
// Create a dummy node (which is not added to allnodes), that adds a reference
|
// Create a dummy node (which is not added to allnodes), that adds a reference
|
||||||
// to the root node, preventing it from being deleted, and tracking any
|
// to the root node, preventing it from being deleted, and tracking any
|
||||||
|
@ -394,7 +394,6 @@ static void ComputeTopDownOrdering(SDNode *N, std::vector<SDNode*> &Order,
|
|||||||
|
|
||||||
// Now that we have N in, add anything that uses it if all of their operands
|
// Now that we have N in, add anything that uses it if all of their operands
|
||||||
// are now done.
|
// are now done.
|
||||||
|
|
||||||
for (SDNode::use_iterator UI = N->use_begin(), E = N->use_end(); UI != E;++UI)
|
for (SDNode::use_iterator UI = N->use_begin(), E = N->use_end(); UI != E;++UI)
|
||||||
ComputeTopDownOrdering(*UI, Order, Visited);
|
ComputeTopDownOrdering(*UI, Order, Visited);
|
||||||
}
|
}
|
||||||
@ -409,19 +408,20 @@ void SelectionDAGLegalize::LegalizeDAG() {
|
|||||||
// node is only legalized after all of its operands are legalized.
|
// node is only legalized after all of its operands are legalized.
|
||||||
std::map<SDNode*, unsigned> Visited;
|
std::map<SDNode*, unsigned> Visited;
|
||||||
std::vector<SDNode*> Order;
|
std::vector<SDNode*> Order;
|
||||||
Order.reserve(DAG.allnodes_end()-DAG.allnodes_begin());
|
|
||||||
|
|
||||||
// Compute ordering from all of the leaves in the graphs, those (like the
|
// Compute ordering from all of the leaves in the graphs, those (like the
|
||||||
// entry node) that have no operands.
|
// entry node) that have no operands.
|
||||||
for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(),
|
for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(),
|
||||||
E = DAG.allnodes_end(); I != E; ++I) {
|
E = DAG.allnodes_end(); I != E; ++I) {
|
||||||
if ((*I)->getNumOperands() == 0) {
|
if (I->getNumOperands() == 0) {
|
||||||
Visited[*I] = 0 - 1U;
|
Visited[I] = 0 - 1U;
|
||||||
ComputeTopDownOrdering(*I, Order, Visited);
|
ComputeTopDownOrdering(I, Order, Visited);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(Order.size() == Visited.size() && Order.size() == DAG.allnodes_size()&&
|
assert(Order.size() == Visited.size() &&
|
||||||
|
Order.size() ==
|
||||||
|
(unsigned)std::distance(DAG.allnodes_begin(), DAG.allnodes_end()) &&
|
||||||
"Error: DAG is cyclic!");
|
"Error: DAG is cyclic!");
|
||||||
Visited.clear();
|
Visited.clear();
|
||||||
|
|
||||||
|
@ -837,21 +837,18 @@ void SimpleSched::FakeGroupDominators() {
|
|||||||
void SimpleSched::PrepareNodeInfo() {
|
void SimpleSched::PrepareNodeInfo() {
|
||||||
// Allocate node information
|
// Allocate node information
|
||||||
Info = new NodeInfo[NodeCount];
|
Info = new NodeInfo[NodeCount];
|
||||||
// Get base of all nodes table
|
|
||||||
SelectionDAG::allnodes_iterator AllNodes = DAG.allnodes_begin();
|
|
||||||
|
|
||||||
// For each node being scheduled
|
unsigned i = 0;
|
||||||
for (unsigned i = 0, N = NodeCount; i < N; i++) {
|
for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(),
|
||||||
// Get next node from DAG all nodes table
|
E = DAG.allnodes_end(); I != E; ++I, ++i) {
|
||||||
SDNode *Node = AllNodes[i];
|
|
||||||
// Fast reference to node schedule info
|
// Fast reference to node schedule info
|
||||||
NodeInfo* NI = &Info[i];
|
NodeInfo* NI = &Info[i];
|
||||||
// Set up map
|
// Set up map
|
||||||
Map[Node] = NI;
|
Map[I] = NI;
|
||||||
// Set node
|
// Set node
|
||||||
NI->Node = Node;
|
NI->Node = I;
|
||||||
// Set pending visit count
|
// Set pending visit count
|
||||||
NI->setPending(Node->use_size());
|
NI->setPending(I->use_size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1235,7 +1232,7 @@ void SimpleSched::EmitNode(NodeInfo *NI) {
|
|||||||
///
|
///
|
||||||
void SimpleSched::Schedule() {
|
void SimpleSched::Schedule() {
|
||||||
// Number the nodes
|
// Number the nodes
|
||||||
NodeCount = DAG.allnodes_size();
|
NodeCount = std::distance(DAG.allnodes_begin(), DAG.allnodes_end());
|
||||||
// Test to see if scheduling should occur
|
// Test to see if scheduling should occur
|
||||||
bool ShouldSchedule = NodeCount > 3 && ScheduleStyle != noScheduling;
|
bool ShouldSchedule = NodeCount > 3 && ScheduleStyle != noScheduling;
|
||||||
// Set up minimum info for scheduling
|
// Set up minimum info for scheduling
|
||||||
|
@ -179,23 +179,19 @@ void SelectionDAG::RemoveDeadNodes(SDNode *N) {
|
|||||||
MadeChange = true;
|
MadeChange = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned i = 0, e = AllNodes.size(); i != e; ++i) {
|
for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ++I)
|
||||||
// Try to delete this node.
|
if (I->use_empty() && I->getOpcode() != 65535) {
|
||||||
SDNode *N = AllNodes[i];
|
// Node is dead, recursively delete newly dead uses.
|
||||||
if (N->use_empty() && N->getOpcode() != 65535) {
|
DestroyDeadNode(I);
|
||||||
DestroyDeadNode(N);
|
|
||||||
MadeChange = true;
|
MadeChange = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Walk the nodes list, removing the nodes we've marked as dead.
|
// Walk the nodes list, removing the nodes we've marked as dead.
|
||||||
if (MadeChange) {
|
if (MadeChange) {
|
||||||
for (unsigned i = 0, e = AllNodes.size(); i != e; ++i)
|
for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ) {
|
||||||
if (AllNodes[i]->use_empty()) {
|
SDNode *N = I++;
|
||||||
delete AllNodes[i];
|
if (N->use_empty())
|
||||||
AllNodes[i] = AllNodes.back();
|
AllNodes.erase(N);
|
||||||
AllNodes.pop_back();
|
|
||||||
--i; --e;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,15 +240,7 @@ void SelectionDAG::DeleteNode(SDNode *N) {
|
|||||||
void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
|
void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
|
||||||
|
|
||||||
// Remove it from the AllNodes list.
|
// Remove it from the AllNodes list.
|
||||||
for (std::vector<SDNode*>::iterator I = AllNodes.begin(); ; ++I) {
|
AllNodes.remove(N);
|
||||||
assert(I != AllNodes.end() && "Node not in AllNodes list??");
|
|
||||||
if (*I == N) {
|
|
||||||
// Erase from the vector, which is not ordered.
|
|
||||||
std::swap(*I, AllNodes.back());
|
|
||||||
AllNodes.pop_back();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Drop all of the operands and decrement used nodes use counts.
|
// Drop all of the operands and decrement used nodes use counts.
|
||||||
for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I)
|
for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I)
|
||||||
@ -431,12 +419,12 @@ SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
|
|||||||
|
|
||||||
|
|
||||||
SelectionDAG::~SelectionDAG() {
|
SelectionDAG::~SelectionDAG() {
|
||||||
for (unsigned i = 0, e = AllNodes.size(); i != e; ++i) {
|
while (!AllNodes.empty()) {
|
||||||
SDNode *N = AllNodes[i];
|
SDNode *N = AllNodes.begin();
|
||||||
delete [] N->OperandList;
|
delete [] N->OperandList;
|
||||||
N->OperandList = 0;
|
N->OperandList = 0;
|
||||||
N->NumOperands = 0;
|
N->NumOperands = 0;
|
||||||
delete N;
|
AllNodes.pop_front();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1838,7 +1826,7 @@ void SDNode::dump(const SelectionDAG *G) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DumpNodes(SDNode *N, unsigned indent, const SelectionDAG *G) {
|
static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) {
|
||||||
for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
|
for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
|
||||||
if (N->getOperand(i).Val->hasOneUse())
|
if (N->getOperand(i).Val->hasOneUse())
|
||||||
DumpNodes(N->getOperand(i).Val, indent+2, G);
|
DumpNodes(N->getOperand(i).Val, indent+2, G);
|
||||||
@ -1853,7 +1841,11 @@ static void DumpNodes(SDNode *N, unsigned indent, const SelectionDAG *G) {
|
|||||||
|
|
||||||
void SelectionDAG::dump() const {
|
void SelectionDAG::dump() const {
|
||||||
std::cerr << "SelectionDAG has " << AllNodes.size() << " nodes:";
|
std::cerr << "SelectionDAG has " << AllNodes.size() << " nodes:";
|
||||||
std::vector<SDNode*> Nodes(AllNodes);
|
std::vector<const SDNode*> Nodes;
|
||||||
|
for (allnodes_const_iterator I = allnodes_begin(), E = allnodes_end();
|
||||||
|
I != E; ++I)
|
||||||
|
Nodes.push_back(I);
|
||||||
|
|
||||||
std::sort(Nodes.begin(), Nodes.end());
|
std::sort(Nodes.begin(), Nodes.end());
|
||||||
|
|
||||||
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user