diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/WindowScheduler.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/WindowScheduler.cpp | 29 | 
1 files changed, 18 insertions, 11 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/WindowScheduler.cpp b/contrib/llvm-project/llvm/lib/CodeGen/WindowScheduler.cpp index 0777480499e5..f1658e36ae1e 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/WindowScheduler.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/WindowScheduler.cpp @@ -232,8 +232,11 @@ bool WindowScheduler::initialize() {        return false;      }      for (auto &Def : MI.all_defs()) -      if (Def.isReg() && Def.getReg().isPhysical()) +      if (Def.isReg() && Def.getReg().isPhysical()) { +        LLVM_DEBUG(dbgs() << "Physical registers are not supported in " +                             "window scheduling!\n");          return false; +      }    }    if (SchedInstrNum <= WindowRegionLimit) {      LLVM_DEBUG(dbgs() << "There are too few MIs in the window region!\n"); @@ -437,14 +440,17 @@ int WindowScheduler::calculateMaxCycle(ScheduleDAGInstrs &DAG,        int PredCycle = getOriCycle(PredMI);        ExpectCycle = std::max(ExpectCycle, PredCycle + (int)Pred.getLatency());      } -    // ResourceManager can be used to detect resource conflicts between the -    // current MI and the previously inserted MIs. -    while (!RM.canReserveResources(*SU, CurCycle) || CurCycle < ExpectCycle) { -      ++CurCycle; -      if (CurCycle == (int)WindowIILimit) -        return CurCycle; +    // Zero cost instructions do not need to check resource. +    if (!TII->isZeroCost(MI.getOpcode())) { +      // ResourceManager can be used to detect resource conflicts between the +      // current MI and the previously inserted MIs. +      while (!RM.canReserveResources(*SU, CurCycle) || CurCycle < ExpectCycle) { +        ++CurCycle; +        if (CurCycle == (int)WindowIILimit) +          return CurCycle; +      } +      RM.reserveResources(*SU, CurCycle);      } -    RM.reserveResources(*SU, CurCycle);      OriToCycle[getOriMI(&MI)] = CurCycle;      LLVM_DEBUG(dbgs() << "\tCycle " << CurCycle << " [S."                        << getOriStage(getOriMI(&MI), Offset) << "]: " << MI); @@ -485,6 +491,7 @@ int WindowScheduler::calculateMaxCycle(ScheduleDAGInstrs &DAG,  // ========================================  int WindowScheduler::calculateStallCycle(unsigned Offset, int MaxCycle) {    int MaxStallCycle = 0; +  int CurrentII = MaxCycle + 1;    auto Range = getScheduleRange(Offset, SchedInstrNum);    for (auto &MI : Range) {      auto *SU = TripleDAG->getSUnit(&MI); @@ -492,8 +499,8 @@ int WindowScheduler::calculateStallCycle(unsigned Offset, int MaxCycle) {      for (auto &Succ : SU->Succs) {        if (Succ.isWeak() || Succ.getSUnit() == &TripleDAG->ExitSU)          continue; -      // If the expected cycle does not exceed MaxCycle, no check is needed. -      if (DefCycle + (int)Succ.getLatency() <= MaxCycle) +      // If the expected cycle does not exceed CurrentII, no check is needed. +      if (DefCycle + (int)Succ.getLatency() <= CurrentII)          continue;        // If the cycle of the scheduled MI A is less than that of the scheduled        // MI B, the scheduling will fail because the lifetime of the @@ -503,7 +510,7 @@ int WindowScheduler::calculateStallCycle(unsigned Offset, int MaxCycle) {        if (DefCycle < UseCycle)          return WindowIILimit;        // Get the stall cycle introduced by the register between two trips. -      int StallCycle = DefCycle + (int)Succ.getLatency() - MaxCycle - UseCycle; +      int StallCycle = DefCycle + (int)Succ.getLatency() - CurrentII - UseCycle;        MaxStallCycle = std::max(MaxStallCycle, StallCycle);      }    }  | 
