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