diff options
author | Dan Gohman <gohman@apple.com> | 2008-12-09 22:54:47 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-12-09 22:54:47 +0000 |
commit | 54e4c36a7349e94a84773afb56eccd4ca65b49e9 (patch) | |
tree | 2fc3528006f5b576a6fb9f03bc2f170b80737687 /lib/CodeGen/ScheduleDAG.cpp | |
parent | 5a45bf1b48cd3d23faa3dfc27b8866bb536c4b9e (diff) |
Rewrite the SDep class, and simplify some of the related code.
The Cost field is removed. It was only being used in a very limited way,
to indicate when the scheduler should attempt to protect a live register,
and it isn't really needed to do that. If we ever want the scheduler to
start inserting copies in non-prohibitive situations, we'll have to
rethink some things anyway.
A Latency field is added. Instead of giving each node a single
fixed latency, each edge can have its own latency. This will eventually
be used to model various micro-architecture properties more accurately.
The PointerIntPair class and an internal union are now used, which
reduce the overall size.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60806 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/ScheduleDAG.cpp')
-rw-r--r-- | lib/CodeGen/ScheduleDAG.cpp | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/lib/CodeGen/ScheduleDAG.cpp b/lib/CodeGen/ScheduleDAG.cpp index 42d0fca76e..809fc8d068 100644 --- a/lib/CodeGen/ScheduleDAG.cpp +++ b/lib/CodeGen/ScheduleDAG.cpp @@ -67,7 +67,7 @@ void ScheduleDAG::CalculateDepths() { // So, just iterate over all predecessors and take the longest path for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); I != E; ++I) { - unsigned PredDepth = I->Dep->Depth; + unsigned PredDepth = I->getSUnit()->Depth; if (PredDepth+1 > SUDepth) { SUDepth = PredDepth + 1; } @@ -78,7 +78,7 @@ void ScheduleDAG::CalculateDepths() { // Update degrees of all nodes depending on current SUnit for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end(); I != E; ++I) { - SUnit *SU = I->Dep; + SUnit *SU = I->getSUnit(); if (!--SU->Depth) // If all dependencies of the node are processed already, // then the longest path for the node can be computed now @@ -122,7 +122,7 @@ void ScheduleDAG::CalculateHeights() { // So, just iterate over all successors and take the longest path for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end(); I != E; ++I) { - unsigned SuccHeight = I->Dep->Height; + unsigned SuccHeight = I->getSUnit()->Height; if (SuccHeight+1 > SUHeight) { SUHeight = SuccHeight + 1; } @@ -133,7 +133,7 @@ void ScheduleDAG::CalculateHeights() { // Update degrees of all nodes depending on current SUnit for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); I != E; ++I) { - SUnit *SU = I->Dep; + SUnit *SU = I->getSUnit(); if (!--SU->Height) // If all dependencies of the node are processed already, // then the longest path for the node can be computed now @@ -183,12 +183,16 @@ void SUnit::dumpAll(const ScheduleDAG *G) const { cerr << " Predecessors:\n"; for (SUnit::const_succ_iterator I = Preds.begin(), E = Preds.end(); I != E; ++I) { - if (I->isCtrl) - cerr << " ch #"; - else - cerr << " val #"; - cerr << I->Dep << " - SU(" << I->Dep->NodeNum << ")"; - if (I->isArtificial) + cerr << " "; + switch (I->getKind()) { + case SDep::Data: cerr << "val "; break; + case SDep::Anti: cerr << "anti"; break; + case SDep::Output: cerr << "out "; break; + case SDep::Order: cerr << "ch "; break; + } + cerr << "#"; + cerr << I->getSUnit() << " - SU(" << I->getSUnit()->NodeNum << ")"; + if (I->isArtificial()) cerr << " *"; cerr << "\n"; } @@ -197,12 +201,16 @@ void SUnit::dumpAll(const ScheduleDAG *G) const { cerr << " Successors:\n"; for (SUnit::const_succ_iterator I = Succs.begin(), E = Succs.end(); I != E; ++I) { - if (I->isCtrl) - cerr << " ch #"; - else - cerr << " val #"; - cerr << I->Dep << " - SU(" << I->Dep->NodeNum << ")"; - if (I->isArtificial) + cerr << " "; + switch (I->getKind()) { + case SDep::Data: cerr << "val "; break; + case SDep::Anti: cerr << "anti"; break; + case SDep::Output: cerr << "out "; break; + case SDep::Order: cerr << "ch "; break; + } + cerr << "#"; + cerr << I->getSUnit() << " - SU(" << I->getSUnit()->NodeNum << ")"; + if (I->isArtificial()) cerr << " *"; cerr << "\n"; } @@ -324,7 +332,7 @@ void ScheduleDAGTopologicalSort::InitDAGTopologicalSorting() { Allocate(SU->NodeNum, --Id); for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); I != E; ++I) { - SUnit *SU = I->Dep; + SUnit *SU = I->getSUnit(); if (!--Node2Index[SU->NodeNum]) // If all dependencies of the node are processed already, // then the node can be computed now. @@ -340,7 +348,7 @@ void ScheduleDAGTopologicalSort::InitDAGTopologicalSorting() { SUnit *SU = &SUnits[i]; for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); I != E; ++I) { - assert(Node2Index[SU->NodeNum] > Node2Index[I->Dep->NodeNum] && + assert(Node2Index[SU->NodeNum] > Node2Index[I->getSUnit()->NodeNum] && "Wrong topological sorting"); } } @@ -386,14 +394,14 @@ void ScheduleDAGTopologicalSort::DFS(const SUnit *SU, int UpperBound, WorkList.pop_back(); Visited.set(SU->NodeNum); for (int I = SU->Succs.size()-1; I >= 0; --I) { - int s = SU->Succs[I].Dep->NodeNum; + int s = SU->Succs[I].getSUnit()->NodeNum; if (Node2Index[s] == UpperBound) { HasLoop = true; return; } // Visit successors if not already and in affected region. if (!Visited.test(s) && Node2Index[s] < UpperBound) { - WorkList.push_back(SU->Succs[I].Dep); + WorkList.push_back(SU->Succs[I].getSUnit()); } } } @@ -434,7 +442,8 @@ bool ScheduleDAGTopologicalSort::WillCreateCycle(SUnit *SU, SUnit *TargetSU) { return true; for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); I != E; ++I) - if (I->Cost < 0 && IsReachable(TargetSU, I->Dep)) + if (I->isAssignedRegDep() && + IsReachable(TargetSU, I->getSUnit())) return true; return false; } |