forked from OSchip/llvm-project
[Hexagon] Check weak dependences when only 1 instruction is available
Patch by Brendon Cahoon. llvm-svn: 327997
This commit is contained in:
parent
9af71b3875
commit
73be83dec5
|
@ -466,6 +466,10 @@ void ConvergingVLIWScheduler::VLIWSchedBoundary::removeReady(SUnit *SU) {
|
|||
}
|
||||
}
|
||||
|
||||
static unsigned getWeakLeft(const SUnit *SU, bool IsTop) {
|
||||
return (IsTop) ? SU->WeakPredsLeft : SU->WeakSuccsLeft;
|
||||
}
|
||||
|
||||
/// If this queue only has one ready candidate, return it. As a side effect,
|
||||
/// advance the cycle until at least one node is ready. If multiple instructions
|
||||
/// are ready, return NULL.
|
||||
|
@ -473,11 +477,15 @@ SUnit *ConvergingVLIWScheduler::VLIWSchedBoundary::pickOnlyChoice() {
|
|||
if (CheckPending)
|
||||
releasePending();
|
||||
|
||||
for (unsigned i = 0;
|
||||
Available.empty() ||
|
||||
(Available.size() == 1 &&
|
||||
!ResourceModel->isResourceAvailable(*Available.begin(), isTop()));
|
||||
++i) {
|
||||
auto AdvanceCycle = [this]() {
|
||||
if (Available.empty())
|
||||
return true;
|
||||
if (Available.size() == 1 && Pending.size() > 0)
|
||||
return !ResourceModel->isResourceAvailable(*Available.begin(), isTop()) ||
|
||||
getWeakLeft(*Available.begin(), isTop()) != 0;
|
||||
return false;
|
||||
};
|
||||
for (unsigned i = 0; AdvanceCycle(); ++i) {
|
||||
assert(i <= (HazardRec->getMaxLookAhead() + MaxMinLatency) &&
|
||||
"permanent hazard"); (void)i;
|
||||
ResourceModel->reserveResources(nullptr, isTop());
|
||||
|
@ -629,10 +637,6 @@ int ConvergingVLIWScheduler::pressureChange(const SUnit *SU, bool isBotUp) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned getWeakLeft(const SUnit *SU, bool IsTop) {
|
||||
return (IsTop) ? SU->WeakPredsLeft : SU->WeakSuccsLeft;
|
||||
}
|
||||
|
||||
// Constants used to denote relative importance of
|
||||
// heuristic components for cost computation.
|
||||
static const unsigned PriorityOne = 200;
|
||||
|
|
Loading…
Reference in New Issue