diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp | 56 |
1 files changed, 19 insertions, 37 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index 7dd8f501aa5..6d6b9c7c0f0 100644 --- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp @@ -60,7 +60,6 @@ static void CheckForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op, SUnit *ScheduleDAG::Clone(SUnit *Old) { SUnit *SU = NewSUnit(Old->getNode()); SU->OrigNode = Old->OrigNode; - SU->FlaggedNodes = Old->FlaggedNodes; SU->Latency = Old->Latency; SU->isTwoAddress = Old->isTwoAddress; SU->isCommutable = Old->isCommutable; @@ -99,23 +98,19 @@ void ScheduleDAG::BuildSchedUnits() { // nodes. Nodes can have at most one flag input and one flag output. Flags // are required the be the last operand and result of a node. - // Scan up, adding flagged preds to FlaggedNodes. + // Scan up to find flagged preds. SDNode *N = NI; if (N->getNumOperands() && N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Flag) { do { N = N->getOperand(N->getNumOperands()-1).getNode(); - NodeSUnit->FlaggedNodes.push_back(N); assert(N->getNodeId() == -1 && "Node already inserted!"); N->setNodeId(NodeSUnit->NodeNum); } while (N->getNumOperands() && N->getOperand(N->getNumOperands()-1).getValueType()== MVT::Flag); - std::reverse(NodeSUnit->FlaggedNodes.begin(), - NodeSUnit->FlaggedNodes.end()); } - // Scan down, adding this node and any flagged succs to FlaggedNodes if they - // have a user of the flag operand. + // Scan down to find any flagged succs. N = NI; while (N->getValueType(N->getNumValues()-1) == MVT::Flag) { SDValue FlagVal(N, N->getNumValues()-1); @@ -126,7 +121,6 @@ void ScheduleDAG::BuildSchedUnits() { UI != E; ++UI) if (FlagVal.isOperandOf(*UI)) { HasFlagUse = true; - NodeSUnit->FlaggedNodes.push_back(N); assert(N->getNodeId() == -1 && "Node already inserted!"); N->setNodeId(NodeSUnit->NodeNum); N = *UI; @@ -135,8 +129,9 @@ void ScheduleDAG::BuildSchedUnits() { if (!HasFlagUse) break; } - // Now all flagged nodes are in FlaggedNodes and N is the bottom-most node. - // Update the SUnit + // If there are flag operands involved, N is now the bottom-most node + // of the sequence of nodes that are flagged together. + // Update the SUnit. NodeSUnit->setNode(N); assert(N->getNodeId() == -1 && "Node already inserted!"); N->setNodeId(NodeSUnit->NodeNum); @@ -163,11 +158,7 @@ void ScheduleDAG::BuildSchedUnits() { } // Find all predecessors and successors of the group. - // Temporarily add N to make code simpler. - SU->FlaggedNodes.push_back(MainNode); - - for (unsigned n = 0, e = SU->FlaggedNodes.size(); n != e; ++n) { - SDNode *N = SU->FlaggedNodes[n]; + for (SDNode *N = SU->getNode(); N; N = N->getFlaggedNode()) { if (N->isMachineOpcode() && TII->get(N->getMachineOpcode()).getImplicitDefs() && CountResults(N) > TII->get(N->getMachineOpcode()).getNumDefs()) @@ -191,9 +182,6 @@ void ScheduleDAG::BuildSchedUnits() { SU->addPred(OpSU, isChain, false, PhysReg, Cost); } } - - // Remove MainNode from FlaggedNodes again. - SU->FlaggedNodes.pop_back(); } } @@ -209,17 +197,9 @@ void ScheduleDAG::ComputeLatency(SUnit *SU) { } SU->Latency = 0; - if (SU->getNode()->isMachineOpcode()) { - unsigned SchedClass = TII->get(SU->getNode()->getMachineOpcode()).getSchedClass(); - const InstrStage *S = InstrItins.begin(SchedClass); - const InstrStage *E = InstrItins.end(SchedClass); - for (; S != E; ++S) - SU->Latency += S->Cycles; - } - for (unsigned i = 0, e = SU->FlaggedNodes.size(); i != e; ++i) { - SDNode *FNode = SU->FlaggedNodes[i]; - if (FNode->isMachineOpcode()) { - unsigned SchedClass = TII->get(FNode->getMachineOpcode()).getSchedClass(); + for (SDNode *N = SU->getNode(); N; N = N->getFlaggedNode()) { + if (N->isMachineOpcode()) { + unsigned SchedClass = TII->get(N->getMachineOpcode()).getSchedClass(); const InstrStage *S = InstrItins.begin(SchedClass); const InstrStage *E = InstrItins.end(SchedClass); for (; S != E; ++S) @@ -397,17 +377,19 @@ void ScheduleDAG::Run() { /// a group of nodes flagged together. void SUnit::dump(const SelectionDAG *G) const { cerr << "SU(" << NodeNum << "): "; - if (Node) - Node->dump(G); + if (getNode()) + getNode()->dump(G); else cerr << "CROSS RC COPY "; cerr << "\n"; - if (FlaggedNodes.size() != 0) { - for (unsigned i = 0, e = FlaggedNodes.size(); i != e; i++) { - cerr << " "; - FlaggedNodes[i]->dump(G); - cerr << "\n"; - } + SmallVector<SDNode *, 4> FlaggedNodes; + for (SDNode *N = getNode()->getFlaggedNode(); N; N = N->getFlaggedNode()) + FlaggedNodes.push_back(N); + while (!FlaggedNodes.empty()) { + cerr << " "; + FlaggedNodes.back()->dump(G); + cerr << "\n"; + FlaggedNodes.pop_back(); } } |