mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-06 20:32:19 +00:00
Make CalcLatency() non-recursive.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43017 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
82f209e421
commit
4859e277f7
@ -443,22 +443,57 @@ int LatencyPriorityQueue::CalcLatency(const SUnit &SU) {
|
|||||||
int &Latency = Latencies[SU.NodeNum];
|
int &Latency = Latencies[SU.NodeNum];
|
||||||
if (Latency != -1)
|
if (Latency != -1)
|
||||||
return Latency;
|
return Latency;
|
||||||
|
|
||||||
int MaxSuccLatency = 0;
|
|
||||||
for (SUnit::const_succ_iterator I = SU.Succs.begin(), E = SU.Succs.end();
|
|
||||||
I != E; ++I)
|
|
||||||
MaxSuccLatency = std::max(MaxSuccLatency, CalcLatency(*I->Dep));
|
|
||||||
|
|
||||||
return Latency = MaxSuccLatency + SU.Latency;
|
std::vector<const SUnit*> WorkList;
|
||||||
|
WorkList.push_back(&SU);
|
||||||
|
while (!WorkList.empty()) {
|
||||||
|
const SUnit *Cur = WorkList.back();
|
||||||
|
bool AllDone = true;
|
||||||
|
int MaxSuccLatency = 0;
|
||||||
|
for (SUnit::const_succ_iterator I = Cur->Succs.begin(),E = Cur->Succs.end();
|
||||||
|
I != E; ++I) {
|
||||||
|
int SuccLatency = Latencies[I->Dep->NodeNum];
|
||||||
|
if (SuccLatency == -1) {
|
||||||
|
AllDone = false;
|
||||||
|
WorkList.push_back(I->Dep);
|
||||||
|
} else {
|
||||||
|
MaxSuccLatency = std::max(MaxSuccLatency, SuccLatency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (AllDone) {
|
||||||
|
Latencies[Cur->NodeNum] = MaxSuccLatency + Cur->Latency;
|
||||||
|
WorkList.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Latency;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// CalculatePriorities - Calculate priorities of all scheduling units.
|
/// CalculatePriorities - Calculate priorities of all scheduling units.
|
||||||
void LatencyPriorityQueue::CalculatePriorities() {
|
void LatencyPriorityQueue::CalculatePriorities() {
|
||||||
Latencies.assign(SUnits->size(), -1);
|
Latencies.assign(SUnits->size(), -1);
|
||||||
NumNodesSolelyBlocking.assign(SUnits->size(), 0);
|
NumNodesSolelyBlocking.assign(SUnits->size(), 0);
|
||||||
|
|
||||||
for (unsigned i = 0, e = SUnits->size(); i != e; ++i)
|
// For each node, calculate the maximal path from the node to the exit.
|
||||||
CalcLatency((*SUnits)[i]);
|
std::vector<std::pair<const SUnit*, unsigned> > WorkList;
|
||||||
|
for (unsigned i = 0, e = SUnits->size(); i != e; ++i) {
|
||||||
|
const SUnit *SU = &(*SUnits)[i];
|
||||||
|
if (SU->Succs.size() == 0)
|
||||||
|
WorkList.push_back(std::make_pair(SU, 0U));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!WorkList.empty()) {
|
||||||
|
const SUnit *SU = WorkList.back().first;
|
||||||
|
unsigned SuccLat = WorkList.back().second;
|
||||||
|
WorkList.pop_back();
|
||||||
|
int &Latency = Latencies[SU->NodeNum];
|
||||||
|
if (Latency == -1 || (SU->Latency + SuccLat) > (unsigned)Latency) {
|
||||||
|
Latency = SU->Latency + SuccLat;
|
||||||
|
for (SUnit::const_pred_iterator I = SU->Preds.begin(),E = SU->Preds.end();
|
||||||
|
I != E; ++I)
|
||||||
|
WorkList.push_back(std::make_pair(I->Dep, Latency));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// getSingleUnscheduledPred - If there is exactly one unscheduled predecessor
|
/// getSingleUnscheduledPred - If there is exactly one unscheduled predecessor
|
||||||
|
Loading…
Reference in New Issue
Block a user