xref: /llvm-project/llvm/lib/CodeGen/MultiHazardRecognizer.cpp (revision df812115e3ca9741f094a8102325cb2351868b48)
161bc18deSDavid Green //===- MultiHazardRecognizer.cpp - Scheduler Support ----------------------===//
261bc18deSDavid Green //
361bc18deSDavid Green // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
461bc18deSDavid Green // See https://llvm.org/LICENSE.txt for license information.
561bc18deSDavid Green // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
661bc18deSDavid Green //
761bc18deSDavid Green //===----------------------------------------------------------------------===//
861bc18deSDavid Green //
961bc18deSDavid Green // This file implements the MultiHazardRecognizer class, which is a wrapper
1061bc18deSDavid Green // for a set of ScheduleHazardRecognizer instances
1161bc18deSDavid Green //
1261bc18deSDavid Green //===----------------------------------------------------------------------===//
1361bc18deSDavid Green 
1461bc18deSDavid Green #include "llvm/CodeGen/MultiHazardRecognizer.h"
15*df812115SKazu Hirata #include "llvm/ADT/STLExtras.h"
1661bc18deSDavid Green #include <algorithm>
1761bc18deSDavid Green #include <functional>
1861bc18deSDavid Green #include <numeric>
1961bc18deSDavid Green 
2061bc18deSDavid Green using namespace llvm;
2161bc18deSDavid Green 
AddHazardRecognizer(std::unique_ptr<ScheduleHazardRecognizer> && R)2261bc18deSDavid Green void MultiHazardRecognizer::AddHazardRecognizer(
2361bc18deSDavid Green     std::unique_ptr<ScheduleHazardRecognizer> &&R) {
2461bc18deSDavid Green   MaxLookAhead = std::max(MaxLookAhead, R->getMaxLookAhead());
2561bc18deSDavid Green   Recognizers.push_back(std::move(R));
2661bc18deSDavid Green }
2761bc18deSDavid Green 
atIssueLimit() const2861bc18deSDavid Green bool MultiHazardRecognizer::atIssueLimit() const {
29*df812115SKazu Hirata   return llvm::any_of(Recognizers,
3061bc18deSDavid Green                       std::mem_fn(&ScheduleHazardRecognizer::atIssueLimit));
3161bc18deSDavid Green }
3261bc18deSDavid Green 
3361bc18deSDavid Green ScheduleHazardRecognizer::HazardType
getHazardType(SUnit * SU,int Stalls)3461bc18deSDavid Green MultiHazardRecognizer::getHazardType(SUnit *SU, int Stalls) {
3561bc18deSDavid Green   for (auto &R : Recognizers) {
3661bc18deSDavid Green     auto res = R->getHazardType(SU, Stalls);
3761bc18deSDavid Green     if (res != NoHazard)
3861bc18deSDavid Green       return res;
3961bc18deSDavid Green   }
4061bc18deSDavid Green   return NoHazard;
4161bc18deSDavid Green }
4261bc18deSDavid Green 
Reset()4361bc18deSDavid Green void MultiHazardRecognizer::Reset() {
4461bc18deSDavid Green   for (auto &R : Recognizers)
4561bc18deSDavid Green     R->Reset();
4661bc18deSDavid Green }
4761bc18deSDavid Green 
EmitInstruction(SUnit * SU)4861bc18deSDavid Green void MultiHazardRecognizer::EmitInstruction(SUnit *SU) {
4961bc18deSDavid Green   for (auto &R : Recognizers)
5061bc18deSDavid Green     R->EmitInstruction(SU);
5161bc18deSDavid Green }
5261bc18deSDavid Green 
EmitInstruction(MachineInstr * MI)5361bc18deSDavid Green void MultiHazardRecognizer::EmitInstruction(MachineInstr *MI) {
5461bc18deSDavid Green   for (auto &R : Recognizers)
5561bc18deSDavid Green     R->EmitInstruction(MI);
5661bc18deSDavid Green }
5761bc18deSDavid Green 
PreEmitNoops(SUnit * SU)5861bc18deSDavid Green unsigned MultiHazardRecognizer::PreEmitNoops(SUnit *SU) {
5961bc18deSDavid Green   auto MN = [=](unsigned a, std::unique_ptr<ScheduleHazardRecognizer> &R) {
6061bc18deSDavid Green     return std::max(a, R->PreEmitNoops(SU));
6161bc18deSDavid Green   };
6261bc18deSDavid Green   return std::accumulate(Recognizers.begin(), Recognizers.end(), 0u, MN);
6361bc18deSDavid Green }
6461bc18deSDavid Green 
PreEmitNoops(MachineInstr * MI)6561bc18deSDavid Green unsigned MultiHazardRecognizer::PreEmitNoops(MachineInstr *MI) {
6661bc18deSDavid Green   auto MN = [=](unsigned a, std::unique_ptr<ScheduleHazardRecognizer> &R) {
6761bc18deSDavid Green     return std::max(a, R->PreEmitNoops(MI));
6861bc18deSDavid Green   };
6961bc18deSDavid Green   return std::accumulate(Recognizers.begin(), Recognizers.end(), 0u, MN);
7061bc18deSDavid Green }
7161bc18deSDavid Green 
ShouldPreferAnother(SUnit * SU)7261bc18deSDavid Green bool MultiHazardRecognizer::ShouldPreferAnother(SUnit *SU) {
7361bc18deSDavid Green   auto SPA = [=](std::unique_ptr<ScheduleHazardRecognizer> &R) {
7461bc18deSDavid Green     return R->ShouldPreferAnother(SU);
7561bc18deSDavid Green   };
76*df812115SKazu Hirata   return llvm::any_of(Recognizers, SPA);
7761bc18deSDavid Green }
7861bc18deSDavid Green 
AdvanceCycle()7961bc18deSDavid Green void MultiHazardRecognizer::AdvanceCycle() {
8061bc18deSDavid Green   for (auto &R : Recognizers)
8161bc18deSDavid Green     R->AdvanceCycle();
8261bc18deSDavid Green }
8361bc18deSDavid Green 
RecedeCycle()8461bc18deSDavid Green void MultiHazardRecognizer::RecedeCycle() {
8561bc18deSDavid Green   for (auto &R : Recognizers)
8661bc18deSDavid Green     R->RecedeCycle();
8761bc18deSDavid Green }
8861bc18deSDavid Green 
EmitNoop()8961bc18deSDavid Green void MultiHazardRecognizer::EmitNoop() {
9061bc18deSDavid Green   for (auto &R : Recognizers)
9161bc18deSDavid Green     R->EmitNoop();
9261bc18deSDavid Green }
93