diff options
author | David Goodwin <david_goodwin@apple.com> | 2009-08-12 21:47:46 +0000 |
---|---|---|
committer | David Goodwin <david_goodwin@apple.com> | 2009-08-12 21:47:46 +0000 |
commit | 2ffb0ce7dce2d5c243b90493807308af6fab0528 (patch) | |
tree | e7e8b09639babc68dd1319b98150ab867ba90699 | |
parent | 755cbe0db1d59811d9302f035d4ef6a8f4db9222 (diff) | |
download | external_llvm-2ffb0ce7dce2d5c243b90493807308af6fab0528.zip external_llvm-2ffb0ce7dce2d5c243b90493807308af6fab0528.tar.gz external_llvm-2ffb0ce7dce2d5c243b90493807308af6fab0528.tar.bz2 |
Fix counting of Post-RA scheduling stalls. Improve debug output.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78843 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/PostRASchedulerList.cpp | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/lib/CodeGen/PostRASchedulerList.cpp b/lib/CodeGen/PostRASchedulerList.cpp index f3dfb01..320e6b4 100644 --- a/lib/CodeGen/PostRASchedulerList.cpp +++ b/lib/CodeGen/PostRASchedulerList.cpp @@ -823,6 +823,10 @@ void SchedulePostRATDList::ListScheduleTopDown() { } } + // In any cycle where we can't schedule any instructions, we must + // stall or emit a noop, depending on the target. + bool CycleInstCnt = 0; + // While Available queue is not empty, grab the node with the highest // priority. If it is not ready put it back. Schedule the node. std::vector<SUnit*> NotReady; @@ -879,6 +883,7 @@ void SchedulePostRATDList::ListScheduleTopDown() { if (FoundSUnit) { ScheduleNodeTopDown(FoundSUnit, CurCycle); HazardRec->EmitInstruction(FoundSUnit); + CycleInstCnt++; // If we are using the target-specific hazards, then don't // advance the cycle time just because we schedule a node. If @@ -888,22 +893,28 @@ void SchedulePostRATDList::ListScheduleTopDown() { if (FoundSUnit->Latency) // Don't increment CurCycle for pseudo-ops! ++CurCycle; } - } else if (!HasNoopHazards) { - // Otherwise, we have a pipeline stall, but no other problem, just advance - // the current cycle and try again. - DEBUG(errs() << "*** Advancing cycle, no work to do\n"); - HazardRec->AdvanceCycle(); - ++NumStalls; - ++CurCycle; } else { - // Otherwise, we have no instructions to issue and we have instructions - // that will fault if we don't do this right. This is the case for - // processors without pipeline interlocks and other cases. - DEBUG(errs() << "*** Emitting noop\n"); - HazardRec->EmitNoop(); - Sequence.push_back(0); // NULL here means noop - ++NumNoops; + if (CycleInstCnt > 0) { + DEBUG(errs() << "*** Finished cycle " << CurCycle << '\n'); + HazardRec->AdvanceCycle(); + } else if (!HasNoopHazards) { + // Otherwise, we have a pipeline stall, but no other problem, + // just advance the current cycle and try again. + DEBUG(errs() << "*** Stall in cycle " << CurCycle << '\n'); + HazardRec->AdvanceCycle(); + ++NumStalls; + } else { + // Otherwise, we have no instructions to issue and we have instructions + // that will fault if we don't do this right. This is the case for + // processors without pipeline interlocks and other cases. + DEBUG(errs() << "*** Emitting noop in cycle " << CurCycle << '\n'); + HazardRec->EmitNoop(); + Sequence.push_back(0); // NULL here means noop + ++NumNoops; + } + ++CurCycle; + CycleInstCnt = 0; } } |