From: Krzysztof Parzyszek Date: Tue, 20 Mar 2018 16:22:06 +0000 (+0000) Subject: [Hexagon] Check weak dependences when only 1 instruction is available X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=73be83dec5e4efa3f799c50f6bd95a9f4de99113;p=platform%2Fupstream%2Fllvm.git [Hexagon] Check weak dependences when only 1 instruction is available Patch by Brendon Cahoon. llvm-svn: 327997 --- diff --git a/llvm/lib/Target/Hexagon/HexagonMachineScheduler.cpp b/llvm/lib/Target/Hexagon/HexagonMachineScheduler.cpp index 8599c1a..ddf9c4c 100644 --- a/llvm/lib/Target/Hexagon/HexagonMachineScheduler.cpp +++ b/llvm/lib/Target/Hexagon/HexagonMachineScheduler.cpp @@ -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;