Changes in directory llvm/lib/CodeGen/SelectionDAG:
ScheduleDAGList.cpp updated: 1.28 -> 1.29 --- Log message: Pull latency information for target instructions out of the latency tables. :) Only enable this with -use-sched-latencies, I'll enable it by default with a clean nightly tester run tonight. PPC is the only target that provides latency info currently. --- Diffs of the changes: (+80 -46) ScheduleDAGList.cpp | 126 +++++++++++++++++++++++++++++++++------------------- 1 files changed, 80 insertions(+), 46 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.28 llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.29 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.28 Thu Mar 9 00:48:37 2006 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp Thu Mar 9 01:15:18 2006 @@ -29,9 +29,12 @@ #include <queue> #include <set> #include <vector> +#include "llvm/Support/CommandLine.h" using namespace llvm; namespace { + // FIXME: UseLatencies is temporary. + cl::opt<bool> UseLatencies("use-sched-latencies"); Statistic<> NumNoops ("scheduler", "Number of noops inserted"); Statistic<> NumStalls("scheduler", "Number of pipeline stalls"); @@ -60,11 +63,12 @@ isTwoAddress(false), isDefNUseOperand(false), Latency(0), CycleBound(0), NodeNum(nodenum) {} - void dump(const SelectionDAG *G, bool All=true) const; + void dump(const SelectionDAG *G) const; + void dumpAll(const SelectionDAG *G) const; }; } -void SUnit::dump(const SelectionDAG *G, bool All) const { +void SUnit::dump(const SelectionDAG *G) const { std::cerr << "SU: "; Node->dump(G); std::cerr << "\n"; @@ -75,47 +79,50 @@ std::cerr << "\n"; } } +} - if (All) { - std::cerr << " # preds left : " << NumPredsLeft << "\n"; - std::cerr << " # succs left : " << NumSuccsLeft << "\n"; - std::cerr << " # chain preds left : " << NumChainPredsLeft << "\n"; - std::cerr << " # chain succs left : " << NumChainSuccsLeft << "\n"; - std::cerr << " Latency : " << Latency << "\n"; - - if (Preds.size() != 0) { - std::cerr << " Predecessors:\n"; - for (std::set<SUnit*>::const_iterator I = Preds.begin(), - E = Preds.end(); I != E; ++I) { - std::cerr << " "; - (*I)->dump(G, false); - } +void SUnit::dumpAll(const SelectionDAG *G) const { + dump(G); + + std::cerr << " # preds left : " << NumPredsLeft << "\n"; + std::cerr << " # succs left : " << NumSuccsLeft << "\n"; + std::cerr << " # chain preds left : " << NumChainPredsLeft << "\n"; + std::cerr << " # chain succs left : " << NumChainSuccsLeft << "\n"; + std::cerr << " Latency : " << Latency << "\n"; + + if (Preds.size() != 0) { + std::cerr << " Predecessors:\n"; + for (std::set<SUnit*>::const_iterator I = Preds.begin(), + E = Preds.end(); I != E; ++I) { + std::cerr << " "; + (*I)->dump(G); } - if (ChainPreds.size() != 0) { - std::cerr << " Chained Preds:\n"; - for (std::set<SUnit*>::const_iterator I = ChainPreds.begin(), - E = ChainPreds.end(); I != E; ++I) { - std::cerr << " "; - (*I)->dump(G, false); - } + } + if (ChainPreds.size() != 0) { + std::cerr << " Chained Preds:\n"; + for (std::set<SUnit*>::const_iterator I = ChainPreds.begin(), + E = ChainPreds.end(); I != E; ++I) { + std::cerr << " "; + (*I)->dump(G); } - if (Succs.size() != 0) { - std::cerr << " Successors:\n"; - for (std::set<SUnit*>::const_iterator I = Succs.begin(), - E = Succs.end(); I != E; ++I) { - std::cerr << " "; - (*I)->dump(G, false); - } + } + if (Succs.size() != 0) { + std::cerr << " Successors:\n"; + for (std::set<SUnit*>::const_iterator I = Succs.begin(), + E = Succs.end(); I != E; ++I) { + std::cerr << " "; + (*I)->dump(G); } - if (ChainSuccs.size() != 0) { - std::cerr << " Chained succs:\n"; - for (std::set<SUnit*>::const_iterator I = ChainSuccs.begin(), - E = ChainSuccs.end(); I != E; ++I) { - std::cerr << " "; - (*I)->dump(G, false); - } + } + if (ChainSuccs.size() != 0) { + std::cerr << " Chained succs:\n"; + for (std::set<SUnit*>::const_iterator I = ChainSuccs.begin(), + E = ChainSuccs.end(); I != E; ++I) { + std::cerr << " "; + (*I)->dump(G); } } + std::cerr << "\n"; } //===----------------------------------------------------------------------===// @@ -186,7 +193,7 @@ void Schedule(); - void dump() const; + void dumpSchedule() const; private: SUnit *NewSUnit(SDNode *N); @@ -272,7 +279,7 @@ /// the Available queue. void ScheduleDAGList::ScheduleNodeBottomUp(SUnit *SU) { DEBUG(std::cerr << "*** Scheduling: "); - DEBUG(SU->dump(&DAG, false)); + DEBUG(SU->dump(&DAG)); Sequence.push_back(SU); @@ -294,7 +301,7 @@ /// the Available queue. void ScheduleDAGList::ScheduleNodeTopDown(SUnit *SU) { DEBUG(std::cerr << "*** Scheduling: "); - DEBUG(SU->dump(&DAG, false)); + DEBUG(SU->dump(&DAG)); Sequence.push_back(SU); @@ -465,6 +472,8 @@ // invalidated. SUnits.reserve(NodeCount); + const InstrItineraryData &InstrItins = TM.getInstrItineraryData(); + // Pass 1: create the SUnit's. for (unsigned i = 0, NC = NodeCount; i < NC; i++) { NodeInfo *NI = &Info[i]; @@ -496,9 +505,32 @@ SU = NewSUnit(N); } SUnitMap[N] = SU; - - // FIXME: assumes uniform latency for now. - SU->Latency = 1; + + // Compute the latency for the node. We use the sum of the latencies for + // all nodes flagged together into this SUnit. + if (InstrItins.isEmpty() || !UseLatencies) { + // No latency information. + SU->Latency = 1; + } else { + SU->Latency = 0; + if (N->isTargetOpcode()) { + unsigned SchedClass = TII->getSchedClass(N->getTargetOpcode()); + InstrStage *S = InstrItins.begin(SchedClass); + 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->isTargetOpcode()) { + unsigned SchedClass = TII->getSchedClass(FNode->getTargetOpcode()); + InstrStage *S = InstrItins.begin(SchedClass); + InstrStage *E = InstrItins.end(SchedClass); + for (; S != E; ++S) + SU->Latency += S->Cycles; + } + } + } } // Pass 2: add the preds, succs, etc. @@ -559,6 +591,8 @@ } } } + + DEBUG(SU->dumpAll(&DAG)); } } @@ -579,10 +613,10 @@ } /// dump - dump the schedule. -void ScheduleDAGList::dump() const { +void ScheduleDAGList::dumpSchedule() const { for (unsigned i = 0, e = Sequence.size(); i != e; i++) { if (SUnit *SU = Sequence[i]) - SU->dump(&DAG, false); + SU->dump(&DAG); else std::cerr << "**** NOOP ****\n"; } @@ -608,7 +642,7 @@ PriorityQueue->releaseState(); DEBUG(std::cerr << "*** Final schedule ***\n"); - DEBUG(dump()); + DEBUG(dumpSchedule()); DEBUG(std::cerr << "\n"); // Emit in scheduled order _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits