Lines Matching refs:SU
108 bool VLIWResourceModel::isResourceAvailable(SUnit *SU, bool IsTop) { in isResourceAvailable() argument
109 if (!SU || !SU->getInstr()) in isResourceAvailable()
114 switch (SU->getInstr()->getOpcode()) { in isResourceAvailable()
116 if (!ResourcesModel->canReserveResources(*SU->getInstr())) in isResourceAvailable()
134 if (hasDependence(U, SU)) in isResourceAvailable()
138 if (hasDependence(SU, U)) in isResourceAvailable()
145 bool VLIWResourceModel::reserveResources(SUnit *SU, bool IsTop) { in reserveResources() argument
148 if (!SU) { in reserveResources()
155 if (!isResourceAvailable(SU, IsTop) || in reserveResources()
162 switch (SU->getInstr()->getOpcode()) { in reserveResources()
164 ResourcesModel->reserveResources(*SU->getInstr()); in reserveResources()
179 Packet.push_back(SU); in reserveResources()
222 for (const SUnit &SU : SUnits) in schedule()
223 if (SU.getHeight() > maxH) in schedule()
224 maxH = SU.getHeight(); in schedule()
229 for (const SUnit &SU : SUnits) in schedule()
230 if (SU.getDepth() > maxD) in schedule()
231 maxD = SU.getDepth(); in schedule()
244 SUnit *SU = SchedImpl->pickNode(IsTopNode); in schedule() local
245 if (!SU) in schedule()
251 scheduleMI(SU, IsTopNode); in schedule()
254 SchedImpl->schedNode(SU, IsTopNode); in schedule()
256 updateQueues(SU, IsTopNode); in schedule()
310 void ConvergingVLIWScheduler::releaseTopNode(SUnit *SU) { in releaseTopNode() argument
311 for (const SDep &PI : SU->Preds) { in releaseTopNode()
317 if (SU->TopReadyCycle < PredReadyCycle + MinLatency) in releaseTopNode()
318 SU->TopReadyCycle = PredReadyCycle + MinLatency; in releaseTopNode()
321 if (!SU->isScheduled) in releaseTopNode()
322 Top.releaseNode(SU, SU->TopReadyCycle); in releaseTopNode()
325 void ConvergingVLIWScheduler::releaseBottomNode(SUnit *SU) { in releaseBottomNode() argument
326 assert(SU->getInstr() && "Scheduled SUnit must have instr"); in releaseBottomNode()
328 for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end(); I != E; in releaseBottomNode()
335 if (SU->BotReadyCycle < SuccReadyCycle + MinLatency) in releaseBottomNode()
336 SU->BotReadyCycle = SuccReadyCycle + MinLatency; in releaseBottomNode()
339 if (!SU->isScheduled) in releaseBottomNode()
340 Bot.releaseNode(SU, SU->BotReadyCycle); in releaseBottomNode()
361 bool ConvergingVLIWScheduler::VLIWSchedBoundary::checkHazard(SUnit *SU) { in checkHazard() argument
363 return HazardRec->getHazardType(SU) != ScheduleHazardRecognizer::NoHazard; in checkHazard()
365 unsigned uops = SchedModel->getNumMicroOps(SU->getInstr()); in checkHazard()
373 SUnit *SU, unsigned ReadyCycle) { in releaseNode() argument
379 if (ReadyCycle > CurrCycle || checkHazard(SU)) in releaseNode()
381 Pending.push(SU); in releaseNode()
383 Available.push(SU); in releaseNode()
414 void ConvergingVLIWScheduler::VLIWSchedBoundary::bumpNode(SUnit *SU) { in bumpNode() argument
419 if (!isTop() && SU->isCall) { in bumpNode()
424 HazardRec->EmitInstruction(SU); in bumpNode()
428 startNewCycle = ResourceModel->reserveResources(SU, isTop()); in bumpNode()
432 IssueCount += SchedModel->getNumMicroOps(SU->getInstr()); in bumpNode()
451 SUnit *SU = *(Pending.begin() + i); in releasePending() local
452 unsigned ReadyCycle = isTop() ? SU->TopReadyCycle : SU->BotReadyCycle; in releasePending()
460 if (checkHazard(SU)) in releasePending()
463 Available.push(SU); in releasePending()
472 void ConvergingVLIWScheduler::VLIWSchedBoundary::removeReady(SUnit *SU) { in removeReady() argument
473 if (Available.isInQueue(SU)) in removeReady()
474 Available.remove(Available.find(SU)); in removeReady()
476 assert(Pending.isInQueue(SU) && "bad ready count"); in removeReady()
477 Pending.remove(Pending.find(SU)); in removeReady()
511 const ReadyQueue &Q, SUnit *SU, in traceCandidate() argument
520 DAG->dumpNode(*SU); in traceCandidate()
548 static inline bool isSingleUnscheduledPred(SUnit *SU, SUnit *SU2) { in isSingleUnscheduledPred() argument
549 if (SU->NumPredsLeft == 0) in isSingleUnscheduledPred()
552 for (auto &Pred : SU->Preds) { in isSingleUnscheduledPred()
563 static inline bool isSingleUnscheduledSucc(SUnit *SU, SUnit *SU2) { in isSingleUnscheduledSucc() argument
564 if (SU->NumSuccsLeft == 0) in isSingleUnscheduledSucc()
567 for (auto &Succ : SU->Succs) { in isSingleUnscheduledSucc()
580 int ConvergingVLIWScheduler::pressureChange(const SUnit *SU, bool isBotUp) { in pressureChange() argument
581 PressureDiff &PD = DAG->getPressureDiff(SU); in pressureChange()
596 int ConvergingVLIWScheduler::SchedulingCost(ReadyQueue &Q, SUnit *SU, in SchedulingCost() argument
604 if (!SU || SU->isScheduled) in SchedulingCost()
610 if (SU->isScheduleHigh) { in SchedulingCost()
618 if (Top.isLatencyBound(SU)) { in SchedulingCost()
620 ResCount += (SU->getHeight() * ScaleTwo); in SchedulingCost()
625 dbgstr << "h" << std::setw(3) << SU->getHeight() << "|"; in SchedulingCost()
631 if (Top.ResourceModel->isResourceAvailable(SU, true)) { in SchedulingCost()
638 if (Bot.isLatencyBound(SU)) { in SchedulingCost()
640 ResCount += (SU->getDepth() * ScaleTwo); in SchedulingCost()
645 dbgstr << "d" << std::setw(3) << SU->getDepth() << "|"; in SchedulingCost()
651 if (Bot.ResourceModel->isResourceAvailable(SU, false)) { in SchedulingCost()
665 if (Top.isLatencyBound(SU)) in SchedulingCost()
666 for (const SDep &SI : SU->Succs) in SchedulingCost()
667 if (isSingleUnscheduledPred(SI.getSUnit(), SU)) in SchedulingCost()
671 if (Bot.isLatencyBound(SU)) in SchedulingCost()
672 for (const SDep &PI : SU->Preds) in SchedulingCost()
673 if (isSingleUnscheduledSucc(PI.getSUnit(), SU)) in SchedulingCost()
696 if (IsAvailableAmt && pressureChange(SU, Q.getID() != TopQID) > 0 && in SchedulingCost()
709 if (Q.getID() == TopQID && getWeakLeft(SU, true) == 0) { in SchedulingCost()
710 for (const SDep &PI : SU->Preds) { in SchedulingCost()
718 } else if (Q.getID() == BotQID && getWeakLeft(SU, false) == 0) { in SchedulingCost()
719 for (const SDep &SI : SU->Succs) { in SchedulingCost()
736 for (const auto &PI : SU->Preds) { in SchedulingCost()
744 for (const auto &SI : SU->Succs) { in SchedulingCost()
791 if (!Candidate.SU) { in pickNodeFromQueue()
793 Candidate.SU = *I; in pickNodeFromQueue()
803 if ((Q.getID() == TopQID && (*I)->NodeNum < Candidate.SU->NodeNum) || in pickNodeFromQueue()
804 (Q.getID() == BotQID && (*I)->NodeNum > Candidate.SU->NodeNum)) { in pickNodeFromQueue()
806 Candidate.SU = *I; in pickNodeFromQueue()
817 Candidate.SU = *I; in pickNodeFromQueue()
826 unsigned CandWeak = getWeakLeft(Candidate.SU, (Q.getID() == TopQID)); in pickNodeFromQueue()
830 Candidate.SU = *I; in pickNodeFromQueue()
842 CandSize = Candidate.SU->Succs.size(); in pickNodeFromQueue()
845 CandSize = Candidate.SU->Preds.size(); in pickNodeFromQueue()
849 Candidate.SU = *I; in pickNodeFromQueue()
864 if ((Q.getID() == TopQID && (*I)->NodeNum < Candidate.SU->NodeNum) || in pickNodeFromQueue()
865 (Q.getID() == BotQID && (*I)->NodeNum > Candidate.SU->NodeNum)) { in pickNodeFromQueue()
867 Candidate.SU = *I; in pickNodeFromQueue()
887 if (SUnit *SU = Bot.pickOnlyChoice()) { in pickNodeBidrectional() local
890 return SU; in pickNodeBidrectional()
892 if (SUnit *SU = Top.pickOnlyChoice()) { in pickNodeBidrectional() local
895 return SU; in pickNodeBidrectional()
913 return BotCand.SU; in pickNodeBidrectional()
924 return TopCand.SU; in pickNodeBidrectional()
931 return BotCand.SU; in pickNodeBidrectional()
936 return TopCand.SU; in pickNodeBidrectional()
941 return TopCand.SU; in pickNodeBidrectional()
946 return BotCand.SU; in pickNodeBidrectional()
956 SUnit *SU; in pickNode() local
958 SU = Top.pickOnlyChoice(); in pickNode()
959 if (!SU) { in pickNode()
965 SU = TopCand.SU; in pickNode()
969 SU = Bot.pickOnlyChoice(); in pickNode()
970 if (!SU) { in pickNode()
976 SU = BotCand.SU; in pickNode()
980 SU = pickNodeBidrectional(IsTopNode); in pickNode()
982 if (SU->isTopReady()) in pickNode()
983 Top.removeReady(SU); in pickNode()
984 if (SU->isBottomReady()) in pickNode()
985 Bot.removeReady(SU); in pickNode()
991 DAG->dumpNode(*SU)); in pickNode()
992 return SU; in pickNode()
999 void ConvergingVLIWScheduler::schedNode(SUnit *SU, bool IsTopNode) { in schedNode() argument
1001 Top.bumpNode(SU); in schedNode()
1002 SU->TopReadyCycle = Top.CurrCycle; in schedNode()
1004 Bot.bumpNode(SU); in schedNode()
1005 SU->BotReadyCycle = Bot.CurrCycle; in schedNode()