| //===- HexagonMachineScheduler.cpp - MI Scheduler for Hexagon -------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // MachineScheduler schedules machine instructions after phi elimination. It | |
| // preserves LiveIntervals so it can be invoked before register allocation. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "HexagonMachineScheduler.h" | |
| #include "HexagonInstrInfo.h" | |
| #include "HexagonSubtarget.h" | |
| #include "llvm/CodeGen/MachineScheduler.h" | |
| #include "llvm/CodeGen/ScheduleDAG.h" | |
| #include "llvm/CodeGen/VLIWMachineScheduler.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "machine-scheduler" | |
| /// Return true if there is a dependence between SUd and SUu. | |
| bool HexagonVLIWResourceModel::hasDependence(const SUnit *SUd, | |
| const SUnit *SUu) { | |
| const auto *QII = static_cast<const HexagonInstrInfo *>(TII); | |
| // Enable .cur formation. | |
| if (QII->mayBeCurLoad(*SUd->getInstr())) | |
| return false; | |
| if (QII->canExecuteInBundle(*SUd->getInstr(), *SUu->getInstr())) | |
| return false; | |
| return VLIWResourceModel::hasDependence(SUd, SUu); | |
| } | |
| VLIWResourceModel *HexagonConvergingVLIWScheduler::createVLIWResourceModel( | |
| const TargetSubtargetInfo &STI, const TargetSchedModel *SchedModel) const { | |
| return new HexagonVLIWResourceModel(STI, SchedModel); | |
| } | |
| int HexagonConvergingVLIWScheduler::SchedulingCost(ReadyQueue &Q, SUnit *SU, | |
| SchedCandidate &Candidate, | |
| RegPressureDelta &Delta, | |
| bool verbose) { | |
| int ResCount = | |
| ConvergingVLIWScheduler::SchedulingCost(Q, SU, Candidate, Delta, verbose); | |
| if (!SU || SU->isScheduled) | |
| return ResCount; | |
| auto &QST = DAG->MF.getSubtarget<HexagonSubtarget>(); | |
| auto &QII = *QST.getInstrInfo(); | |
| if (SU->isInstr() && QII.mayBeCurLoad(*SU->getInstr())) { | |
| if (Q.getID() == TopQID && | |
| Top.ResourceModel->isResourceAvailable(SU, true)) { | |
| ResCount += PriorityTwo; | |
| LLVM_DEBUG(if (verbose) dbgs() << "C|"); | |
| } else if (Q.getID() == BotQID && | |
| Bot.ResourceModel->isResourceAvailable(SU, false)) { | |
| ResCount += PriorityTwo; | |
| LLVM_DEBUG(if (verbose) dbgs() << "C|"); | |
| } | |
| } | |
| return ResCount; | |
| } |