brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · e4cd92a Raw
93 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the MultiHazardRecognizer class, which is a wrapper10// for a set of ScheduleHazardRecognizer instances11//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(MaxLookAhead, R->getMaxLookAhead());25  Recognizers.push_back(std::move(R));26}27 28bool MultiHazardRecognizer::atIssueLimit() const {29  return llvm::any_of(Recognizers,30                      std::mem_fn(&ScheduleHazardRecognizer::atIssueLimit));31}32 33ScheduleHazardRecognizer::HazardType34MultiHazardRecognizer::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, R->PreEmitNoops(SU));61  };62  return std::accumulate(Recognizers.begin(), Recognizers.end(), 0u, MN);63}64 65unsigned MultiHazardRecognizer::PreEmitNoops(MachineInstr *MI) {66  auto MN = [=](unsigned a, std::unique_ptr<ScheduleHazardRecognizer> &R) {67    return std::max(a, R->PreEmitNoops(MI));68  };69  return std::accumulate(Recognizers.begin(), Recognizers.end(), 0u, 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(Recognizers, 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