OSDN Git Service

[Hexagon] Check weak dependences when only 1 instruction is available
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Tue, 20 Mar 2018 16:22:06 +0000 (16:22 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Tue, 20 Mar 2018 16:22:06 +0000 (16:22 +0000)
Patch by Brendon Cahoon.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327997 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Hexagon/HexagonMachineScheduler.cpp

index 8599c1a..ddf9c4c 100644 (file)
@@ -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;