1//===- MultiHazardRecognizer.cpp - Scheduler Support ----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the MultiHazardRecognizer class, which is a wrapper
10// for a set of ScheduleHazardRecognizer instances
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/CodeGen/MultiHazardRecognizer.h"
15#include "llvm/ADT/STLExtras.h"
16#include <algorithm>
17#include <functional>
18#include <numeric>
19
20using namespace llvm;
21
22void MultiHazardRecognizer::AddHazardRecognizer(
23 std::unique_ptr<ScheduleHazardRecognizer> &&R) {
24 MaxLookAhead = std::max(a: MaxLookAhead, b: R->getMaxLookAhead());
25 Recognizers.push_back(Elt: std::move(R));
26}
27
28bool MultiHazardRecognizer::atIssueLimit() const {
29 return llvm::any_of(Range: Recognizers,
30 P: std::mem_fn(pm: &ScheduleHazardRecognizer::atIssueLimit));
31}
32
33ScheduleHazardRecognizer::HazardType
34MultiHazardRecognizer::getHazardType(SUnit *SU, int Stalls) {
35 for (auto &R : Recognizers) {
36 auto res = R->getHazardType(SU, Stalls);
37 if (res != NoHazard)
38 return res;
39 }
40 return NoHazard;
41}
42
43void MultiHazardRecognizer::Reset() {
44 for (auto &R : Recognizers)
45 R->Reset();
46}
47
48void MultiHazardRecognizer::EmitInstruction(SUnit *SU) {
49 for (auto &R : Recognizers)
50 R->EmitInstruction(SU);
51}
52
53void MultiHazardRecognizer::EmitInstruction(MachineInstr *MI) {
54 for (auto &R : Recognizers)
55 R->EmitInstruction(MI);
56}
57
58unsigned MultiHazardRecognizer::PreEmitNoops(SUnit *SU) {
59 auto MN = [=](unsigned a, std::unique_ptr<ScheduleHazardRecognizer> &R) {
60 return std::max(a: a, b: R->PreEmitNoops(SU));
61 };
62 return std::accumulate(first: Recognizers.begin(), last: Recognizers.end(), init: 0u, binary_op: MN);
63}
64
65unsigned MultiHazardRecognizer::PreEmitNoops(MachineInstr *MI) {
66 auto MN = [=](unsigned a, std::unique_ptr<ScheduleHazardRecognizer> &R) {
67 return std::max(a: a, b: R->PreEmitNoops(MI));
68 };
69 return std::accumulate(first: Recognizers.begin(), last: Recognizers.end(), init: 0u, binary_op: MN);
70}
71
72bool MultiHazardRecognizer::ShouldPreferAnother(SUnit *SU) {
73 auto SPA = [=](std::unique_ptr<ScheduleHazardRecognizer> &R) {
74 return R->ShouldPreferAnother(SU);
75 };
76 return llvm::any_of(Range&: Recognizers, P: SPA);
77}
78
79void MultiHazardRecognizer::AdvanceCycle() {
80 for (auto &R : Recognizers)
81 R->AdvanceCycle();
82}
83
84void MultiHazardRecognizer::RecedeCycle() {
85 for (auto &R : Recognizers)
86 R->RecedeCycle();
87}
88
89void MultiHazardRecognizer::EmitNoop() {
90 for (auto &R : Recognizers)
91 R->EmitNoop();
92}
93